From 697ba9bd4b5e9d5835f03c16ffb555cab458adad Mon Sep 17 00:00:00 2001 From: Auto Gen Date: Fri, 26 Sep 2025 16:46:48 -0700 Subject: [PATCH 01/52] initial commit --- codegen2/README.md | 11 + codegen2/codegen.sln | 61 +++++ codegen2/eval/.gitignore | 4 + .../CommandComplexSchemas.TD.json | 111 ++++++++ .../CounterCollection.TD.json | 141 ++++++++++ .../PropertySeparate/PropertySeparate.TD.json | 212 +++++++++++++++ .../PropertyTogether/PropertyTogether.TD.json | 228 ++++++++++++++++ codegen2/eval/SchemaNames.json | 69 +++++ .../TelemetryComplexSchemas.TD.json | 181 ++++++++++++ codegen2/eval/diffschemas.sh | 5 + codegen2/eval/genschemas.sh | 18 ++ codegen2/eval/gentypes.sh | 33 +++ ...Azure.Iot.Operations.CodeGeneration.csproj | 12 + .../CodeName.cs | 257 ++++++++++++++++++ .../CustomTypeName.cs | 55 ++++ .../EmptyTypeName.cs | 146 ++++++++++ .../FormInfo.cs | 58 ++++ .../FuncInfo.cs | 16 ++ .../ITypeName.cs | 9 + .../ReservedCSharp.cs | 133 +++++++++ .../ReservedRust.cs | 67 +++++ .../SchemaNameInfo.cs | 76 ++++++ .../SchemaNamer.cs | 81 ++++++ .../SerializationFormat.cs | 8 + .../TDValues.cs | 60 ++++ .../TargetLanguage.cs | 8 + .../.gitignore | 1 + .../ActionSchemaGenerator.cs | 90 ++++++ ...zure.Iot.Operations.SchemaGenerator.csproj | 57 ++++ .../EnumSpec.cs | 23 ++ .../EventSchemaGenerator.cs | 88 ++++++ .../FieldSpec.cs | 41 +++ .../GeneratedSchema.cs | 4 + .../ISchemaTemplateTransform.cs | 11 + .../ObjectSpec.cs | 38 +++ .../PropertySchemaGenerator.cs | 242 +++++++++++++++++ .../SchemaGenerationSupport.cs | 19 ++ .../SchemaGenerator.cs | 168 ++++++++++++ .../SchemaSpec.cs | 28 ++ .../SchemaTransformFactory.cs | 36 +++ .../free/code/ConstSchema.cs | 25 ++ .../free/t4/ConstSchema.tt | 8 + .../json/JsonSchemaSupport.cs | 56 ++++ .../json/code/EnumJsonSchema.cs | 20 ++ .../json/code/ObjectJsonSchema.cs | 20 ++ .../json/t4/EnumJsonSchema.tt | 16 ++ .../json/t4/ObjectJsonSchema.tt | 27 ++ .../Azure.Iot.Operations.TDParser.csproj | 8 + .../Model/TDAction.cs | 26 ++ .../Model/TDAdditionalPropSpecifier.cs | 71 +++++ .../Model/TDContextSpecifier.cs | 62 +++++ .../Model/TDDataSchema.cs | 83 ++++++ .../Model/TDEvent.cs | 20 ++ .../Model/TDForm.cs | 31 +++ .../Model/TDLink.cs | 16 ++ .../Model/TDProperty.cs | 16 ++ .../Model/TDSchemaReference.cs | 16 ++ .../Model/TDThing.cs | 35 +++ .../Azure.Iot.Operations.TDParser/TDParser.cs | 23 ++ .../.gitignore | 1 + .../Azure.Iot.Operations.TypeGenerator.csproj | 66 +++++ .../DotNetTypeGenerator.cs | 21 ++ .../GeneratedType.cs | 4 + .../ISchemaStandardizer.cs | 12 + .../ITypeGenerator.cs | 10 + .../ITypeTemplateTransform.cs | 11 + .../JsonSchemaStandardizer.cs | 208 ++++++++++++++ .../RustTypeGenerator.cs | 21 ++ .../TypeGenerator.cs | 40 +++ .../TypeGeneratorSupport.cs | 36 +++ .../common/ArrayType.cs | 14 + .../common/BooleanType.cs | 11 + .../common/ByteType.cs | 11 + .../common/BytesType.cs | 11 + .../common/DateTimeType.cs | 11 + .../common/DateType.cs | 11 + .../common/DecimalType.cs | 11 + .../common/DoubleType.cs | 11 + .../common/DurationType.cs | 11 + .../common/EnumType.cs | 25 ++ .../common/FloatType.cs | 11 + .../common/IntegerType.cs | 11 + .../common/LongType.cs | 11 + .../common/MapType.cs | 17 ++ .../common/ObjectType.cs | 48 ++++ .../common/ReferenceType.cs | 40 +++ .../common/SchemaKind.cs | 31 +++ .../common/SchemaType.cs | 7 + .../common/ShortType.cs | 11 + .../common/StringType.cs | 11 + .../common/TimeType.cs | 11 + .../common/UnsignedByteType.cs | 11 + .../common/UnsignedIntegerType.cs | 11 + .../common/UnsignedLongType.cs | 11 + .../common/UnsignedShortType.cs | 11 + .../common/UuidType.cs | 11 + .../dotnet/DotNetSchemaSupport.cs | 55 ++++ .../dotnet/code/DotNetEnum.cs | 20 ++ .../dotnet/code/DotNetObject.cs | 28 ++ .../dotnet/t4/DotNetEnum.tt | 26 ++ .../dotnet/t4/DotNetObject.tt | 79 ++++++ .../rust/RustSchemaSupport.cs | 54 ++++ .../rust/code/RustEnum.cs | 18 ++ .../rust/code/RustObject.cs | 23 ++ .../rust/t4/RustEnum.tt | 15 + .../rust/t4/RustObject.tt | 50 ++++ codegen2/src/SchemaTester/Program.cs | 63 +++++ codegen2/src/SchemaTester/SchemaTester.csproj | 14 + codegen2/src/TDParse/Program.cs | 93 +++++++ codegen2/src/TDParse/TDParse.csproj | 13 + codegen2/src/TypeTester/Program.cs | 62 +++++ codegen2/src/TypeTester/TypeTester.csproj | 13 + 112 files changed, 4932 insertions(+) create mode 100644 codegen2/README.md create mode 100644 codegen2/codegen.sln create mode 100644 codegen2/eval/.gitignore create mode 100644 codegen2/eval/CommandComplexSchemas/CommandComplexSchemas.TD.json create mode 100644 codegen2/eval/CounterCollection/CounterCollection.TD.json create mode 100644 codegen2/eval/PropertySeparate/PropertySeparate.TD.json create mode 100644 codegen2/eval/PropertyTogether/PropertyTogether.TD.json create mode 100644 codegen2/eval/SchemaNames.json create mode 100644 codegen2/eval/TelemetryComplexSchemas/TelemetryComplexSchemas.TD.json create mode 100644 codegen2/eval/diffschemas.sh create mode 100644 codegen2/eval/genschemas.sh create mode 100644 codegen2/eval/gentypes.sh create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/Azure.Iot.Operations.CodeGeneration.csproj create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/CodeName.cs create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/CustomTypeName.cs create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/EmptyTypeName.cs create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/FormInfo.cs create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/FuncInfo.cs create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/ITypeName.cs create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/ReservedCSharp.cs create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/ReservedRust.cs create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNameInfo.cs create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNamer.cs create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/SerializationFormat.cs create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/TDValues.cs create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/TargetLanguage.cs create mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/.gitignore create mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs create mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/Azure.Iot.Operations.SchemaGenerator.csproj create mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/EnumSpec.cs create mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/EventSchemaGenerator.cs create mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/FieldSpec.cs create mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/GeneratedSchema.cs create mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/ISchemaTemplateTransform.cs create mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/ObjectSpec.cs create mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/PropertySchemaGenerator.cs create mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerationSupport.cs create mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs create mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaSpec.cs create mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaTransformFactory.cs create mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/free/code/ConstSchema.cs create mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/free/t4/ConstSchema.tt create mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs create mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/EnumJsonSchema.cs create mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/ObjectJsonSchema.cs create mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/EnumJsonSchema.tt create mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/ObjectJsonSchema.tt create mode 100644 codegen2/src/Azure.Iot.Operations.TDParser/Azure.Iot.Operations.TDParser.csproj create mode 100644 codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAction.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAdditionalPropSpecifier.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TDParser/Model/TDContextSpecifier.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TDParser/Model/TDEvent.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TDParser/Model/TDForm.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TDParser/Model/TDLink.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TDParser/Model/TDProperty.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TDParser/Model/TDSchemaReference.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TDParser/Model/TDThing.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TDParser/TDParser.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/.gitignore create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/Azure.Iot.Operations.TypeGenerator.csproj create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/DotNetTypeGenerator.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/GeneratedType.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/ISchemaStandardizer.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/ITypeGenerator.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/ITypeTemplateTransform.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/RustTypeGenerator.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/TypeGenerator.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/TypeGeneratorSupport.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ArrayType.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/common/BooleanType.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ByteType.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/common/BytesType.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DateTimeType.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DateType.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DecimalType.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DoubleType.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DurationType.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/common/EnumType.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/common/FloatType.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/common/IntegerType.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/common/LongType.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/common/MapType.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ObjectType.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ReferenceType.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/common/SchemaKind.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/common/SchemaType.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ShortType.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/common/StringType.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/common/TimeType.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedByteType.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedIntegerType.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedLongType.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedShortType.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UuidType.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/DotNetSchemaSupport.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/code/DotNetEnum.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/code/DotNetObject.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetEnum.tt create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetObject.tt create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/RustSchemaSupport.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/code/RustEnum.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/code/RustObject.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustEnum.tt create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustObject.tt create mode 100644 codegen2/src/SchemaTester/Program.cs create mode 100644 codegen2/src/SchemaTester/SchemaTester.csproj create mode 100644 codegen2/src/TDParse/Program.cs create mode 100644 codegen2/src/TDParse/TDParse.csproj create mode 100644 codegen2/src/TypeTester/Program.cs create mode 100644 codegen2/src/TypeTester/TypeTester.csproj diff --git a/codegen2/README.md b/codegen2/README.md new file mode 100644 index 0000000000..20aa9fbd01 --- /dev/null +++ b/codegen2/README.md @@ -0,0 +1,11 @@ +# codegen2 + +This folder contains the beginnings of a fork of the `codegen` folder. + +The plan of record is to switch our modeling language from DTDL to WoT. +The largest part of this effort will be changing the ProtocolCompiler to ingest WoT Thing Descriptions instead of DTDL models. + +Rather than attempting to evolve the extant ProtocolCompiler to ingest WoT while preserving its DTDL support for legacy usage, we are starting a new solution for a new ProtocolCompiler. +As the architecture of the new codebase develops, portions of the old ProtocolCompiler will be copied into the new one. + +This folder will contain the new ProtocolCompiler while it is under development. diff --git a/codegen2/codegen.sln b/codegen2/codegen.sln new file mode 100644 index 0000000000..755a2489a1 --- /dev/null +++ b/codegen2/codegen.sln @@ -0,0 +1,61 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Azure.Iot.Operations.TDParser", "src\Azure.Iot.Operations.TDParser\Azure.Iot.Operations.TDParser.csproj", "{D100A0D2-9E52-4FF4-8964-C4DE816DC0D5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TDParse", "src\TDParse\TDParse.csproj", "{9F1A48E4-A681-4FCF-B0FF-1ECBF57E614D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Azure.Iot.Operations.CodeGeneration", "src\Azure.Iot.Operations.CodeGeneration\Azure.Iot.Operations.CodeGeneration.csproj", "{FAACC86C-C974-4FE5-B7C4-6C59D7983D82}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Azure.Iot.Operations.TypeGenerator", "src\Azure.Iot.Operations.TypeGenerator\Azure.Iot.Operations.TypeGenerator.csproj", "{6C3D81EA-5950-4AFA-AA0F-75EBFB5C1732}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TypeTester", "src\TypeTester\TypeTester.csproj", "{F6C35677-73FE-4AAC-BF96-E1AA9641AC9A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Azure.Iot.Operations.SchemaGenerator", "src\Azure.Iot.Operations.SchemaGenerator\Azure.Iot.Operations.SchemaGenerator.csproj", "{AED5A5DA-CA6D-4FC6-B806-050603EF5416}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SchemaTester", "src\SchemaTester\SchemaTester.csproj", "{372B32CC-898F-434B-9BFC-40C90E29DF2F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D100A0D2-9E52-4FF4-8964-C4DE816DC0D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D100A0D2-9E52-4FF4-8964-C4DE816DC0D5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D100A0D2-9E52-4FF4-8964-C4DE816DC0D5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D100A0D2-9E52-4FF4-8964-C4DE816DC0D5}.Release|Any CPU.Build.0 = Release|Any CPU + {9F1A48E4-A681-4FCF-B0FF-1ECBF57E614D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9F1A48E4-A681-4FCF-B0FF-1ECBF57E614D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9F1A48E4-A681-4FCF-B0FF-1ECBF57E614D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9F1A48E4-A681-4FCF-B0FF-1ECBF57E614D}.Release|Any CPU.Build.0 = Release|Any CPU + {FAACC86C-C974-4FE5-B7C4-6C59D7983D82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FAACC86C-C974-4FE5-B7C4-6C59D7983D82}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FAACC86C-C974-4FE5-B7C4-6C59D7983D82}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FAACC86C-C974-4FE5-B7C4-6C59D7983D82}.Release|Any CPU.Build.0 = Release|Any CPU + {6C3D81EA-5950-4AFA-AA0F-75EBFB5C1732}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6C3D81EA-5950-4AFA-AA0F-75EBFB5C1732}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6C3D81EA-5950-4AFA-AA0F-75EBFB5C1732}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6C3D81EA-5950-4AFA-AA0F-75EBFB5C1732}.Release|Any CPU.Build.0 = Release|Any CPU + {F6C35677-73FE-4AAC-BF96-E1AA9641AC9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F6C35677-73FE-4AAC-BF96-E1AA9641AC9A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F6C35677-73FE-4AAC-BF96-E1AA9641AC9A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F6C35677-73FE-4AAC-BF96-E1AA9641AC9A}.Release|Any CPU.Build.0 = Release|Any CPU + {AED5A5DA-CA6D-4FC6-B806-050603EF5416}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AED5A5DA-CA6D-4FC6-B806-050603EF5416}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AED5A5DA-CA6D-4FC6-B806-050603EF5416}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AED5A5DA-CA6D-4FC6-B806-050603EF5416}.Release|Any CPU.Build.0 = Release|Any CPU + {372B32CC-898F-434B-9BFC-40C90E29DF2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {372B32CC-898F-434B-9BFC-40C90E29DF2F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {372B32CC-898F-434B-9BFC-40C90E29DF2F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {372B32CC-898F-434B-9BFC-40C90E29DF2F}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {DBD77462-D0B0-41D2-BC2B-EF17A519C667} + EndGlobalSection +EndGlobal diff --git a/codegen2/eval/.gitignore b/codegen2/eval/.gitignore new file mode 100644 index 0000000000..79e5fb145e --- /dev/null +++ b/codegen2/eval/.gitignore @@ -0,0 +1,4 @@ +**/*.const.json +**/*.schema.json +**/*.g.cs +**/*.rs diff --git a/codegen2/eval/CommandComplexSchemas/CommandComplexSchemas.TD.json b/codegen2/eval/CommandComplexSchemas/CommandComplexSchemas.TD.json new file mode 100644 index 0000000000..152d561294 --- /dev/null +++ b/codegen2/eval/CommandComplexSchemas/CommandComplexSchemas.TD.json @@ -0,0 +1,111 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:jsonTest:CommandComplexSchemas;1", + "title": "CommandComplexSchemas", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "links": [ + { + "rel": "service-desc", + "href": "../SchemaNames.json", + "type": "application/json" + } + ], + "schemaDefinitions": { + "WhenNow": { + "type": "integer", + "const": 1 + }, + "WhenLater": { + "type": "integer", + "const": 2 + } + }, + "actions": { + "doSomething": { + "input": { + "title": "UserInput", + "type": "object", + "dtv:additionalProperties": false, + "required": [ "input" ], + "properties": { + "input": { + "type": "object", + "title": "UserInputProp", + "dtv:additionalProperties": false, + "properties": { + "when": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + }, + "actions": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "output": { + "type": "object", + "description": "The result of the doSomething command.", + "dtv:additionalProperties": false, + "properties": { + "overallResult": { + "title": "ResultValue", + "type": "string", + "enum": [ + "success", + "failure" + ] + }, + "magnitude": { + "type": "string", + "pattern": "^(?:\\+|-)?(?:[1-9][0-9]*|0)(?:\\.[0-9]*)?$" + }, + "nonDetails": { + "type": "object", + "dtv:additionalProperties": { + "type": "string" + } + }, + "details": { + "type": "object", + "dtv:additionalProperties": { + "title": "ResultValue", + "type": "string", + "enum": [ + "success", + "failure" + ] + } + } + } + }, + "forms": [ + { + "href": "dtmi:jsonTest:CommandComplexSchemas:_contents:__doSomething;1", + "contentType": "application/json", + "dtv:topic": "samples/command/doSomething", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/eval/CounterCollection/CounterCollection.TD.json b/codegen2/eval/CounterCollection/CounterCollection.TD.json new file mode 100644 index 0000000000..46eaba4714 --- /dev/null +++ b/codegen2/eval/CounterCollection/CounterCollection.TD.json @@ -0,0 +1,141 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:codegen:communicationTest:counterCollection;1", + "title": "CounterCollection", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "CounterList": { + "type": "object", + "dtv:additionalProperties": false, + "properties": { + "counterNames": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "CounterError": { + "descriptions": { + "en": "The requested counter operation could not be completed." + }, + "type": "object", + "dtv:additionalProperties": false, + "dtv:errorMessage": "explanation", + "properties": { + "explanation": { + "type": "string" + } + } + } + }, + "actions": { + "increment": { + "input": { + "type": "object", + "dtv:additionalProperties": false, + "required": [ "counterName" ], + "properties": { + "counterName": { + "type": "string" + } + } + }, + "output": { + "type": "object", + "dtv:additionalProperties": false, + "required": [ "counterValue" ], + "properties": { + "counterValue": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + } + } + }, + "forms": [ + { + "href": "dtmi:codegen:communicationTest:counterCollection:_contents:__increment;1", + "contentType": "application/json", + "dtv:headerInfo": [ + { + "contentType": "application/json", + "schema": "CounterList" + } + ], + "dtv:headerCode": [ + "counterNotFound", + "counterOverflow" + ], + "dtv:topic": "test/CounterCollection/increment", + "op": "invokeaction" + } + ] + }, + "getLocation": { + "input": { + "type": "object", + "dtv:additionalProperties": false, + "required": [ "counterName" ], + "properties": { + "counterName": { + "type": "string" + } + } + }, + "output": { + "type": "object", + "dtv:additionalProperties": false, + "required": [ "counterLocation" ], + "properties": { + "counterLocation": { + "type": "object", + "dtv:additionalProperties": false, + "required": [ "latitude", "longitude" ], + "properties": { + "latitude": { + "type": "number", + "minimum": -1.80e+308, + "maximum": 1.80e+308 + }, + "longitude": { + "type": "number", + "minimum": -1.80e+308, + "maximum": 1.80e+308 + } + } + } + } + }, + "forms": [ + { + "href": "dtmi:codegen:communicationTest:counterCollection:_contents:__getLocation;1", + "contentType": "application/json", + "additionalResponses": [ + { + "success": false, + "schema": "CounterError" + } + ], + "dtv:topic": "test/CounterCollection/getLocation", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/eval/PropertySeparate/PropertySeparate.TD.json b/codegen2/eval/PropertySeparate/PropertySeparate.TD.json new file mode 100644 index 0000000000..b12399380c --- /dev/null +++ b/codegen2/eval/PropertySeparate/PropertySeparate.TD.json @@ -0,0 +1,212 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:PropertySeparate;1", + "title": "PropertySeparate", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "PropertyError": { + "description": "The requested property read/write could not be completed.", + "type": "object", + "dtv:additionalProperties": false, + "dtv:errorMessage": "explanation", + "properties": { + "explanation": { + "type": "string" + }, + "details": { + "type": "string" + } + } + }, + "MultiWriteErrorRef": { + "title": "MultiWriteError", + "description": "The requested multiple property write could not be completed.", + "type": "object", + "dtv:additionalProperties": false, + "dtv:errorMessage": "explanation", + "properties": { + "explanation": { + "type": "string" + }, + "attemptedWriteCount": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + }, + "failedWriteCount": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + } + } + } + }, + "actions": { + }, + "properties": { + "Alpha": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647, + "readOnly": true, + "forms": [ + { + "href": "dtmi:test:PropertySeparate:_contents:__Alpha;1", + "contentType": "application/json", + "dtv:topic": "test/PropertySeparate/Alpha/read", + "op": "readproperty" + } + ] + }, + "Beta": { + "type": "object", + "title": "Coordinates", + "dtv:additionalProperties": false, + "properties": { + "latitude": { + "type": "number", + "minimum": -1.80e+308, + "maximum": 1.80e+308 + }, + "longitude": { + "type": "number", + "minimum": -1.80e+308, + "maximum": 1.80e+308 + } + }, + "readOnly": false, + "forms": [ + { + "href": "dtmi:test:PropertySeparate:_contents:__Beta;1", + "contentType": "application/json", + "dtv:topic": "test/PropertySeparate/Beta/write", + "op": "writeproperty" + }, + { + "href": "dtmi:test:PropertySeparate:_contents:__Beta;1", + "contentType": "application/json", + "dtv:topic": "test/PropertySeparate/Beta/read", + "op": "readproperty" + } + ] + }, + "Gamma": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647, + "readOnly": true, + "forms": [ + { + "href": "dtmi:test:PropertySeparate:_contents:__Gamma;1", + "contentType": "application/json", + "additionalResponses": [ + { + "success": false, + "schema": "PropertyError" + } + ], + "dtv:topic": "test/PropertySeparate/Gamma/read", + "op": "readproperty" + } + ] + }, + "Delta": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647, + "readOnly": false, + "forms": [ + { + "href": "dtmi:test:PropertySeparate:_contents:__Delta;1", + "contentType": "application/json", + "additionalResponses": [ + { + "success": false, + "schema": "PropertyError" + } + ], + "dtv:topic": "test/PropertySeparate/Delta/write", + "op": "writeproperty" + }, + { + "href": "dtmi:test:PropertySeparate:_contents:__Delta;1", + "contentType": "application/json", + "additionalResponses": [ + { + "success": false, + "schema": "PropertyError" + } + ], + "dtv:topic": "test/PropertySeparate/Delta/read", + "op": "readproperty" + } + ] + }, + "Zeta": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647, + "readOnly": false, + "dtv:placeholder": true, + "forms": [ + { + "href": "dtmi:test:PropertySeparate:_contents:__Zeta;1", + "contentType": "application/json", + "dtv:topic": "test/PropertySeparate/Zeta/write", + "op": "writeproperty" + }, + { + "href": "dtmi:test:PropertySeparate:_contents:__Zeta;1", + "contentType": "application/json", + "dtv:topic": "test/PropertySeparate/Zeta/read", + "op": "readproperty" + } + ] + }, + "Eta": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647, + "readOnly": false, + "dtv:placeholder": true, + "forms": [ + { + "href": "dtmi:test:PropertySeparate:_contents:__Eta;1", + "contentType": "application/json", + "additionalResponses": [ + { + "success": false, + "schema": "MultiWriteErrorRef" + } + ], + "dtv:topic": "test/PropertySeparate/Eta/write", + "op": "writeproperty" + }, + { + "href": "dtmi:test:PropertySeparate:_contents:__Eta;1", + "contentType": "application/json", + "additionalResponses": [ + { + "success": false, + "schema": "PropertyError" + } + ], + "dtv:topic": "test/PropertySeparate/Eta/read", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/eval/PropertyTogether/PropertyTogether.TD.json b/codegen2/eval/PropertyTogether/PropertyTogether.TD.json new file mode 100644 index 0000000000..53c07f5862 --- /dev/null +++ b/codegen2/eval/PropertyTogether/PropertyTogether.TD.json @@ -0,0 +1,228 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:PropertyTogether;1", + "title": "PropertyTogether", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "PropertyError": { + "description": "The requested property read/write could not be completed.", + "type": "object", + "dtv:additionalProperties": false, + "dtv:errorMessage": "explanation", + "properties": { + "explanation": { + "type": "string" + }, + "details": { + "type": "string" + } + } + }, + "MultiWriteErrorRef": { + "title": "MultiWriteError", + "description": "The requested multiple property write could not be completed.", + "type": "object", + "dtv:additionalProperties": false, + "dtv:errorMessage": "explanation", + "properties": { + "explanation": { + "type": "string" + }, + "attemptedWriteCount": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + }, + "failedWriteCount": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + } + } + } + }, + "forms": [ + { + "href": "dtmi:test:PropertyTogether;1", + "contentType": "application/json", + "additionalResponses": [ + { + "success": false + } + ], + "dtv:topic": "test/PropertyTogether/write", + "op": "writemultipleproperties" + }, + { + "href": "dtmi:test:PropertyTogether;1", + "contentType": "application/json", + "additionalResponses": [ + { + "success": false + } + ], + "dtv:topic": "test/PropertyTogether/read", + "op": "readallproperties" + } + ], + "actions": { + }, + "properties": { + "Alpha": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647, + "readOnly": true, + "forms": [ + { + "href": "dtmi:test:PropertyTogether:_contents:__Alpha;1", + "op": "readproperty" + } + ] + }, + "Beta": { + "type": "object", + "title": "Coordinates", + "dtv:additionalProperties": false, + "properties": { + "latitude": { + "type": "number", + "minimum": -1.80e+308, + "maximum": 1.80e+308 + }, + "longitude": { + "type": "number", + "minimum": -1.80e+308, + "maximum": 1.80e+308 + } + }, + "readOnly": false, + "forms": [ + { + "href": "dtmi:test:PropertyTogether:_contents:__Beta;1", + "op": "writeproperty" + }, + { + "href": "dtmi:test:PropertyTogether:_contents:__Beta;1", + "op": "readproperty" + } + ] + }, + "Gamma": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647, + "readOnly": true, + "forms": [ + { + "href": "dtmi:test:PropertyTogether:_contents:__Gamma;1", + "additionalResponses": [ + { + "success": false, + "schema": "PropertyError" + } + ], + "op": "readproperty" + } + ] + }, + "Delta": { + "type": "object", + "title": "Coordinates", + "dtv:additionalProperties": false, + "properties": { + "latitude": { + "type": "number", + "minimum": -1.80e+308, + "maximum": 1.80e+308 + }, + "longitude": { + "type": "number", + "minimum": -1.80e+308, + "maximum": 1.80e+308 + } + }, + "readOnly": false, + "forms": [ + { + "href": "dtmi:test:PropertyTogether:_contents:__Delta;1", + "additionalResponses": [ + { + "success": false, + "schema": "PropertyError" + } + ], + "op": "writeproperty" + }, + { + "href": "dtmi:test:PropertyTogether:_contents:__Delta;1", + "additionalResponses": [ + { + "success": false, + "schema": "PropertyError" + } + ], + "op": "readproperty" + } + ] + }, + "Zeta": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647, + "readOnly": false, + "dtv:placeholder": true, + "forms": [ + { + "href": "dtmi:test:PropertyTogether:_contents:__Zeta;1", + "op": "writeproperty" + }, + { + "href": "dtmi:test:PropertyTogether:_contents:__Zeta;1", + "op": "readproperty" + } + ] + }, + "Eta": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647, + "readOnly": false, + "dtv:placeholder": true, + "forms": [ + { + "href": "dtmi:test:PropertyTogether:_contents:__Eta;1", + "additionalResponses": [ + { + "success": false, + "schema": "MultiWriteErrorRef" + } + ], + "op": "writeproperty" + }, + { + "href": "dtmi:test:PropertyTogether:_contents:__Eta;1", + "additionalResponses": [ + { + "success": false, + "schema": "PropertyError" + } + ], + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/eval/SchemaNames.json b/codegen2/eval/SchemaNames.json new file mode 100644 index 0000000000..1c8175f699 --- /dev/null +++ b/codegen2/eval/SchemaNames.json @@ -0,0 +1,69 @@ +{ + "aggregateEventSchema": "EventCollection", + "aggregatePropName": "Properties", + "aggregatePropSchema": "PropertyCollection", + "aggregatePropWriteSchema": "PropertyUpdate", + "aggregatePropReadRespSchema": "PropertyCollectionReadRespSchema", + "aggregatePropWriteRespSchema": "PropertyCollectionWriteRespSchema", + "aggregatePropReadErrSchema": "PropertyCollectionReadError", + "aggregatePropWriteErrSchema": "PropertyCollectionWriteError", + "aggregateReadRespValueField": "_properties", + "aggregateRespErrorField": "_errors", + "propRespErrorField": "_error", + "actionRespErrorField": "_error", + "eventSchema": { + "in": [ "eventName" ], + "out": "{eventName}Event", + "capitalize": true + }, + "propSchema": { + "in": [ "propName" ], + "out": "{propName}Property", + "capitalize": true + }, + "eventValueSchema": { + "in": [ "eventName" ], + "out": "Event{eventName}Value", + "capitalize": true + }, + "writablePropSchema": { + "in": [ "propName" ], + "out": "{propName}WritableProperty", + "capitalize": true + }, + "propReadRespSchema": { + "in": [ "propName" ], + "out": "{propName}ReadRespSchema", + "capitalize": true + }, + "propWriteRespSchema": { + "in": [ "propName" ], + "out": "{propName}WriteRespSchema", + "capitalize": true + }, + "propValueSchema": { + "in": [ "propName" ], + "out": "Property{propName}Value", + "capitalize": true + }, + "actionInSchema": { + "in": [ "actionName" ], + "out": "{actionName}InputArgs", + "capitalize": true + }, + "actionOutSchema": { + "in": [ "actionName" ], + "out": "{actionName}OutputArgs", + "capitalize": true + }, + "actionRespSchema": { + "in": [ "actionName" ], + "out": "{actionName}ResponseSchema", + "capitalize": true + }, + "backupSchemaName": { + "in": [ "parentSchemaName", "childName" ], + "out": "{parentSchemaName}{childName}", + "capitalize": true + } +} diff --git a/codegen2/eval/TelemetryComplexSchemas/TelemetryComplexSchemas.TD.json b/codegen2/eval/TelemetryComplexSchemas/TelemetryComplexSchemas.TD.json new file mode 100644 index 0000000000..6d24743b7b --- /dev/null +++ b/codegen2/eval/TelemetryComplexSchemas/TelemetryComplexSchemas.TD.json @@ -0,0 +1,181 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:jsonTest:TelemetryComplexSchemas;1", + "title": "TelemetryComplexSchemas", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "near": { + "type": "integer", + "const": 1 + }, + "far": { + "type": "integer", + "const": 2 + } + }, + "forms": [ + { + "href": "dtmi:jsonTest:TelemetryComplexSchemas;1", + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry", + "op": "subscribeallevents" + } + ], + "actions": { + }, + "properties": { + }, + "events": { + "resultArray": { + "data": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "success", + "failure" + ] + } + }, + "forms": [ + { + "href": "dtmi:jsonTest:TelemetryComplexSchemas:_contents:__resultArray;1", + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry/resultArray", + "op": "subscribeevent" + } + ] + }, + "doubleArray2D": { + "data": { + "type": "array", + "items": { + "type": "array", + "items": { + "type": "number", + "minimum": -1.80e+308, + "maximum": 1.80e+308 + } + } + }, + "forms": [ + { + "href": "dtmi:jsonTest:TelemetryComplexSchemas:_contents:__doubleArray2D;1", + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry/doubleArray2D", + "op": "subscribeevent" + } + ] + }, + "doubleMap": { + "data": { + "type": "object", + "dtv:additionalProperties": { + "type": "number", + "minimum": -1.80e+308, + "maximum": 1.80e+308 + } + }, + "forms": [ + { + "href": "dtmi:jsonTest:TelemetryComplexSchemas:_contents:__doubleMap;1", + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry/doubleMap", + "op": "subscribeevent" + } + ] + }, + "doubleMapArray": { + "data": { + "type": "object", + "dtv:additionalProperties": { + "type": "array", + "items": { + "type": "number", + "minimum": -1.80e+308, + "maximum": 1.80e+308 + } + } + }, + "forms": [ + { + "href": "dtmi:jsonTest:TelemetryComplexSchemas:_contents:__doubleMapArray;1", + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry/doubleMapArray", + "op": "subscribeevent" + } + ] + }, + "coordinates": { + "data": { + "type": "object", + "dtv:additionalProperties": false, + "properties": { + "latitude": { + "type": "number", + "minimum": -1.80e+308, + "maximum": 1.80e+308 + }, + "longitude": { + "type": "number", + "minimum": -1.80e+308, + "maximum": 1.80e+308 + } + } + }, + "forms": [ + { + "href": "dtmi:jsonTest:TelemetryComplexSchemas:_contents:__coordinates;1", + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry/coordinates", + "op": "subscribeevent" + } + ] + }, + "proximity": { + "data": { + "descriptions": { + "en": "An enumerated value for expressing qualitative distance." + }, + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + }, + "forms": [ + { + "href": "dtmi:jsonTest:TelemetryComplexSchemas:_contents:__proximity;1", + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry/proximity", + "op": "subscribeevent" + } + ] + }, + "speed": { + "data": { + "type": "string", + "enum": [ + "slow", + "fast" + ] + }, + "forms": [ + { + "href": "dtmi:jsonTest:TelemetryComplexSchemas:_contents:__speed;1", + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry/speed", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/eval/diffschemas.sh b/codegen2/eval/diffschemas.sh new file mode 100644 index 0000000000..0e6f90b205 --- /dev/null +++ b/codegen2/eval/diffschemas.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +odd PropertySeparate/JsonSchemas/Namespace/ ../../codegen/test/samples/dotnet/PropertySeparateSample/obj/Akri/PropertySeparate/ & + +odd PropertyTogether/JsonSchemas/Namespace/ ../../codegen/test/samples/dotnet/PropertyTogetherSample/obj/Akri/PropertyTogether/ & diff --git a/codegen2/eval/genschemas.sh b/codegen2/eval/genschemas.sh new file mode 100644 index 0000000000..0b2595a0c8 --- /dev/null +++ b/codegen2/eval/genschemas.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +gen=../src/SchemaTester/bin/Debug/net9.0/SchemaTester + +[[ -d PropertySeparate/JsonSchemas ]] && rm -r PropertySeparate/JsonSchemas +$gen PropertySeparate PropertySeparate/JsonSchemas + +[[ -d PropertyTogether/JsonSchemas ]] && rm -r PropertyTogether/JsonSchemas +$gen PropertyTogether PropertyTogether/JsonSchemas + +[[ -d CommandComplexSchemas/JsonSchemas ]] && rm -r CommandComplexSchemas/JsonSchemas +$gen CommandComplexSchemas CommandComplexSchemas/JsonSchemas + +[[ -d CounterCollection/JsonSchemas ]] && rm -r CounterCollection/JsonSchemas +$gen CounterCollection CounterCollection/JsonSchemas + +[[ -d TelemetryComplexSchemas/JsonSchemas ]] && rm -r TelemetryComplexSchemas/JsonSchemas +$gen TelemetryComplexSchemas TelemetryComplexSchemas/JsonSchemas diff --git a/codegen2/eval/gentypes.sh b/codegen2/eval/gentypes.sh new file mode 100644 index 0000000000..b95d5baa99 --- /dev/null +++ b/codegen2/eval/gentypes.sh @@ -0,0 +1,33 @@ +#!/bin/sh + +gen=../src/TypeTester/bin/Debug/net9.0/TypeTester + +[[ -d PropertySeparate/DotNet ]] && rm -r PropertySeparate/DotNet +$gen PropertySeparate/JsonSchemas/Namespace PropertySeparate/DotNet C# + +[[ -d PropertyTogether/DotNet ]] && rm -r PropertyTogether/DotNet +$gen PropertyTogether/JsonSchemas/Namespace PropertyTogether/DotNet C# + +[[ -d PropertySeparate/Rust ]] && rm -r PropertySeparate/Rust +$gen PropertySeparate/JsonSchemas/Namespace PropertySeparate/Rust Rust + +[[ -d PropertyTogether/Rust ]] && rm -r PropertyTogether/Rust +$gen PropertyTogether/JsonSchemas/Namespace PropertyTogether/Rust Rust + +[[ -d CommandComplexSchemas/DotNet ]] && rm -r CommandComplexSchemas/DotNet +$gen CommandComplexSchemas/JsonSchemas/Namespace CommandComplexSchemas/DotNet C# + +[[ -d CommandComplexSchemas/Rust ]] && rm -r CommandComplexSchemas/Rust +$gen CommandComplexSchemas/JsonSchemas/Namespace CommandComplexSchemas/Rust Rust + +[[ -d CounterCollection/DotNet ]] && rm -r CounterCollection/DotNet +$gen CounterCollection/JsonSchemas/Namespace CounterCollection/DotNet C# + +[[ -d CounterCollection/Rust ]] && rm -r CounterCollection/Rust +$gen CounterCollection/JsonSchemas/Namespace CounterCollection/Rust Rust + +[[ -d TelemetryComplexSchemas/DotNet ]] && rm -r TelemetryComplexSchemas/DotNet +$gen TelemetryComplexSchemas/JsonSchemas/Namespace TelemetryComplexSchemas/DotNet C# + +[[ -d TelemetryComplexSchemas/Rust ]] && rm -r TelemetryComplexSchemas/Rust +$gen TelemetryComplexSchemas/JsonSchemas/Namespace TelemetryComplexSchemas/Rust Rust diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/Azure.Iot.Operations.CodeGeneration.csproj b/codegen2/src/Azure.Iot.Operations.CodeGeneration/Azure.Iot.Operations.CodeGeneration.csproj new file mode 100644 index 0000000000..183228517d --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/Azure.Iot.Operations.CodeGeneration.csproj @@ -0,0 +1,12 @@ + + + + net9.0 + enable + + + + + + + diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/CodeName.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/CodeName.cs new file mode 100644 index 0000000000..cdadaa714d --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/CodeName.cs @@ -0,0 +1,257 @@ +namespace Azure.Iot.Operations.CodeGeneration +{ + using System; + using System.Collections.Generic; + using System.Linq; + using System.Text; + + public class CodeName : ITypeName, IEquatable + { + private readonly string givenName; + private readonly string[] components; + private readonly string lowerName; + private readonly string pascalName; + private readonly string camelName; + private readonly string snakeName; + + public CodeName(string givenName = "") + : this(givenName, Decompose(givenName)) + { + } + + public CodeName(string baseName, string suffix1, string? suffix2 = null, string? suffix3 = null) + : this(Extend(baseName, suffix1, suffix2, suffix3), DecomposeAndExtend(baseName, suffix1, suffix2, suffix3)) + { + } + + public CodeName(CodeName baseName, string suffix1) + : this(Extend(baseName.AsGiven, suffix1, null, null), baseName.AsComponents.Append(suffix1)) + { + } + + public CodeName(CodeName baseName, string suffix1, string suffix2) + : this(Extend(baseName.AsGiven, suffix1, suffix2, null), baseName.AsComponents.Append(suffix1).Append(suffix2)) + { + } + + public CodeName(CodeName baseName, string suffix1, string suffix2, string suffix3) + : this(Extend(baseName.AsGiven, suffix1, suffix2, suffix3), baseName.AsComponents.Append(suffix1).Append(suffix2).Append(suffix3)) + { + } + + public CodeName(string givenName, IEnumerable components) + { + this.givenName = givenName; + this.components = components.ToArray(); + lowerName = string.Concat(components); + pascalName = string.Concat(components.Select(c => char.ToUpper(c[0]) + c.Substring(1))); + camelName = pascalName.Length > 0 ? char.ToLower(pascalName[0]) + pascalName.Substring(1) : string.Empty; + snakeName = string.Join('_', components); + } + + public override string ToString() + { + throw new Exception($"ToString() called on CodeName({AsGiven})"); + } + + public override bool Equals(object? obj) + { + return Equals(obj as CodeName); + } + + public bool Equals(CodeName? other) + { + return !ReferenceEquals(null, other) && AsGiven == other.AsGiven; + } + + public override int GetHashCode() + { + return AsGiven.GetHashCode(); + } + + public string GetTypeName(TargetLanguage language, string? suffix1 = null, string? suffix2 = null, string? suffix3 = null, string? suffix4 = null, bool local = false) => language switch + { + TargetLanguage.CSharp => Escape(language, AsPascal(suffix1, suffix2, suffix3, suffix4)), + TargetLanguage.Rust => Escape(language, AsPascal(suffix1, suffix2, suffix3, suffix4)), + _ => AsPascal(suffix1, suffix2, suffix3, suffix4), + }; + + public string GetFieldName(TargetLanguage language) => language switch + { + TargetLanguage.CSharp => Escape(language, AsPascal()), + TargetLanguage.Rust => Escape(language, AsSnake()), + _ => throw new ArgumentOutOfRangeException(nameof(language)), + }; + + public string GetMethodName(TargetLanguage language, string? suffix1 = null, string? suffix2 = null, string? suffix3 = null, string? prefix = null) => language switch + { + TargetLanguage.CSharp => Escape(language, AsPascal(suffix1, suffix2, suffix3, prefix: prefix)), + TargetLanguage.Rust => Escape(language, AsSnake(suffix1, suffix2, suffix3, prefix: prefix)), + _ => throw new ArgumentOutOfRangeException(nameof(language)), + }; + + public string GetVariableName(TargetLanguage language, string? suffix1 = null, string? suffix2 = null, string? suffix3 = null, string? prefix = null) => language switch + { + TargetLanguage.CSharp => Escape(language, AsCamel(suffix1, suffix2, suffix3, prefix: prefix)), + TargetLanguage.Rust => Escape(language, AsSnake(suffix1, suffix2, suffix3, prefix: prefix)), + _ => throw new ArgumentOutOfRangeException(nameof(language)), + }; + + public string GetConstantName(TargetLanguage language, string? suffix1 = null, string? suffix2 = null, string? suffix3 = null, string? prefix = null) => language switch + { + TargetLanguage.CSharp => Escape(language, AsPascal(suffix1, suffix2, suffix3, prefix: prefix)), + TargetLanguage.Rust => Escape(language, AsScreamingSnake(suffix1, suffix2, suffix3, prefix: prefix)), + _ => throw new ArgumentOutOfRangeException(nameof(language)), + }; + + public string GetFileName(TargetLanguage language, string? suffix1 = null, string? suffix2 = null, string? suffix3 = null) => language switch + { + TargetLanguage.CSharp => AsPascal(suffix1, suffix2, suffix3), + TargetLanguage.Rust => AsSnake(suffix1, suffix2, suffix3), + _ => throw new ArgumentOutOfRangeException(nameof(language)), + }; + + public string GetFolderName(TargetLanguage language) => language switch + { + TargetLanguage.CSharp => AsPascal(), + TargetLanguage.Rust => AsSnake(), + _ => throw new ArgumentOutOfRangeException(nameof(language)), + }; + + public bool IsEmpty => string.IsNullOrEmpty(givenName); + + public string AsGiven => givenName; + + private string[] AsComponents => components; + + private string AsLower(string? suffix1 = null, string? suffix2 = null, string? suffix3 = null, string? suffix4 = null, string? prefix = null) + { + return prefix ?? string.Empty + lowerName + suffix1 ?? string.Empty + suffix2 ?? string.Empty + suffix3 ?? string.Empty + suffix4 ?? string.Empty; + } + + private string AsPascal(string? suffix1 = null, string? suffix2 = null, string? suffix3 = null, string? suffix4 = null, string? prefix = null) + { + return GetCapitalized(prefix) + pascalName + GetCapitalized(suffix1) + GetCapitalized(suffix2) + GetCapitalized(suffix3) + GetCapitalized(suffix4); + } + + private string AsCamel(string? suffix1 = null, string? suffix2 = null, string? suffix3 = null, string? suffix4 = null, string? prefix = null) + { + if (!string.IsNullOrEmpty(prefix)) + { + return prefix + pascalName + GetCapitalized(suffix1) + GetCapitalized(suffix2) + GetCapitalized(suffix3) + GetCapitalized(suffix4); + } + else if (!string.IsNullOrEmpty(givenName)) + { + return camelName + GetCapitalized(suffix1) + GetCapitalized(suffix2) + GetCapitalized(suffix3) + GetCapitalized(suffix4); + } + else + { + return suffix1 + GetCapitalized(suffix2) + GetCapitalized(suffix3) + GetCapitalized(suffix4); + } + } + + private string AsSnake(string? suffix1 = null, string? suffix2 = null, string? suffix3 = null, string? suffix4 = null, string? prefix = null) + { + return GetSnakePrefix(prefix) + snakeName + GetSnakeSuffix(suffix1) + GetSnakeSuffix(suffix2) + GetSnakeSuffix(suffix3) + GetSnakeSuffix(suffix4); + } + + private string AsScreamingSnake(string? suffix1 = null, string? suffix2 = null, string? suffix3 = null, string? suffix4 = null, string? prefix = null) + { + return AsSnake(suffix1, suffix2, suffix3, suffix4, prefix: prefix).ToUpperInvariant(); + } + + private static string Extend(string baseName, string suffix1, string? suffix2, string? suffix3) + { + bool snakeWise = baseName.Contains('_'); + StringBuilder givenName = new(baseName); + givenName.Append(Extension(suffix1, snakeWise)); + + if (suffix2 != null) + { + givenName.Append(Extension(suffix2, snakeWise)); + } + + if (suffix3 != null) + { + givenName.Append(Extension(suffix3, snakeWise)); + } + + return givenName.ToString(); + } + + private static List DecomposeAndExtend(string baseName, string suffix1, string? suffix2, string? suffix3) + { + List components = Decompose(baseName); + components.Add(suffix1); + + if (suffix2 != null) + { + components.Add(suffix2); + } + + if (suffix3 != null) + { + components.Add(suffix3); + } + + return components; + } + + private static List Decompose(string givenName) + { + List components = new(); + StringBuilder stringBuilder = new(); + char p = '\0'; + + foreach (char c in givenName) + { + if (((char.IsUpper(c) && char.IsLower(p)) || c == '_') && stringBuilder.Length > 0) + { + components.Add(stringBuilder.ToString()); + stringBuilder.Clear(); + } + + if (c != '_') + { + stringBuilder.Append(char.ToLower(c)); + } + + p = c; + } + + if (stringBuilder.Length > 0) + { + components.Add(stringBuilder.ToString()); + } + + return components; + } + + private static string Extension(string suffix, bool snakeWise) + { + return snakeWise ? GetSnakeSuffix(suffix) : GetCapitalized(suffix); + } + + private static string GetCapitalized(string? suffix) + { + return suffix == null ? string.Empty : char.ToUpperInvariant(suffix[0]) + suffix.Substring(1); + } + + private static string GetSnakeSuffix(string? suffix) + { + return suffix == null ? string.Empty : $"_{suffix}"; + } + + private static string GetSnakePrefix(string? prefix) + { + return prefix == null ? string.Empty : $"{prefix}_"; + } + + private static string Escape(TargetLanguage language, string name) => language switch + { + TargetLanguage.CSharp => ReservedCSharp.Keywords.Contains(name) ? $"@{name}" : name, + TargetLanguage.Rust => ReservedRust.Keywords.Contains(name) ? $"r#{name}" : name, + _ => name, + }; + } +} diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/CustomTypeName.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/CustomTypeName.cs new file mode 100644 index 0000000000..efd8b9345c --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/CustomTypeName.cs @@ -0,0 +1,55 @@ +namespace Azure.Iot.Operations.CodeGeneration +{ + using System; + + public class CustomTypeName : ITypeName + { + public const string Designator = "[CUSTOM]"; + + public static CustomTypeName Instance = new(); + + public string GetTypeName(TargetLanguage language, string? suffix1 = null, string? suffix2 = null, string? suffix3 = null, string? suffix4 = null, bool local = false) + { + if (suffix1 != null) + { + return "CustomPayload" + GetCapitalized(suffix1) + GetCapitalized(suffix2) + GetCapitalized(suffix3) + GetCapitalized(suffix4); + } + else + { + return language switch + { + TargetLanguage.CSharp => "CustomPayload", + TargetLanguage.Rust => "CustomPayload", + _ => throw new InvalidOperationException($"There is no {language} representation for {typeof(CustomTypeName)}"), + }; + } + } + + public string GetFileName(TargetLanguage language, string? suffix1 = null, string? suffix2 = null, string? suffix3 = null) + { + if (suffix1 != null) + { + return language switch + { + TargetLanguage.CSharp => "CustomPayload" + GetCapitalized(suffix1) + GetCapitalized(suffix2) + GetCapitalized(suffix3), + TargetLanguage.Rust => "custom_payload" + GetSnakeSuffix(suffix1) + GetSnakeSuffix(suffix2) + GetSnakeSuffix(suffix3), + _ => throw new InvalidOperationException($"There is no {language} representation for {typeof(CustomTypeName)}"), + }; + } + else + { + throw new InvalidOperationException($"{typeof(CustomTypeName)} should not be used for a file name without a suffix"); + } + } + + private static string GetCapitalized(string? suffix) + { + return suffix == null ? string.Empty : char.ToUpperInvariant(suffix[0]) + suffix.Substring(1); + } + + private static string GetSnakeSuffix(string? suffix) + { + return suffix == null ? string.Empty : $"_{suffix}"; + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/EmptyTypeName.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/EmptyTypeName.cs new file mode 100644 index 0000000000..bdbd966d12 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/EmptyTypeName.cs @@ -0,0 +1,146 @@ +namespace Azure.Iot.Operations.CodeGeneration +{ + using System; + + public abstract class EmptyTypeName: ITypeName + { + public static EmptyAvroTypeName AvroInstance = new(); + public static EmptyCborTypeName CborInstance = new(); + public static EmptyJsonTypeName JsonInstance = new(); + public static EmptyProtoTypeName ProtoInstance = new(); + public static EmptyRawTypeName RawInstance = new(); + public static EmptyCustomTypeName CustomInstance = new(); + + public class EmptyAvroTypeName : EmptyTypeName + { + public override string GetTypeName(TargetLanguage language, string? suffix1 = null, string? suffix2 = null, string? suffix3 = null, string? suffix4 = null, bool local = false) => (suffix1, suffix2, suffix3, suffix4, language) switch + { + (null, null, null, null, TargetLanguage.CSharp) => "EmptyAvro", + (null, null, null, null, TargetLanguage.Rust) => "EmptyAvro", + _ => throw new InvalidOperationException(suffix1 != null ? $"{typeof(EmptyAvroTypeName)} cannot take a suffix" : $"There is no {language} representation for {typeof(EmptyAvroTypeName)}"), + }; + + public override string GetFileName(TargetLanguage language, string? suffix1 = null, string? suffix2 = null, string? suffix3 = null) => (suffix1, suffix2, suffix3, language) switch + { + (null, null, null, TargetLanguage.Rust) => "empty_avro", + _ => throw new InvalidOperationException(suffix1 != null ? $"{typeof(EmptyAvroTypeName)} cannot take a suffix" : $"There is no {language} file name for {typeof(EmptyAvroTypeName)}"), + }; + + public override string GetAllocator(TargetLanguage language) => language switch + { + TargetLanguage.CSharp => "new EmptyAvro()", + TargetLanguage.Rust => "EmptyAvro{}", + _ => throw new InvalidOperationException($"There is no {language} allocator for {typeof(EmptyAvroTypeName)}"), + }; + } + + public class EmptyCborTypeName : EmptyTypeName + { + public override string GetTypeName(TargetLanguage language, string? suffix1 = null, string? suffix2 = null, string? suffix3 = null, string? suffix4 = null, bool local = false) => (suffix1, suffix2, suffix3, suffix4, language) switch + { + (null, null, null, null, TargetLanguage.CSharp) => "EmptyCbor", + _ => throw new InvalidOperationException(suffix1 != null ? $"{typeof(EmptyCborTypeName)} cannot take a suffix" : $"There is no {language} representation for {typeof(EmptyCborTypeName)}"), + }; + + public override string GetFileName(TargetLanguage language, string? suffix1 = null, string? suffix2 = null, string? suffix3 = null) => (suffix1, suffix2, suffix3, language) switch + { + _ => throw new InvalidOperationException(suffix1 != null ? $"{typeof(EmptyCborTypeName)} cannot take a suffix" : $"There is no {language} file name for {typeof(EmptyCborTypeName)}"), + }; + + public override string GetAllocator(TargetLanguage language) => language switch + { + TargetLanguage.CSharp => "new EmptyCbor()", + _ => throw new InvalidOperationException($"There is no {language} allocator for {typeof(EmptyAvroTypeName)}"), + }; + } + + public class EmptyJsonTypeName : EmptyTypeName + { + public override string GetTypeName(TargetLanguage language, string? suffix1 = null, string? suffix2 = null, string? suffix3 = null, string? suffix4 = null, bool local = false) => (suffix1, suffix2, suffix3, suffix4, language) switch + { + (null, null, null, null, TargetLanguage.CSharp) => "EmptyJson", + (null, null, null, null, TargetLanguage.Rust) => "EmptyJson", + _ => throw new InvalidOperationException(suffix1 != null ? $"{typeof(EmptyJsonTypeName)} cannot take a suffix" : $"There is no {language} representation for {typeof(EmptyJsonTypeName)}"), + }; + + public override string GetFileName(TargetLanguage language, string? suffix1 = null, string? suffix2 = null, string? suffix3 = null) => (suffix1, suffix2, suffix3, language) switch + { + (null, null, null, TargetLanguage.Rust) => "empty_json", + _ => throw new InvalidOperationException(suffix1 != null ? $"{typeof(EmptyJsonTypeName)} cannot take a suffix" : $"There is no {language} file name for {typeof(EmptyJsonTypeName)}"), + }; + + public override string GetAllocator(TargetLanguage language) => language switch + { + TargetLanguage.CSharp => "new EmptyJson()", + TargetLanguage.Rust => "EmptyJson{}", + _ => throw new InvalidOperationException($"There is no {language} allocator for {typeof(EmptyAvroTypeName)}"), + }; + } + + public class EmptyProtoTypeName : EmptyTypeName + { + public override string GetTypeName(TargetLanguage language, string? suffix1 = null, string? suffix2 = null, string? suffix3 = null, string? suffix4 = null, bool local = false) => (suffix1, suffix2, suffix3, suffix4, language) switch + { + (null, null, null, null, TargetLanguage.CSharp) => "Google.Protobuf.WellKnownTypes.Empty", + _ => throw new InvalidOperationException(suffix1 != null ? $"{typeof(EmptyProtoTypeName)} cannot take a suffix" : $"There is no {language} representation for {typeof(EmptyProtoTypeName)}"), + }; + + public override string GetFileName(TargetLanguage language, string? suffix1 = null, string? suffix2 = null, string? suffix3 = null) => (suffix1, suffix2, suffix3, language) switch + { + _ => throw new InvalidOperationException(suffix1 != null ? $"{typeof(EmptyProtoTypeName)} cannot take a suffix" : $"There is no {language} file name for {typeof(EmptyProtoTypeName)}"), + }; + + public override string GetAllocator(TargetLanguage language) => language switch + { + TargetLanguage.CSharp => "new Google.Protobuf.WellKnownTypes.Empty()", + _ => throw new InvalidOperationException($"There is no {language} allocator for {typeof(EmptyAvroTypeName)}"), + }; + } + + public class EmptyRawTypeName : EmptyTypeName + { + public override string GetTypeName(TargetLanguage language, string? suffix1 = null, string? suffix2 = null, string? suffix3 = null, string? suffix4 = null, bool local = false) => (suffix1, suffix2, suffix3, suffix4, language) switch + { + (null, null, null, null, TargetLanguage.CSharp) => "byte[]", + (null, null, null, null, TargetLanguage.Rust) => "byte[]", + _ => throw new InvalidOperationException(suffix1 != null ? $"{typeof(EmptyRawTypeName)} cannot take a suffix" : $"There is no {language} representation for {typeof(EmptyRawTypeName)}"), + }; + + public override string GetFileName(TargetLanguage language, string? suffix1 = null, string? suffix2 = null, string? suffix3 = null) => + throw new InvalidOperationException(suffix1 != null ? $"{typeof(EmptyRawTypeName)} cannot take a suffix" : $"There is no {language} file name for {typeof(EmptyRawTypeName)}"); + + public override string GetAllocator(TargetLanguage language) => language switch + { + TargetLanguage.CSharp => "Array.Empty()", + TargetLanguage.Rust => "byte[]{}", + _ => throw new InvalidOperationException($"There is no {language} allocator for {typeof(EmptyAvroTypeName)}"), + }; + } + + public class EmptyCustomTypeName : EmptyTypeName + { + public override string GetTypeName(TargetLanguage language, string? suffix1 = null, string? suffix2 = null, string? suffix3 = null, string? suffix4 = null, bool local = false) => (suffix1, suffix2, suffix3, suffix4, language) switch + { + (null, null, null, null, TargetLanguage.CSharp) => "CustomPayload", + (null, null, null, null, TargetLanguage.Rust) => "CustomPayload", + _ => throw new InvalidOperationException(suffix1 != null ? $"{typeof(EmptyCustomTypeName)} cannot take a suffix" : $"There is no {language} representation for {typeof(EmptyCustomTypeName)}"), + }; + + public override string GetFileName(TargetLanguage language, string? suffix1 = null, string? suffix2 = null, string? suffix3 = null) => + throw new InvalidOperationException(suffix1 != null ? $"{typeof(EmptyCustomTypeName)} cannot take a suffix" : $"There is no {language} file name for {typeof(EmptyCustomTypeName)}"); + + public override string GetAllocator(TargetLanguage language) => language switch + { + TargetLanguage.CSharp => "ExternalSerializer.EmptyValue", + TargetLanguage.Rust => "CustomPayload{}", + _ => throw new InvalidOperationException($"There is no {language} allocator for {typeof(EmptyAvroTypeName)}"), + }; + } + + public abstract string GetTypeName(TargetLanguage language, string? suffix1 = null, string? suffix2 = null, string? suffix3 = null, string? suffix4 = null, bool local = false); + + public abstract string GetFileName(TargetLanguage language, string? suffix1 = null, string? suffix2 = null, string? suffix3 = null); + + public abstract string GetAllocator(TargetLanguage language); + } +} diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/FormInfo.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/FormInfo.cs new file mode 100644 index 0000000000..a67d5a30c9 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/FormInfo.cs @@ -0,0 +1,58 @@ +namespace Azure.Iot.Operations.CodeGeneration +{ + using System.Collections.Generic; + using System.Linq; + using Azure.Iot.Operations.TDParser.Model; + + public record FormInfo( + SerializationFormat Format, + bool HasErrorResponse, + string? ErrorSchemaName, + TDDataSchema? ErrorSchema, + SerializationFormat ErrorSchemaFormat, + string? HeaderSchemaName, + TDDataSchema? HeaderSchema, + SerializationFormat HeaderSchemaFormat, + string? TopicPattern) + { + public static FormInfo? CreateFromForm(TDForm? form, Dictionary? schemaDefinitions) + { + if (form == null) + { + return null; + } + + SerializationFormat format = ContentTypeToFormat(form.ContentType); + + bool hasErrorResponse = form.AdditionalResponses?.Any(r => !r.Success) ?? false; + + TDSchemaReference? errorSchemaRef = form.AdditionalResponses?.FirstOrDefault(r => !r.Success && r.Schema != null); + var (errorSchemaName, errorSchema, errorSchemaFormat) = GetSchemaAndFormat(errorSchemaRef, form, schemaDefinitions); + + TDSchemaReference? headerSchemaRef = form.HeaderInfo?.FirstOrDefault(r => r.Schema != null); + var (headerSchemaName, headerSchema, headerSchemaFormat) = GetSchemaAndFormat(headerSchemaRef, form, schemaDefinitions); + + return new FormInfo(format, hasErrorResponse, errorSchemaName, errorSchema, errorSchemaFormat, headerSchemaName, headerSchema, headerSchemaFormat, form.Topic); + } + + private static (string?, TDDataSchema?, SerializationFormat) GetSchemaAndFormat(TDSchemaReference? schemaRef, TDForm? form, Dictionary? schemaDefinitions) + { + string? schemaName = schemaRef?.Schema; + SerializationFormat schemaFormat = ContentTypeToFormat(schemaRef?.ContentType ?? form?.ContentType); + + TDDataSchema? schema = null; + schemaDefinitions?.TryGetValue(schemaName ?? string.Empty, out schema); + + return (schemaName, schema, schemaFormat); + } + + private static SerializationFormat ContentTypeToFormat(string? contentType) + { + return contentType switch + { + TDValues.ContentTypeJson => SerializationFormat.Json, + _ => SerializationFormat.None, + }; + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/FuncInfo.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/FuncInfo.cs new file mode 100644 index 0000000000..3a24632aa0 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/FuncInfo.cs @@ -0,0 +1,16 @@ +namespace Azure.Iot.Operations.CodeGeneration +{ + using System.Text.Json.Serialization; + + public class FuncInfo + { + [JsonPropertyName("in")] + public string[]? Input { get; set; } + + [JsonPropertyName("out")] + public string? Output { get; set; } + + [JsonPropertyName("capitalize")] + public bool Capitalize { get; set; } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ITypeName.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ITypeName.cs new file mode 100644 index 0000000000..36bc3c5bf0 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ITypeName.cs @@ -0,0 +1,9 @@ +namespace Azure.Iot.Operations.CodeGeneration +{ + public interface ITypeName + { + public string GetTypeName(TargetLanguage language, string? suffix1 = null, string? suffix2 = null, string? suffix3 = null, string? suffix4 = null, bool local = false); + + public string GetFileName(TargetLanguage language, string? suffix1 = null, string? suffix2 = null, string? suffix3 = null); + } +} diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ReservedCSharp.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ReservedCSharp.cs new file mode 100644 index 0000000000..48d07dd524 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ReservedCSharp.cs @@ -0,0 +1,133 @@ +namespace Azure.Iot.Operations.CodeGeneration +{ + using System.Collections.Generic; + + public static class ReservedCSharp + { + public static HashSet Keywords = new HashSet + { + "abstract", + "add", + "alias", + "allows", + "and", + "args", + "as", + "ascending", + "async", + "await", + "base", + "bool", + "break", + "by", + "byte", + "case", + "catch", + "char", + "checked", + "class", + "const", + "continue", + "decimal", + "default", + "delegate", + "descending", + "do", + "double", + "dynamic", + "else", + "enum", + "equals", + "event", + "explicit", + "extern", + "false", + "field", + "file", + "finally", + "fixed", + "float", + "for", + "foreach", + "from", + "get", + "global", + "goto", + "group", + "if", + "implicit", + "in", + "init", + "int", + "interface", + "internal", + "into", + "is", + "join", + "let", + "lock", + "long", + "managed", + "nameof", + "namespace", + "new", + "nint", + "not", + "notnull", + "nuint", + "null", + "object", + "on", + "operator", + "or", + "orderby", + "out", + "override", + "params", + "partial", + "private", + "protected", + "public", + "readonly", + "record", + "ref", + "remove", + "required", + "return", + "sbyte", + "scoped", + "sealed", + "select", + "set", + "short", + "sizeof", + "stackalloc", + "static", + "string", + "struct", + "switch", + "this", + "throw", + "true", + "try", + "typeof", + "uint", + "ulong", + "unchecked", + "unmanaged", + "unsafe", + "ushort", + "using", + "value", + "var", + "virtual", + "void", + "volatile", + "when", + "where", + "while", + "with", + "yield", + }; + } +} diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ReservedRust.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ReservedRust.cs new file mode 100644 index 0000000000..d7273c1dfb --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ReservedRust.cs @@ -0,0 +1,67 @@ +namespace Azure.Iot.Operations.CodeGeneration +{ + using System.Collections.Generic; + + public static class ReservedRust + { + public static HashSet Keywords = new HashSet + { + "abstract", + "as", + "async", + "await", + "become", + "box", + "break", + "const", + "continue", + "crate", + "do", + "dyn", + "else", + "enum", + "extern", + "false", + "final", + "fn", + "for", + "gen", + "if", + "impl", + "in", + "let", + "loop", + "macro", + "macro_rules", + "match", + "mod", + "move", + "mut", + "override", + "priv", + "pub", + "raw", + "ref", + "return", + "safe", + "self", + "Self", + "static", + "struct", + "super", + "trait", + "true", + "try", + "type", + "typeof", + "union", + "unsafe", + "unsized", + "use", + "virtual", + "where", + "while", + "yield", + }; + } +} diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNameInfo.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNameInfo.cs new file mode 100644 index 0000000000..eb53feb020 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNameInfo.cs @@ -0,0 +1,76 @@ +namespace Azure.Iot.Operations.CodeGeneration +{ + using System.Text.Json.Serialization; + + public class SchemaNameInfo + { + [JsonPropertyName("aggregateEventSchema")] + public string? AggregateEventSchema { get; set; } + + [JsonPropertyName("aggregatePropName")] + public string? AggregatePropName { get; set; } + + [JsonPropertyName("aggregatePropSchema")] + public string? AggregatePropSchema { get; set; } + + [JsonPropertyName("aggregatePropWriteSchema")] + public string? AggregatePropWriteSchema { get; set; } + + [JsonPropertyName("aggregatePropReadRespSchema")] + public string? AggregatePropReadRespSchema { get; set; } + + [JsonPropertyName("aggregatePropWriteRespSchema")] + public string? AggregatePropWriteRespSchema { get; set; } + + [JsonPropertyName("aggregatePropReadErrSchema")] + public string? AggregatePropReadErrSchema { get; set; } + + [JsonPropertyName("aggregatePropWriteErrSchema")] + public string? AggregatePropWriteErrSchema { get; set; } + + [JsonPropertyName("aggregateReadRespValueField")] + public string? AggregateReadRespValueField { get; set; } + + [JsonPropertyName("aggregateRespErrorField")] + public string? AggregateRespErrorField { get; set; } + + [JsonPropertyName("propRespErrorField")] + public string? PropRespErrorField { get; set; } + + [JsonPropertyName("actionRespErrorField")] + public string? ActionRespErrorField { get; set; } + + [JsonPropertyName("eventSchema")] + public FuncInfo? EventSchema { get; set; } + + [JsonPropertyName("eventValueSchema")] + public FuncInfo? EventValueSchema { get; set; } + + [JsonPropertyName("propSchema")] + public FuncInfo? PropSchema { get; set; } + + [JsonPropertyName("writablePropSchema")] + public FuncInfo? WritablePropSchema { get; set; } + + [JsonPropertyName("propReadRespSchema")] + public FuncInfo? PropReadRespSchema { get; set; } + + [JsonPropertyName("propWriteRespSchema")] + public FuncInfo? PropWriteRespSchema { get; set; } + + [JsonPropertyName("propValueSchema")] + public FuncInfo? PropValueSchema { get; set; } + + [JsonPropertyName("actionInSchema")] + public FuncInfo? ActionInSchema { get; set; } + + [JsonPropertyName("actionOutSchema")] + public FuncInfo? ActionOutSchema { get; set; } + + [JsonPropertyName("actionRespSchema")] + public FuncInfo? ActionRespSchema { get; set; } + + [JsonPropertyName("backupSchemaName")] + public FuncInfo? BackupSchemaName { get; set; } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNamer.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNamer.cs new file mode 100644 index 0000000000..edc9d7b774 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNamer.cs @@ -0,0 +1,81 @@ +namespace Azure.Iot.Operations.CodeGeneration +{ + using System.Text.Json; + using System.Linq; + + public class SchemaNamer + { + private SchemaNameInfo? schemaNameInfo; + + public SchemaNamer(string? schemaNameInfoText) + { + this.schemaNameInfo = schemaNameInfoText != null ? JsonSerializer.Deserialize(schemaNameInfoText) : null; + } + + public string AggregateEventSchema { get => this.schemaNameInfo?.AggregateEventSchema ?? "EventCollection"; } + + public string AggregatePropName { get => this.schemaNameInfo?.AggregatePropName ?? "Properties"; } + + public string AggregatePropSchema { get => this.schemaNameInfo?.AggregatePropSchema ?? "PropertyCollection"; } + + public string AggregatePropWriteSchema { get => this.schemaNameInfo?.AggregatePropWriteSchema ?? "PropertyUpdate"; } + + public string AggregatePropReadRespSchema { get => this.schemaNameInfo?.AggregatePropReadRespSchema ?? "PropertyCollectionReadResponseSchema"; } + + public string AggregatePropWriteRespSchema { get => this.schemaNameInfo?.AggregatePropWriteRespSchema ?? "PropertyCollectionWriteResponseSchema"; } + + public string AggregatePropReadErrSchema { get => this.schemaNameInfo?.AggregatePropReadErrSchema ?? "PropertyCollectionReadError"; } + + public string AggregatePropWriteErrSchema { get => this.schemaNameInfo?.AggregatePropWriteErrSchema ?? "PropertyCollectionWriteError"; } + + public string AggregateReadRespValueField { get => this.schemaNameInfo?.AggregateReadRespValueField ?? "_properties"; } + + public string AggregateRespErrorField { get => this.schemaNameInfo?.AggregateRespErrorField ?? "_errors"; } + + public string PropRespErrorField { get => this.schemaNameInfo?.PropRespErrorField ?? "_error"; } + + public string ActionRespErrorField { get => this.schemaNameInfo?.ActionRespErrorField ?? "_error"; } + + public string GetEventSchema(string eventName) => Expand(this.schemaNameInfo?.EventSchema, $"{Cap(eventName)}Event", eventName); + + public string GetEventValueSchema(string eventName) => Expand(this.schemaNameInfo?.EventValueSchema, $"Event{Cap(eventName)}Value", eventName); + + public string GetPropSchema(string propName) => Expand(this.schemaNameInfo?.PropSchema, $"{Cap(propName)}Property", propName); + + public string GetWritablePropSchema(string propName) => Expand(this.schemaNameInfo?.WritablePropSchema, $"{Cap(propName)}WritableProperty", propName); + + public string GetPropReadRespSchema(string propName) => Expand(this.schemaNameInfo?.PropReadRespSchema, $"{Cap(propName)}ReadResponseSchema", propName); + + public string GetPropWriteRespSchema(string propName) => Expand(this.schemaNameInfo?.PropWriteRespSchema, $"{Cap(propName)}WriteResponseSchema", propName); + + public string GetPropValueSchema(string propName) => Expand(this.schemaNameInfo?.PropValueSchema, $"Property{Cap(propName)}Value", propName); + + public string GetActionInSchema(string actionName) => Expand(this.schemaNameInfo?.ActionInSchema, $"{Cap(actionName)}InputArguments", actionName); + + public string GetActionOutSchema(string actionName) => Expand(this.schemaNameInfo?.ActionOutSchema, $"{Cap(actionName)}OutputArguments", actionName); + + public string GetActionRespSchema(string actionName) => Expand(this.schemaNameInfo?.ActionRespSchema, $"{Cap(actionName)}ResponseSchema", actionName); + + public string GetBackupSchemaName(string parentSchemaName, string childName) => Expand(this.schemaNameInfo?.BackupSchemaName, $"{Cap(parentSchemaName)}{Cap(childName)}", parentSchemaName, childName); + + private static string Expand(FuncInfo? funcInfo, string defaultOut, params string[] args) + { + if (funcInfo == null || funcInfo.Output == null || funcInfo.Input == null || funcInfo.Input.Length < args.Length) + { + return defaultOut; + } + + string outString = funcInfo.Output; + foreach (int ix in Enumerable.Range(0, funcInfo.Input.Length)) + { + outString = outString.Replace($"{{{funcInfo.Input[ix]}}}", MaybeCap(args[ix], funcInfo.Capitalize)); + } + + return outString; + } + + private static string Cap(string input) => char.ToUpper(input[0]) + input.Substring(1); + + private static string MaybeCap(string input, bool capitalize) => capitalize ? Cap(input) : input; + } +} diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/SerializationFormat.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/SerializationFormat.cs new file mode 100644 index 0000000000..222a41c8bd --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/SerializationFormat.cs @@ -0,0 +1,8 @@ +namespace Azure.Iot.Operations.CodeGeneration +{ + public enum SerializationFormat + { + None, + Json, + } +} diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/TDValues.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/TDValues.cs new file mode 100644 index 0000000000..7e000c4cfb --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/TDValues.cs @@ -0,0 +1,60 @@ +namespace Azure.Iot.Operations.CodeGeneration +{ + using System.Collections.Generic; + + public static class TDValues + { + public const string RelationSchemaNaming = "service-desc"; + + public const string ContentTypeJson = "application/json"; + + public const string OpInvokeAction = "invokeaction"; + public const string OpQueryAction = "queryaction"; + public const string OpReadProp = "readproperty"; + public const string OpWriteProp = "writeproperty"; + public const string OpSubEvent = "subscribeevent"; + public const string OpReadAllProps = "readallproperties"; + public const string OpWriteMultProps = "writemultipleproperties"; + public const string OpSubAllEvents = "subscribeallevents"; + + public const string TypeObject = "object"; + public const string TypeArray = "array"; + public const string TypeString = "string"; + public const string TypeNumber = "number"; + public const string TypeInteger = "integer"; + public const string TypeBoolean = "boolean"; + public const string TypeNull = "null"; + + public const string FormatDateTime = "date-time"; + public const string FormatDate = "date"; + public const string FormatTime = "time"; + public const string FormatUuid = "uuid"; + + public const string ContentEncodingBase64 = "base64"; + + public static readonly HashSet OpValues = new HashSet() { + OpReadProp, + OpWriteProp, + OpReadAllProps, + OpWriteMultProps, + OpSubAllEvents, + }; + + public static readonly HashSet TypeValues = new HashSet() { + TypeObject, + TypeArray, + TypeString, + TypeNumber, + TypeInteger, + TypeBoolean, + TypeNull, + }; + + public static readonly HashSet FormatValues = new HashSet() { + FormatDateTime, + FormatDate, + FormatTime, + FormatUuid, + }; + } +} diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/TargetLanguage.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/TargetLanguage.cs new file mode 100644 index 0000000000..3bb15ed6b8 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/TargetLanguage.cs @@ -0,0 +1,8 @@ +namespace Azure.Iot.Operations.CodeGeneration +{ + public enum TargetLanguage + { + CSharp, + Rust + } +} diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/.gitignore b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/.gitignore new file mode 100644 index 0000000000..db669da381 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/.gitignore @@ -0,0 +1 @@ +**/t4/*.cs diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs new file mode 100644 index 0000000000..82f5ea038d --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs @@ -0,0 +1,90 @@ +namespace Azure.Iot.Operations.SchemaGenerator +{ + using System.Collections.Generic; + using System.Linq; + using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser.Model; + + internal static class ActionSchemaGenerator + { + internal static void GenerateActionSchemas(TDThing tdThing, SchemaNamer schemaNamer, string projectName, Dictionary schemaSpecs, Dictionary> referencedSchemas) + { + Dictionary readValueFields = new(); + Dictionary writeValueFields = new(); + Dictionary readErrorFields = new(); + Dictionary writeErrorFields = new(); + HashSet readErrorSchemaNames = new(); + HashSet writeErrorSchemaNames = new(); + + if (tdThing.Actions != null) + { + foreach (KeyValuePair propKvp in tdThing.Actions) + { + ProcessAction( + schemaNamer, + propKvp.Key, + propKvp.Value, + projectName, + tdThing.SchemaDefinitions, + schemaSpecs, + referencedSchemas); + } + } + } + + private static void ProcessAction( + SchemaNamer schemaNamer, + string actionName, + TDAction tdAction, + string projectName, + Dictionary? schemaDefinitions, + Dictionary schemaSpecs, + Dictionary> referencedSchemas) + { + FormInfo? actionForm = FormInfo.CreateFromForm(tdAction.Forms?.FirstOrDefault(f => f.Op == TDValues.OpInvokeAction || f.Op == TDValues.OpQueryAction), schemaDefinitions); + + if (actionForm?.TopicPattern != null) + { + if (tdAction.Input != null) + { + string inputSchemaName = tdAction.Input.Title ?? schemaNamer.GetActionInSchema(actionName); + ObjectSpec inputObjectSpec = ObjectSpec.CreateFromDataSchema(schemaNamer, tdAction.Input, actionForm.Format, inputSchemaName, tdAction.Input.Description ?? $"Input arguments for action '{actionName}'"); + schemaSpecs[inputSchemaName] = inputObjectSpec; + } + + Dictionary responseFields = new(); + if (tdAction.Output != null) + { + string outputSchemaName = tdAction.Output.Title ?? schemaNamer.GetActionOutSchema(actionName); + ObjectSpec outputObjectSpec = ObjectSpec.CreateFromDataSchema(schemaNamer, tdAction.Output, actionForm.Format, outputSchemaName, tdAction.Output.Description ?? $"Output arguments for action '{actionName}'"); + schemaSpecs[outputSchemaName] = outputObjectSpec; + responseFields = outputObjectSpec.Fields.ToDictionary(f => f.Key, f => f.Value with { Require = false }); + } + + if (actionForm?.ErrorSchema != null) + { + responseFields[schemaNamer.ActionRespErrorField] = new FieldSpec( + tdAction.Description ?? $"Read error for the '{actionName}' Action.", + actionForm.ErrorSchema, + BackupSchemaName: actionForm.ErrorSchemaName!, + Require: false); + + string respSchemaName = schemaNamer.GetActionRespSchema(actionName); + ObjectSpec propReadRespObjectSpec = new( + tdAction.Description ?? $"Response to a '{actionName}' Action.", + responseFields, + actionForm.Format, + respSchemaName); + schemaSpecs[respSchemaName] = propReadRespObjectSpec; + + SchemaGenerationSupport.AddSchemaReference(actionForm.ErrorSchemaName!, actionForm.ErrorSchemaFormat, referencedSchemas); + } + + if (actionForm?.HeaderSchema != null) + { + SchemaGenerationSupport.AddSchemaReference(actionForm.HeaderSchemaName!, actionForm.HeaderSchemaFormat, referencedSchemas); + } + } + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/Azure.Iot.Operations.SchemaGenerator.csproj b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/Azure.Iot.Operations.SchemaGenerator.csproj new file mode 100644 index 0000000000..d4f530bb89 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/Azure.Iot.Operations.SchemaGenerator.csproj @@ -0,0 +1,57 @@ + + + + net9.0 + enable + + + + + + + + + + + + + + TextTemplatingFilePreprocessor + ConstSchema.cs + Azure.Iot.Operations.SchemaGenerator + + + TextTemplatingFilePreprocessor + EnumJsonSchema.cs + Azure.Iot.Operations.SchemaGenerator + + + TextTemplatingFilePreprocessor + ObjectJsonSchema.cs + Azure.Iot.Operations.SchemaGenerator + + + + + + + + + + True + True + ConstSchema.tt + + + True + True + EnumJsonSchema.tt + + + True + True + ObjectJsonSchema.tt + + + + diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EnumSpec.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EnumSpec.cs new file mode 100644 index 0000000000..79d66d4760 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EnumSpec.cs @@ -0,0 +1,23 @@ +namespace Azure.Iot.Operations.SchemaGenerator +{ + using System; + using System.Linq; + using System.Collections.Generic; + using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser.Model; + + internal record EnumSpec(string? Description, List Values, SerializationFormat Format, string SchemaName) : SchemaSpec(Format) + { + internal static EnumSpec CreateFromDataSchema(TDDataSchema dataSchema, SerializationFormat format, string backupName, string? defaultDescription = null) + { + string schemaName = dataSchema.Title ?? backupName; + + if (dataSchema.Type != TDValues.TypeString || dataSchema.Enum == null) + { + throw new Exception($"Cannot create enum spec from schema definition with type {dataSchema.Type ?? "unspecfied"} or with no enum values."); + } + + return new EnumSpec(dataSchema.Description ?? defaultDescription, dataSchema.Enum.ToList(), format, schemaName); + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EventSchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EventSchemaGenerator.cs new file mode 100644 index 0000000000..57f8467c93 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EventSchemaGenerator.cs @@ -0,0 +1,88 @@ +namespace Azure.Iot.Operations.SchemaGenerator +{ + using System.Collections.Generic; + using System.Linq; + using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser.Model; + + internal static class EventSchemaGenerator + { + internal static void GenerateEventSchemas(TDThing tdThing, SchemaNamer schemaNamer, string projectName, Dictionary schemaSpecs, Dictionary> referencedSchemas) + { + FormInfo? subAllEventsForm = FormInfo.CreateFromForm(tdThing.Forms?.FirstOrDefault(f => f.Op == TDValues.OpSubAllEvents), tdThing.SchemaDefinitions); + + Dictionary valueFields = new(); + + if (tdThing.Events != null) + { + foreach (KeyValuePair eventKvp in tdThing.Events.Where(e => e.Value.Data != null)) + { + ProcessEvent( + schemaNamer, + eventKvp.Key, + eventKvp.Value, + projectName, + tdThing.SchemaDefinitions, + schemaSpecs, + valueFields); + } + } + + GenerateCollectiveEventObject( + schemaNamer, + subAllEventsForm, + valueFields, + schemaSpecs); + } + + private static void ProcessEvent( + SchemaNamer schemaNamer, + string eventName, + TDEvent tdEvent, + string projectName, + Dictionary? schemaDefinitions, + Dictionary schemaSpecs, + Dictionary valueFields) + { + FormInfo? subEventForm = FormInfo.CreateFromForm(tdEvent.Forms?.FirstOrDefault(f => f.Op == TDValues.OpSubEvent), schemaDefinitions); + + FieldSpec dataFieldSpec = new( + tdEvent.Description ?? $"The '{eventName}' Event data value.", + tdEvent.Data!, + BackupSchemaName: schemaNamer.GetEventValueSchema(eventName), + Require: true, + Fragment: tdEvent.Placeholder); + valueFields[eventName] = dataFieldSpec with { Require = false }; + + if (subEventForm?.TopicPattern != null) + { + string eventSchemaName = schemaNamer.GetEventSchema(eventName); + ObjectSpec eventObjectSpec = new( + tdEvent.Description ?? $"Container for the '{eventName}' Event data.", + new Dictionary { { eventName, dataFieldSpec } }, + subEventForm.Format, + eventSchemaName); + schemaSpecs[eventSchemaName] = eventObjectSpec; + } + } + + private static void GenerateCollectiveEventObject( + SchemaNamer schemaNamer, + FormInfo? topLevelEventsForm, + Dictionary valueFields, + Dictionary schemaSpecs) + { + if (topLevelEventsForm?.TopicPattern != null) + { + if (valueFields.Any()) + { + schemaSpecs[schemaNamer.AggregateEventSchema] = new ObjectSpec( + $"Data values of Events.", + valueFields, + topLevelEventsForm.Format, + schemaNamer.AggregateEventSchema); + } + } + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/FieldSpec.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/FieldSpec.cs new file mode 100644 index 0000000000..3187c5dc40 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/FieldSpec.cs @@ -0,0 +1,41 @@ +namespace Azure.Iot.Operations.SchemaGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser.Model; + + internal record FieldSpec(string Description, TDDataSchema Schema, bool Require, string BackupSchemaName, bool Fragment = false) + { + internal static FieldSpec CreateFixed(string title, string description, string backupSchemaName) + { + return new FieldSpec( + description, + new TDDataSchema + { + Title = title, + Type = TDValues.TypeObject, + AdditionalProperties = new TDAdditionalPropSpecifier { Boolean = false }, + }, + Require: false, + backupSchemaName); + } + + public override int GetHashCode() + { + return (Description, Schema, Require, BackupSchemaName, Fragment).GetHashCode(); + } + + public virtual bool Equals(FieldSpec? other) + { + if (other == null) + { + return false; + } + + return Description == other.Description && + Schema.Equals(other.Schema) && + Require == other.Require && + BackupSchemaName == other.BackupSchemaName && + Fragment == other.Fragment; + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/GeneratedSchema.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/GeneratedSchema.cs new file mode 100644 index 0000000000..8f8caf1add --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/GeneratedSchema.cs @@ -0,0 +1,4 @@ +namespace Azure.Iot.Operations.SchemaGenerator +{ + public record GeneratedSchema(string Content, string FileName, string FolderPath); +} diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ISchemaTemplateTransform.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ISchemaTemplateTransform.cs new file mode 100644 index 0000000000..3e1ebc6e78 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ISchemaTemplateTransform.cs @@ -0,0 +1,11 @@ +namespace Azure.Iot.Operations.SchemaGenerator +{ + internal interface ISchemaTemplateTransform + { + string FileName { get; } + + string FolderPath { get; } + + string TransformText(); + } +} diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ObjectSpec.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ObjectSpec.cs new file mode 100644 index 0000000000..bf2f727859 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ObjectSpec.cs @@ -0,0 +1,38 @@ +namespace Azure.Iot.Operations.SchemaGenerator +{ + using System; + using System.Linq; + using System.Collections.Generic; + using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser.Model; + + internal record ObjectSpec(string? Description, Dictionary Fields, SerializationFormat Format, string SchemaName) : SchemaSpec(Format) + { + internal static ObjectSpec CreateFromDataSchema(SchemaNamer schemaNamer, TDDataSchema dataSchema, SerializationFormat format, string backupName, string? defaultDescription = null) + { + string schemaName = dataSchema.Title ?? backupName; + + if (dataSchema.Type != TDValues.TypeObject) + { + throw new Exception($"Cannot create object spec from schema definition with type {dataSchema.Type ?? "unspecfied"}."); + } + + Dictionary fieldSpecs = new(); + foreach (KeyValuePair property in dataSchema.Properties ?? new Dictionary()) + { + fieldSpecs[property.Key] = new FieldSpec(property.Key, property.Value, Require: dataSchema.Required?.Contains(property.Key) ?? false, schemaNamer.GetBackupSchemaName(schemaName, property.Key)); + } + + return new ObjectSpec(dataSchema.Description ?? defaultDescription, fieldSpecs, format, schemaName); + } + + internal static ObjectSpec CreateFixed(SchemaNamer schemaNamer, string description, Dictionary fieldSketches, SerializationFormat format, string schemaName) + { + return new ObjectSpec( + description, + fieldSketches.ToDictionary(f => f.Key, f => FieldSpec.CreateFixed(f.Value.Item1, f.Value.Item2, schemaNamer.GetBackupSchemaName(schemaName, f.Value.Item1))), + format, + schemaName); + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/PropertySchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/PropertySchemaGenerator.cs new file mode 100644 index 0000000000..7997f0ce98 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/PropertySchemaGenerator.cs @@ -0,0 +1,242 @@ +namespace Azure.Iot.Operations.SchemaGenerator +{ + using System.Collections.Generic; + using System.Linq; + using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser.Model; + + internal static class PropertySchemaGenerator + { + internal static void GeneratePropertySchemas(TDThing tdThing, SchemaNamer schemaNamer, string projectName, Dictionary schemaSpecs, Dictionary> referencedSchemas) + { + FormInfo? readAllPropsForm = FormInfo.CreateFromForm(tdThing.Forms?.FirstOrDefault(f => f.Op == TDValues.OpReadAllProps), tdThing.SchemaDefinitions); + FormInfo? writeMultPropsForm = FormInfo.CreateFromForm(tdThing.Forms?.FirstOrDefault(f => f.Op == TDValues.OpWriteMultProps), tdThing.SchemaDefinitions); + + Dictionary readValueFields = new(); + Dictionary writeValueFields = new(); + Dictionary readErrorFields = new(); + Dictionary writeErrorFields = new(); + HashSet readErrorSchemaNames = new(); + HashSet writeErrorSchemaNames = new(); + + if (tdThing.Properties != null) + { + foreach (KeyValuePair propKvp in tdThing.Properties) + { + ProcessProperty( + schemaNamer, + propKvp.Key, + propKvp.Value, + projectName, + tdThing.SchemaDefinitions, + schemaSpecs, + readValueFields, + writeValueFields, + readErrorFields, + writeErrorFields, + referencedSchemas, + readErrorSchemaNames, + writeErrorSchemaNames); + } + } + + GenerateCollectiveResponseObject( + schemaNamer, + readAllPropsForm, + readValueFields, + readErrorFields, + schemaNamer.AggregatePropSchema, + schemaNamer.AggregatePropReadErrSchema, + schemaNamer.AggregatePropReadRespSchema, + "read", + "of", + "all", + readErrorSchemaNames, + schemaSpecs, + referencedSchemas, + responseIncludesProps: true); + GenerateCollectiveResponseObject( + schemaNamer, + writeMultPropsForm, + writeValueFields, + writeErrorFields, + schemaNamer.AggregatePropWriteSchema, + schemaNamer.AggregatePropWriteErrSchema, + schemaNamer.AggregatePropWriteRespSchema, + "write", + "for", + "multiple", + writeErrorSchemaNames, + schemaSpecs, + referencedSchemas, + responseIncludesProps: false); + } + + private static void ProcessProperty( + SchemaNamer schemaNamer, + string propName, + TDProperty tdProperty, + string projectName, + Dictionary? schemaDefinitions, + Dictionary schemaSpecs, + Dictionary readValueFields, + Dictionary writeValueFields, + Dictionary readErrorFields, + Dictionary writeErrorFields, + Dictionary> referencedSchemas, + HashSet readErrorSchemaNames, + HashSet writeErrorSchemaNames) + { + FormInfo? readPropForm = FormInfo.CreateFromForm(tdProperty.Forms?.FirstOrDefault(f => f.Op == TDValues.OpReadProp), schemaDefinitions); + FormInfo? writePropForm = FormInfo.CreateFromForm(tdProperty.Forms?.FirstOrDefault(f => f.Op == TDValues.OpWriteProp), schemaDefinitions); + + FieldSpec propFieldSpec = new( + tdProperty.Description ?? $"The '{propName}' Property value.", + tdProperty as TDDataSchema, + BackupSchemaName: schemaNamer.GetPropValueSchema(propName), + Require: true, + Fragment: tdProperty.Placeholder); + readValueFields[propName] = propFieldSpec; + + if (readPropForm?.TopicPattern != null) + { + string propSchemaName = schemaNamer.GetPropSchema(propName); + ObjectSpec propObjectSpec = new( + tdProperty.Description ?? $"Container for the '{propName}' Property.", + new Dictionary { { propName, propFieldSpec } }, + readPropForm.Format, + propSchemaName); + schemaSpecs[propSchemaName] = propObjectSpec; + } + + if (readPropForm?.ErrorSchema != null) + { + FieldSpec propReadRespFieldSpec = new( + tdProperty.Description ?? $"Read error for the '{propName}' Property.", + readPropForm.ErrorSchema, + BackupSchemaName: readPropForm.ErrorSchemaName!, + Require: false); + readErrorFields[propName] = propReadRespFieldSpec; + + readErrorSchemaNames.Add(readPropForm.ErrorSchemaName!); + + if (readPropForm?.TopicPattern != null) + { + string propReadRespSchemaName = schemaNamer.GetPropReadRespSchema(propName); + ObjectSpec propReadRespObjectSpec = new( + tdProperty.Description ?? $"Response to a '{propName}' Property read.", + new Dictionary { { propName, propFieldSpec with { Require = false } }, { schemaNamer.PropRespErrorField, propReadRespFieldSpec } }, + readPropForm.Format, + propReadRespSchemaName); + schemaSpecs[propReadRespSchemaName] = propReadRespObjectSpec; + + SchemaGenerationSupport.AddSchemaReference(readPropForm.ErrorSchemaName!, readPropForm.ErrorSchemaFormat, referencedSchemas); + } + } + + if (!tdProperty.ReadOnly) + { + FieldSpec writablePropFieldSpec = new( + tdProperty.Description ?? $"Value for the '{propName}' Property.", + tdProperty as TDDataSchema, + BackupSchemaName: schemaNamer.GetPropValueSchema(propName), + Require: false, + Fragment: tdProperty.Placeholder); + writeValueFields[propName] = writablePropFieldSpec; + + if (tdProperty.Placeholder && writePropForm?.TopicPattern != null) + { + string writablePropSchemaName = schemaNamer.GetWritablePropSchema(propName); + ObjectSpec writablePropObjectSpec = new( + tdProperty.Description ?? $"Container for writing to the '{propName}' Property.", + new Dictionary { { propName, writablePropFieldSpec } }, + writePropForm.Format, + writablePropSchemaName); + schemaSpecs[writablePropSchemaName] = writablePropObjectSpec; + } + + if (writePropForm?.ErrorSchema != null) + { + FieldSpec propWriteRespFieldSpec = new( + tdProperty.Description ?? $"Write error for the '{propName}' Property.", + writePropForm.ErrorSchema, + BackupSchemaName: writePropForm.ErrorSchemaName!, + Require: false); + writeErrorFields[propName] = propWriteRespFieldSpec; + + writeErrorSchemaNames.Add(writePropForm.ErrorSchemaName!); + + if (writePropForm?.TopicPattern != null) + { + string propWriteRespSchemaName = schemaNamer.GetPropWriteRespSchema(propName); + ObjectSpec propWriteRespObjectSpec = new( + tdProperty.Description ?? $"Response to a '{propName}' Property write.", + new Dictionary { { schemaNamer.PropRespErrorField, propWriteRespFieldSpec } }, + writePropForm.Format, + propWriteRespSchemaName); + schemaSpecs[propWriteRespSchemaName] = propWriteRespObjectSpec; + + SchemaGenerationSupport.AddSchemaReference(writePropForm.ErrorSchemaName!, writePropForm.ErrorSchemaFormat, referencedSchemas); + } + } + } + } + + private static void GenerateCollectiveResponseObject( + SchemaNamer schemaNamer, + FormInfo? topLevelPropsForm, + Dictionary valueFields, + Dictionary errorFields, + string propsSchema, + string errorSchema, + string responseSchema, + string operation, + string preposition, + string quantifier, + HashSet errorSchemaNames, + Dictionary schemaSpecs, + Dictionary> referencedSchemas, + bool responseIncludesProps) + { + if (topLevelPropsForm?.TopicPattern != null) + { + if (valueFields.Any()) + { + schemaSpecs[propsSchema] = new ObjectSpec( + $"Values {preposition} {quantifier} Properties.", + valueFields, + topLevelPropsForm.Format, + propsSchema); + } + + if (topLevelPropsForm.HasErrorResponse && errorFields.Any()) + { + schemaSpecs[errorSchema] = new ObjectSpec( + $"Errors from any Property {operation}.", + errorFields, + topLevelPropsForm.Format, + errorSchema); + + Dictionary fieldSketches = new(); + fieldSketches[schemaNamer.AggregateRespErrorField] = (errorSchema, "Errors when operation fails."); + if (responseIncludesProps) + { + fieldSketches[schemaNamer.AggregateReadRespValueField] = (propsSchema, "Properties when operation succeeds."); + } + + schemaSpecs[responseSchema] = ObjectSpec.CreateFixed( + schemaNamer, + $"Response to {operation} of {quantifier} Properties", + fieldSketches, + topLevelPropsForm.Format, + responseSchema); + + foreach (string errSchemaName in errorSchemaNames) + { + SchemaGenerationSupport.AddSchemaReference(errSchemaName, topLevelPropsForm.Format, referencedSchemas); + } + } + } + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerationSupport.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerationSupport.cs new file mode 100644 index 0000000000..85968fd0ae --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerationSupport.cs @@ -0,0 +1,19 @@ +namespace Azure.Iot.Operations.SchemaGenerator +{ + using System.Collections.Generic; + using Azure.Iot.Operations.CodeGeneration; + + internal static class SchemaGenerationSupport + { + internal static void AddSchemaReference(string schemaName, SerializationFormat format, Dictionary> referencedSchemas) + { + if (!referencedSchemas.TryGetValue(schemaName, out HashSet? formats) || formats == null) + { + formats = new HashSet(); + referencedSchemas[schemaName] = formats; + } + + formats.Add(format); + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs new file mode 100644 index 0000000000..3cfb6338c3 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs @@ -0,0 +1,168 @@ +namespace Azure.Iot.Operations.SchemaGenerator +{ + using System.Collections.Generic; + using System.Linq; + using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser.Model; + + public static class SchemaGenerator + { + public static List GenerateSchemas(TDThing tdThing, SchemaNamer schemaNamer, string projectName, string genNamespace) + { + Dictionary schemaSpecs = new(); + Dictionary> referencedSchemas = new(); + + PropertySchemaGenerator.GeneratePropertySchemas(tdThing, schemaNamer, projectName, schemaSpecs, referencedSchemas); + ActionSchemaGenerator.GenerateActionSchemas(tdThing, schemaNamer, projectName, schemaSpecs, referencedSchemas); + EventSchemaGenerator.GenerateEventSchemas(tdThing, schemaNamer, projectName, schemaSpecs, referencedSchemas); + + Dictionary closedSchemaSpecs = new(); + + foreach (KeyValuePair> referencedSchema in referencedSchemas) + { + foreach (SerializationFormat format in referencedSchema.Value) + { + if (tdThing.SchemaDefinitions?.TryGetValue(referencedSchema.Key, out TDDataSchema? dataSchema) ?? false) + { + ComputeClosureOfDataSchema(schemaNamer, referencedSchema.Key, dataSchema, format, closedSchemaSpecs); + } + } + } + + foreach (KeyValuePair schemaSpec in schemaSpecs) + { + ComputeClosureOfSchemaSpec(schemaNamer, schemaSpec.Key, schemaSpec.Value, closedSchemaSpecs); + } + + List generatedSchemas = new(); + + foreach (KeyValuePair schemaSpec in closedSchemaSpecs) + { + ISchemaTemplateTransform schema = SchemaTransformFactory.GetSchemaTransform(schemaSpec.Key, schemaSpec.Value, genNamespace); + generatedSchemas.Add(new GeneratedSchema(schema.TransformText(), schema.FileName, schema.FolderPath)); + } + + if (tdThing.SchemaDefinitions?.Any(d => d.Value.Type == TDValues.TypeInteger && d.Value.Const != null) ?? false) + { + ISchemaTemplateTransform schema = new ConstSchema(projectName, tdThing.SchemaDefinitions, genNamespace); + generatedSchemas.Add(new GeneratedSchema(schema.TransformText(), schema.FileName, schema.FolderPath)); + } + + return generatedSchemas; + } + + private static void ComputeClosureOfSchemaSpec(SchemaNamer schemaNamer, string schemaName, SchemaSpec schemaSpec, Dictionary closedSchemaSpecs) + { + if (IsDuplicate(schemaName, schemaSpec, closedSchemaSpecs)) + { + return; + } + + closedSchemaSpecs[schemaName] = schemaSpec; + + if (schemaSpec is ObjectSpec objectSpec) + { + foreach (KeyValuePair field in objectSpec.Fields) + { + ComputeClosureOfDataSchema(schemaNamer, field.Value.BackupSchemaName, field.Value.Schema, schemaSpec.Format, closedSchemaSpecs); + } + } + } + + private static void ComputeClosureOfDataSchema(SchemaNamer schemaNamer, string backupName, TDDataSchema dataSchema, SerializationFormat format, Dictionary closedSchemaSpecs) + { + if (IsProxy(dataSchema)) + { + return; + } + + string schemaName = dataSchema.Title ?? backupName; + + if (SchemaSpec.TryCreateFromDataSchema(schemaNamer, dataSchema, format, backupName, out SchemaSpec? schemaSpec)) + { + if (IsDuplicate(schemaName, schemaSpec, closedSchemaSpecs)) + { + return; + } + + closedSchemaSpecs[schemaName] = schemaSpec; + } + + if (dataSchema.Properties != null) + { + foreach (KeyValuePair property in dataSchema.Properties) + { + ComputeClosureOfDataSchema(schemaNamer, schemaNamer.GetBackupSchemaName(schemaName, property.Key), property.Value, format, closedSchemaSpecs); + } + } + else if (dataSchema.Items != null) + { + ComputeClosureOfDataSchema(schemaNamer, backupName, dataSchema.Items, format, closedSchemaSpecs); + } + else if (dataSchema.AdditionalProperties?.DataSchema != null) + { + ComputeClosureOfDataSchema(schemaNamer, backupName, dataSchema.AdditionalProperties.DataSchema, format, closedSchemaSpecs); + } + } + + private static bool IsProxy(TDDataSchema dataSchema) + { + return (dataSchema.Type == TDValues.TypeObject && (dataSchema.AdditionalProperties == null || dataSchema.AdditionalProperties.Boolean == false) && dataSchema.Properties == null) || + (dataSchema.Type == TDValues.TypeArray && dataSchema.Items == null); + } + + private static bool IsDuplicate(string schemaName, SchemaSpec schemaSpec, Dictionary closedSchemaSpecs) + { + if (!closedSchemaSpecs.TryGetValue(schemaName, out SchemaSpec? existingSpec)) + { + return false; + } + + if (existingSpec.GetType() != schemaSpec.GetType()) + { + throw new System.Exception($"Duplicate schema name {schemaName} on different schema types."); + } + else if (existingSpec is ObjectSpec existingObjectSpec && schemaSpec is ObjectSpec newObjectSpec) + { + if (existingObjectSpec.Fields.Count != newObjectSpec.Fields.Count) + { + throw new System.Exception($"Duplicate schema name {schemaName} on objects with different field counts."); + } + + foreach (KeyValuePair field in existingObjectSpec.Fields) + { + if (!newObjectSpec.Fields.TryGetValue(field.Key, out FieldSpec? newField)) + { + throw new System.Exception($"Duplicate schema name {schemaName} on objects with different field names (`{field.Key}` present in only one)."); + } + + if (!field.Value.Equals(newField)) + { + throw new System.Exception($"Duplicate schema name {schemaName} on objects with different values for field `{field.Key}`."); + } + } + + return true; + } + else if (existingSpec is EnumSpec existingEnumSpec && schemaSpec is EnumSpec newEnumSpec) + { + if (existingEnumSpec.Values.Count != newEnumSpec.Values.Count) + { + throw new System.Exception($"Duplicate schema name {schemaName} on enums with different value counts."); + } + + foreach (string value in existingEnumSpec.Values) + { + if (!newEnumSpec.Values.Contains(value)) + { + throw new System.Exception($"Duplicate schema name {schemaName} on enums with different values (`{value}` present in only one)."); + } + } + + return true; + } + + return false; + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaSpec.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaSpec.cs new file mode 100644 index 0000000000..1338ccbb40 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaSpec.cs @@ -0,0 +1,28 @@ +namespace Azure.Iot.Operations.SchemaGenerator +{ + using System.Diagnostics.CodeAnalysis; + using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser.Model; + + internal record SchemaSpec(SerializationFormat Format) + { + internal static bool TryCreateFromDataSchema(SchemaNamer schemaNamer, TDDataSchema dataSchema, SerializationFormat format, string backupName, [NotNullWhen(true)] out SchemaSpec? schemaSpec) + { + if (dataSchema.Type == TDValues.TypeObject && dataSchema.AdditionalProperties?.Boolean == false) + { + schemaSpec = ObjectSpec.CreateFromDataSchema(schemaNamer, dataSchema, format, backupName); + return true; + } + else if (dataSchema.Type == TDValues.TypeString && dataSchema.Enum != null) + { + schemaSpec = EnumSpec.CreateFromDataSchema(dataSchema, format, backupName); + return true; + } + else + { + schemaSpec = null; + return false; + } + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaTransformFactory.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaTransformFactory.cs new file mode 100644 index 0000000000..bdab53cb70 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaTransformFactory.cs @@ -0,0 +1,36 @@ +namespace Azure.Iot.Operations.SchemaGenerator +{ + using System; + using Azure.Iot.Operations.CodeGeneration; + + internal static class SchemaTransformFactory + { + internal static ISchemaTemplateTransform GetSchemaTransform(string schemaName, SchemaSpec schemaSpec, string genNamespace) + { + return schemaSpec switch + { + ObjectSpec objectSpec => GetObjectSchemaTransform(schemaName, objectSpec, genNamespace), + EnumSpec enumSpec => GetEnumSchemaTransform(schemaName, enumSpec, genNamespace), + _ => throw new NotSupportedException($"Unable to transform schema spec of type {schemaSpec.GetType()}."), + }; + } + + internal static ISchemaTemplateTransform GetObjectSchemaTransform(string schemaName, ObjectSpec objectSpec, string genNamespace) + { + return objectSpec.Format switch + { + SerializationFormat.Json => new ObjectJsonSchema(schemaName, objectSpec, genNamespace), + _ => throw new NotSupportedException($"Serialization format {objectSpec.Format} is not supported."), + }; + } + + internal static ISchemaTemplateTransform GetEnumSchemaTransform(string schemaName, EnumSpec enumSpec, string genNamespace) + { + return enumSpec.Format switch + { + SerializationFormat.Json => new EnumJsonSchema(schemaName, enumSpec, genNamespace), + _ => throw new NotSupportedException($"Serialization format {enumSpec.Format} is not supported."), + }; + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/free/code/ConstSchema.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/free/code/ConstSchema.cs new file mode 100644 index 0000000000..168e1fd044 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/free/code/ConstSchema.cs @@ -0,0 +1,25 @@ +namespace Azure.Iot.Operations.SchemaGenerator +{ + using System.Collections.Generic; + using System.Linq; + using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser.Model; + + public partial class ConstSchema : ISchemaTemplateTransform + { + string name; + List<(string, int)> constValues; + string genNamespace; + + internal ConstSchema(string name, Dictionary schemaDefinitions, string genNamespace) + { + this.name = name; + this.constValues = schemaDefinitions.Where(d => d.Value.Type == TDValues.TypeInteger && d.Value.Const != null).Select(d => (d.Key, (int)d.Value.Const!)).OrderBy(d => d.Item2).ToList(); + this.genNamespace = genNamespace; + } + + public string FileName { get => $"{this.name}.const.json"; } + + public string FolderPath { get => this.genNamespace; } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/free/t4/ConstSchema.tt b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/free/t4/ConstSchema.tt new file mode 100644 index 0000000000..70e139fcc8 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/free/t4/ConstSchema.tt @@ -0,0 +1,8 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="System.Collections.Generic" #> +<#@ import namespace="Azure.Iot.Operations.TDParser.Model" #> +{ +<# int ix = 1; foreach ((string, int) constValue in this.constValues) { #> + "<#=constValue.Item1#>": <#=constValue.Item2#><#=ix < this.constValues.Count ? "," : ""#> +<# ix++; } #> +} diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs new file mode 100644 index 0000000000..8c87745614 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs @@ -0,0 +1,56 @@ +namespace Azure.Iot.Operations.SchemaGenerator +{ + using System.Text.RegularExpressions; + using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser.Model; + + internal static class JsonSchemaSupport + { + private const string Iso8601DurationExample = "P3Y6M4DT12H30M5S"; + private const string DecimalExample = "1234567890.0987654321"; + private const string AnArbitraryString = "HelloWorld"; + private const string DecimalPattern = @"^(?:\\+|-)?(?:[1-9][0-9]*|0)(?:\\.[0-9]*)?$"; + + internal static string GetFragmented(string typeAndAddenda, bool require) + { + string addProps = require ? typeAndAddenda : $"\"anyOf\": [ {{ \"type\": \"null\" }}, {{ {typeAndAddenda} }} ]"; + return $"\"type\": \"object\", \"additionalProperties\": {{ {addProps} }}"; + } + + internal static string GetTypeAndAddenda(TDDataSchema tdSchema, string? backupSchemaName) + { + if ((tdSchema.Type == TDValues.TypeObject && tdSchema.AdditionalProperties?.Boolean == false) || + (tdSchema.Type == TDValues.TypeString && tdSchema.Enum != null)) + { + return $"\"$ref\": \"{tdSchema.Title ?? backupSchemaName}.schema.json\""; + } + + switch (tdSchema.Type ?? string.Empty) + { + case TDValues.TypeObject: + return $"\"type\": \"object\", \"additionalProperties\": {{ {GetTypeAndAddenda(tdSchema.AdditionalProperties!.DataSchema!, backupSchemaName)} }}"; + case TDValues.TypeArray: + string itemsProp = tdSchema.Items != null ? $", \"items\": {{ {GetTypeAndAddenda(tdSchema.Items, backupSchemaName)} }}" : string.Empty; + return $"\"type\": \"array\"{itemsProp}"; + case TDValues.TypeString: + string formatProp = TDValues.FormatValues.Contains(tdSchema.Format ?? string.Empty) ? $", \"format\": \"{tdSchema.Format}\"" : + tdSchema.Pattern != null && Regex.IsMatch(Iso8601DurationExample, tdSchema.Pattern) && !Regex.IsMatch(AnArbitraryString, tdSchema.Pattern) ? @", ""format"": ""duration""" : string.Empty; + string patternProp = tdSchema.Pattern != null && Regex.IsMatch(DecimalExample, tdSchema.Pattern) && !Regex.IsMatch(AnArbitraryString, tdSchema.Pattern) ? $", \"pattern\": \"{DecimalPattern}\"" : string.Empty; + string encodingProp = tdSchema.ContentEncoding == TDValues.ContentEncodingBase64 ? @", ""contentEncoding"": ""base64""" : string.Empty; + string enumProp = tdSchema.Enum != null ? $", \"enum\": [ {string.Join(", ", $"\"{tdSchema.Enum}\"")} ]" : string.Empty; + return $"\"type\": \"string\"{formatProp}{patternProp}{encodingProp}{enumProp}"; + case TDValues.TypeNumber: + string numberFormat = tdSchema.Minimum >= -3.40e+38 && tdSchema.Maximum <= 3.40e+38 ? "float" : "double"; + return $"\"type\": \"number\", \"format\": \"{numberFormat}\""; + case TDValues.TypeInteger: + string minProp = tdSchema.Minimum != null ? $", \"minimum\": {(int)tdSchema.Minimum}" : string.Empty; + string maxProp = tdSchema.Maximum != null ? $", \"maximum\": {(int)tdSchema.Maximum}" : string.Empty; + return $"\"type\": \"integer\"{minProp}{maxProp}"; + case TDValues.TypeBoolean: + return @"""type"": ""boolean"""; + } + + return @"""type"": ""null"""; + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/EnumJsonSchema.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/EnumJsonSchema.cs new file mode 100644 index 0000000000..1cfac733a5 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/EnumJsonSchema.cs @@ -0,0 +1,20 @@ +namespace Azure.Iot.Operations.SchemaGenerator +{ + public partial class EnumJsonSchema : ISchemaTemplateTransform + { + string schemaName; + EnumSpec enumSpec; + string genNamespace; + + internal EnumJsonSchema(string schemaName, EnumSpec enumSpec, string genNamespace) + { + this.schemaName = schemaName; + this.enumSpec = enumSpec; + this.genNamespace = genNamespace; + } + + public string FileName { get => $"{this.schemaName}.schema.json"; } + + public string FolderPath { get => this.genNamespace; } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/ObjectJsonSchema.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/ObjectJsonSchema.cs new file mode 100644 index 0000000000..c8c88e3589 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/ObjectJsonSchema.cs @@ -0,0 +1,20 @@ +namespace Azure.Iot.Operations.SchemaGenerator +{ + public partial class ObjectJsonSchema : ISchemaTemplateTransform + { + string schemaName; + ObjectSpec objectSpec; + string genNamespace; + + internal ObjectJsonSchema(string schemaName, ObjectSpec objectSpec, string genNamespace) + { + this.schemaName = schemaName; + this.objectSpec = objectSpec; + this.genNamespace = genNamespace; + } + + public string FileName { get => $"{this.schemaName}.schema.json"; } + + public string FolderPath { get => this.genNamespace; } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/EnumJsonSchema.tt b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/EnumJsonSchema.tt new file mode 100644 index 0000000000..526f23d179 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/EnumJsonSchema.tt @@ -0,0 +1,16 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="System.Collections.Generic" #> +<#@ import namespace="System.Linq" #> +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "<#=this.schemaName#>", + "type": "string", +<# if (this.enumSpec.Description != null) { #> + "description": "<#=this.enumSpec.Description#>", +<# } #> + "enum": [ +<# int ix = 1; foreach (string value in this.enumSpec.Values) { #> + "<#=value#>"<#=ix < this.enumSpec.Values.Count ? "," : ""#> +<# ix++; } #> + ] +} diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/ObjectJsonSchema.tt b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/ObjectJsonSchema.tt new file mode 100644 index 0000000000..9abf2d5b3b --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/ObjectJsonSchema.tt @@ -0,0 +1,27 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="System.Collections.Generic" #> +<#@ import namespace="System.Linq" #> +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "<#=this.schemaName#>", +<# if (this.objectSpec.Description != null) { #> + "description": "<#=this.objectSpec.Description#>", +<# } #> + "type": "object", + "additionalProperties": false, +<# if (this.objectSpec.Fields.Any(f => f.Value.Require || f.Value.Fragment)) { #> + "required": [ <#=string.Join(", ", this.objectSpec.Fields.Where(f => f.Value.Require || f.Value.Fragment).Select(f => $"\"{f.Key}\""))#> ], +<# } #> + "properties": { +<# int ix = 1; foreach (KeyValuePair field in this.objectSpec.Fields) { #> + "<#=field.Key#>": { + "description": "<#=field.Value.Description#>", +<# if (field.Value.Fragment) { #> + <#=JsonSchemaSupport.GetFragmented(JsonSchemaSupport.GetTypeAndAddenda(field.Value.Schema, field.Value.BackupSchemaName), field.Value.Require)#> +<# } else { #> + <#=JsonSchemaSupport.GetTypeAndAddenda(field.Value.Schema, field.Value.BackupSchemaName)#> +<# } #> + }<#=ix < this.objectSpec.Fields.Count ? "," : ""#> +<# ix++; } #> + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Azure.Iot.Operations.TDParser.csproj b/codegen2/src/Azure.Iot.Operations.TDParser/Azure.Iot.Operations.TDParser.csproj new file mode 100644 index 0000000000..0e0aa05263 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Azure.Iot.Operations.TDParser.csproj @@ -0,0 +1,8 @@ + + + + net9.0 + enable + + + diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAction.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAction.cs new file mode 100644 index 0000000000..838619ada0 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAction.cs @@ -0,0 +1,26 @@ +namespace Azure.Iot.Operations.TDParser.Model +{ + using System.Collections.Generic; + using System.Text.Json.Serialization; + + public class TDAction + { + [JsonPropertyName("description")] + public string? Description { get; set; } + + [JsonPropertyName("input")] + public TDDataSchema? Input { get; set; } + + [JsonPropertyName("output")] + public TDDataSchema? Output { get; set; } + + [JsonPropertyName("idempotent")] + public bool Idempotent { get; set; } + + [JsonPropertyName("safe")] + public bool Safe { get; set; } + + [JsonPropertyName("forms")] + public TDForm[]? Forms { get; set; } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAdditionalPropSpecifier.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAdditionalPropSpecifier.cs new file mode 100644 index 0000000000..de876b881a --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAdditionalPropSpecifier.cs @@ -0,0 +1,71 @@ +namespace Azure.Iot.Operations.TDParser.Model +{ + using System; + using System.Text.Json; + using System.Text.Json.Serialization; + + public class TDAdditionalPropSpecifier + { + public bool? Boolean { get; set; } + + public TDDataSchema? DataSchema { get; set; } + + public override string ToString() + { + if (Boolean.HasValue) + { + return Boolean.Value.ToString(); + } + else if (DataSchema != null) + { + return DataSchema.Type ?? string.Empty; + } + else + { + return string.Empty; + } + } + + public virtual bool Equals(TDAdditionalPropSpecifier? other) + { + if (other == null) + { + return false; + } + + return Boolean == other.Boolean && + ((DataSchema == null && other.DataSchema == null) || (DataSchema?.Equals(other.DataSchema) ?? false)); + } + } + + public sealed class AdditionalPropSpecifierJsonConverter : JsonConverter + { + public override TDAdditionalPropSpecifier Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return new TDAdditionalPropSpecifier + { + Boolean = reader.TokenType == JsonTokenType.True ? true : reader.TokenType == JsonTokenType.False ? false : (bool?)null, + DataSchema = reader.TokenType == JsonTokenType.StartObject ? JsonSerializer.Deserialize(ref reader, options) : null + }; + } + + public override void Write( + Utf8JsonWriter writer, + TDAdditionalPropSpecifier amount, + JsonSerializerOptions options) + { + if (amount.Boolean.HasValue) + { + writer.WriteBooleanValue(amount.Boolean.Value); + } + else if (amount.DataSchema != null) + { + JsonSerializer.Serialize(writer, amount.DataSchema, options); + } + else + { + writer.WriteNullValue(); + } + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDContextSpecifier.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDContextSpecifier.cs new file mode 100644 index 0000000000..8c58fe427c --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDContextSpecifier.cs @@ -0,0 +1,62 @@ +namespace Azure.Iot.Operations.TDParser.Model +{ + using System; + using System.Collections.Generic; + using System.Linq; + using System.Text.Json; + using System.Text.Json.Serialization; + + public class TDContextSpecifier + { + public string? Remote { get; set; } + + public Dictionary? Local { get; set; } + + public override string ToString() + { + if (Remote != null) + { + return Remote; + } + else if (Local != null) + { + return string.Join(", ", Local.Select(kv => $"{kv.Key}: {kv.Value}")); + } + else + { + return string.Empty; + } + } + } + + public sealed class ContextSpecifierJsonConverter : JsonConverter + { + public override TDContextSpecifier Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return new TDContextSpecifier + { + Remote = reader.TokenType == JsonTokenType.String ? reader.GetString() : null, + Local = reader.TokenType == JsonTokenType.StartObject ? JsonSerializer.Deserialize>(ref reader, options) : null + }; + } + + public override void Write( + Utf8JsonWriter writer, + TDContextSpecifier amount, + JsonSerializerOptions options) + { + if (amount.Remote != null) + { + writer.WriteStringValue(amount.Remote); + } + else if (amount.Local != null) + { + JsonSerializer.Serialize(writer, amount.Local, options); + } + else + { + writer.WriteNullValue(); + } + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs new file mode 100644 index 0000000000..e7c2367588 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs @@ -0,0 +1,83 @@ +namespace Azure.Iot.Operations.TDParser.Model +{ + using System.Collections.Generic; + using System.Linq; + using System.Text.Json.Serialization; + + public class TDDataSchema + { + [JsonPropertyName("title")] + public string? Title { get; set; } + + [JsonPropertyName("description")] + public string? Description { get; set; } + + [JsonPropertyName("type")] + public string? Type { get; set; } + + [JsonPropertyName("const")] + public int? Const { get; set; } + + [JsonPropertyName("minimum")] + public double? Minimum { get; set; } + + [JsonPropertyName("maximum")] + public double? Maximum { get; set; } + + [JsonPropertyName("format")] + public string? Format { get; set; } + + [JsonPropertyName("pattern")] + public string? Pattern { get; set; } + + [JsonPropertyName("contentEncoding")] + public string? ContentEncoding { get; set; } + + [JsonPropertyName("dtv:additionalProperties")] + public TDAdditionalPropSpecifier? AdditionalProperties { get; set; } + + [JsonPropertyName("enum")] + public string[]? Enum { get; set; } + + [JsonPropertyName("required")] + public string[]? Required { get; set; } + + [JsonPropertyName("dtv:errorMessage")] + public string? ErrorMessage { get; set; } + + [JsonPropertyName("properties")] + public Dictionary? Properties { get; set; } + + [JsonPropertyName("items")] + public TDDataSchema? Items { get; set; } + + public override int GetHashCode() + { + return (Title, Description, Type, Const, Minimum, Maximum, Format, Pattern, ContentEncoding, AdditionalProperties, Enum, Required, ErrorMessage, Properties, Items).GetHashCode(); + } + + public virtual bool Equals(TDDataSchema? other) + { + if (other == null) + { + return false; + } + + return Title == other.Title && + Description == other.Description && + Type == other.Type && + Const == other.Const && + Minimum == other.Minimum && + Maximum == other.Maximum && + Format == other.Format && + Pattern == other.Pattern && + ContentEncoding == other.ContentEncoding && + ((AdditionalProperties == null && other.AdditionalProperties == null) || (AdditionalProperties?.Equals(other.AdditionalProperties) ?? false)) && + ((Enum == null && other.Enum == null) || (Enum != null && other.Enum != null && Enum.SequenceEqual(other.Enum))) && + ((Required == null && other.Required == null) || (Required != null && other.Required != null && Required.SequenceEqual(other.Required))) && + ErrorMessage == other.ErrorMessage && + Properties?.Count == other.Properties?.Count && (Properties == null || Properties.OrderBy(kv => kv.Key).SequenceEqual(other.Properties!.OrderBy(kv => kv.Key))) && + ((Items == null && other.Items == null) || (Items?.Equals(other.Items) ?? false)); + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDEvent.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDEvent.cs new file mode 100644 index 0000000000..28062554b8 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDEvent.cs @@ -0,0 +1,20 @@ +namespace Azure.Iot.Operations.TDParser.Model +{ + using System.Collections.Generic; + using System.Text.Json.Serialization; + + public class TDEvent + { + [JsonPropertyName("description")] + public string? Description { get; set; } + + [JsonPropertyName("data")] + public TDDataSchema? Data { get; set; } + + [JsonPropertyName("dtv:placeholder")] + public bool Placeholder { get; set; } + + [JsonPropertyName("forms")] + public TDForm[]? Forms { get; set; } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDForm.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDForm.cs new file mode 100644 index 0000000000..5a02dd0781 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDForm.cs @@ -0,0 +1,31 @@ +namespace Azure.Iot.Operations.TDParser.Model +{ + using System.Text.Json.Serialization; + + public class TDForm + { + [JsonPropertyName("href")] + public string? Href { get; set; } + + [JsonPropertyName("contentType")] + public string? ContentType { get; set; } + + [JsonPropertyName("additionalResponses")] + public TDSchemaReference[]? AdditionalResponses { get; set; } + + [JsonPropertyName("dtv:headerInfo")] + public TDSchemaReference[]? HeaderInfo { get; set; } + + [JsonPropertyName("dtv:headerCode")] + public string[]? HeaderCode { get; set; } + + [JsonPropertyName("dtv:serviceGroupId")] + public string? ServiceGroupId { get; set; } + + [JsonPropertyName("dtv:topic")] + public string? Topic { get; set; } + + [JsonPropertyName("op")] + public string? Op { get; set; } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDLink.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDLink.cs new file mode 100644 index 0000000000..c2e45932f4 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDLink.cs @@ -0,0 +1,16 @@ +namespace Azure.Iot.Operations.TDParser.Model +{ + using System.Text.Json.Serialization; + + public class TDLink + { + [JsonPropertyName("href")] + public string? Href { get; set; } + + [JsonPropertyName("type")] + public string? ContentType { get; set; } + + [JsonPropertyName("rel")] + public string? Relation { get; set; } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDProperty.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDProperty.cs new file mode 100644 index 0000000000..b0e5e74673 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDProperty.cs @@ -0,0 +1,16 @@ +namespace Azure.Iot.Operations.TDParser.Model +{ + using System.Text.Json.Serialization; + + public class TDProperty : TDDataSchema + { + [JsonPropertyName("readOnly")] + public bool ReadOnly { get; set; } + + [JsonPropertyName("dtv:placeholder")] + public bool Placeholder { get; set; } + + [JsonPropertyName("forms")] + public TDForm[]? Forms { get; set; } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDSchemaReference.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDSchemaReference.cs new file mode 100644 index 0000000000..ea450c30e9 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDSchemaReference.cs @@ -0,0 +1,16 @@ +namespace Azure.Iot.Operations.TDParser.Model +{ + using System.Text.Json.Serialization; + + public class TDSchemaReference + { + [JsonPropertyName("success")] + public bool Success { get; set; } + + [JsonPropertyName("contentType")] + public string? ContentType { get; set; } + + [JsonPropertyName("schema")] + public string? Schema { get; set; } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDThing.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDThing.cs new file mode 100644 index 0000000000..5bac419ca8 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDThing.cs @@ -0,0 +1,35 @@ +namespace Azure.Iot.Operations.TDParser.Model +{ + using System.Collections.Generic; + using System.Text.Json.Serialization; + + public class TDThing + { + [JsonPropertyName("@context")] + public TDContextSpecifier[]? Context { get; set; } + + [JsonPropertyName("id")] + public string? Id { get; set; } + + [JsonPropertyName("title")] + public string? Title { get; set; } + + [JsonPropertyName("links")] + public List? Links { get; set; } + + [JsonPropertyName("schemaDefinitions")] + public Dictionary? SchemaDefinitions { get; set; } + + [JsonPropertyName("forms")] + public TDForm[]? Forms { get; set; } + + [JsonPropertyName("actions")] + public Dictionary? Actions { get; set; } + + [JsonPropertyName("properties")] + public Dictionary? Properties { get; set; } + + [JsonPropertyName("events")] + public Dictionary? Events { get; set; } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/TDParser.cs b/codegen2/src/Azure.Iot.Operations.TDParser/TDParser.cs new file mode 100644 index 0000000000..c76324048f --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TDParser/TDParser.cs @@ -0,0 +1,23 @@ +namespace Azure.Iot.Operations.TDParser +{ + using System.Text.Json; + using Azure.Iot.Operations.TDParser.Model; + + public class TDParser + { + private static JsonSerializerOptions serializerOptions = new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + Converters = + { + new ContextSpecifierJsonConverter(), + new AdditionalPropSpecifierJsonConverter(), + } + }; + + public static TDThing? Parse(string tdJson) + { + return JsonSerializer.Deserialize(tdJson, serializerOptions); + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/.gitignore b/codegen2/src/Azure.Iot.Operations.TypeGenerator/.gitignore new file mode 100644 index 0000000000..db669da381 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/.gitignore @@ -0,0 +1 @@ +**/t4/*.cs diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/Azure.Iot.Operations.TypeGenerator.csproj b/codegen2/src/Azure.Iot.Operations.TypeGenerator/Azure.Iot.Operations.TypeGenerator.csproj new file mode 100644 index 0000000000..d29a0bdb55 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/Azure.Iot.Operations.TypeGenerator.csproj @@ -0,0 +1,66 @@ + + + + net9.0 + enable + + + + + + + + + + + + + TextTemplatingFilePreprocessor + DotNetEnum.cs + Azure.Iot.Operations.TypeGenerator + + + TextTemplatingFilePreprocessor + DotNetObject.cs + Azure.Iot.Operations.TypeGenerator + + + TextTemplatingFilePreprocessor + RustEnum.cs + Azure.Iot.Operations.TypeGenerator + + + TextTemplatingFilePreprocessor + RustObject.cs + Azure.Iot.Operations.TypeGenerator + + + + + + + + + + True + True + DotNetEnum.tt + + + True + True + DotNetObject.tt + + + True + True + RustEnum.tt + + + True + True + RustObject.tt + + + + diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/DotNetTypeGenerator.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/DotNetTypeGenerator.cs new file mode 100644 index 0000000000..565b326e42 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/DotNetTypeGenerator.cs @@ -0,0 +1,21 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + using System; + using System.Linq; + using Azure.Iot.Operations.CodeGeneration; + + internal class DotNetTypeGenerator : ITypeGenerator + { + public GeneratedType GenerateTypeFromSchema(SchemaType schemaType, string projectName, SerializationFormat serFormat) + { + ITypeTemplateTransform templateTransform = schemaType switch + { + ObjectType objectType => new DotNetObject(projectName, objectType, serFormat), + EnumType enumType => new DotNetEnum(projectName, enumType), + _ => throw new Exception("unrecognized schema type"), + }; + + return new GeneratedType(templateTransform.TransformText(), templateTransform.FileName, templateTransform.FolderPath); + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/GeneratedType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/GeneratedType.cs new file mode 100644 index 0000000000..3a64a1f1e1 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/GeneratedType.cs @@ -0,0 +1,4 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + public record GeneratedType(string Content, string FileName, string FolderPath); +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/ISchemaStandardizer.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/ISchemaStandardizer.cs new file mode 100644 index 0000000000..5edceb94fd --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/ISchemaStandardizer.cs @@ -0,0 +1,12 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + using System.Collections.Generic; + using Azure.Iot.Operations.CodeGeneration; + + internal interface ISchemaStandardizer + { + SerializationFormat SerializationFormat { get; } + + List GetStandardizedSchemas(Dictionary schemaTextsByName, CodeName genNamespace); + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/ITypeGenerator.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/ITypeGenerator.cs new file mode 100644 index 0000000000..f70f41e948 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/ITypeGenerator.cs @@ -0,0 +1,10 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + using System; + using Azure.Iot.Operations.CodeGeneration; + + internal interface ITypeGenerator + { + GeneratedType GenerateTypeFromSchema(SchemaType schemaType, string projectName, SerializationFormat serFormat); + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/ITypeTemplateTransform.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/ITypeTemplateTransform.cs new file mode 100644 index 0000000000..8fab336dcc --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/ITypeTemplateTransform.cs @@ -0,0 +1,11 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + internal interface ITypeTemplateTransform + { + string FileName { get; } + + string FolderPath { get; } + + string TransformText(); + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs new file mode 100644 index 0000000000..a747874b6f --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs @@ -0,0 +1,208 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + using System; + using System.Collections.Generic; + using System.Linq; + using System.Text.Json; + using System.Text.RegularExpressions; + using Azure.Iot.Operations.CodeGeneration; + + internal class JsonSchemaStandardizer : ISchemaStandardizer + { + private readonly string[] InternalDefsKeys = new string[] { "$defs", "definitions" }; + + public SerializationFormat SerializationFormat { get => SerializationFormat.Json; } + + public List GetStandardizedSchemas(Dictionary schemaTextsByName, CodeName genNamespace) + { + List schemaTypes = new(); + + foreach (string schemaText in schemaTextsByName.Values) + { + using (JsonDocument schemaDoc = JsonDocument.Parse(schemaText)) + { + string? internalDefsKey = null; + foreach (string key in InternalDefsKeys) + { + if (schemaDoc.RootElement.TryGetProperty(key, out _)) + { + internalDefsKey = key; + break; + } + } + + CollateSchemaTypes(schemaDoc.RootElement, schemaDoc.RootElement, internalDefsKey, genNamespace, schemaTypes, schemaTextsByName); + + if (internalDefsKey != null) + { + if (schemaDoc.RootElement.TryGetProperty(internalDefsKey, out JsonElement defsElt)) + { + foreach (JsonProperty defProp in defsElt.EnumerateObject()) + { + CollateSchemaTypes(schemaDoc.RootElement, defProp.Value, internalDefsKey, genNamespace, schemaTypes, schemaTextsByName); + } + } + } + } + } + + return schemaTypes; + } + + internal void CollateSchemaTypes(JsonElement rootElt, JsonElement schemaElt, string? internalDefsKey, CodeName genNamespace, List schemaTypes, Dictionary schemaTextsByName) + { + string? title = schemaElt.GetProperty("title").GetString(); + if (string.IsNullOrEmpty(title)) + { + throw new InvalidOperationException($"The 'title' property is missing or empty in the JSON schema."); + } + CodeName schemaName = new CodeName((char.IsNumber(title[0]) ? "_" : "") + Regex.Replace(title, "[^a-zA-Z0-9]+", "_", RegexOptions.CultureInvariant)); + + string? description = schemaElt.TryGetProperty("description", out JsonElement descElt) ? descElt.GetString() : null; + + if (schemaElt.TryGetProperty("properties", out JsonElement propertiesElt) && schemaElt.GetProperty("type").GetString() == "object") + { + HashSet indirectFields = schemaElt.TryGetProperty("x-indirect", out JsonElement indirectElt) ? indirectElt.EnumerateArray().Select(e => e.GetString()!).ToHashSet() : new HashSet(); + HashSet requiredFields = schemaElt.TryGetProperty("required", out JsonElement requiredElt) ? requiredElt.EnumerateArray().Select(e => e.GetString()!).ToHashSet() : new HashSet(); + schemaTypes.Add(new ObjectType( + schemaName, + genNamespace, + description, + propertiesElt.EnumerateObject().ToDictionary(p => new CodeName(p.Name), p => GetObjectTypeFieldInfo(rootElt, p.Name, p.Value, internalDefsKey, indirectFields, requiredFields, genNamespace, schemaTextsByName)))); + } + else if (schemaElt.TryGetProperty("enum", out JsonElement enumElt)) + { + CodeName[] enumValues = enumElt.EnumerateArray().Select(e => new CodeName(e.GetString()!)).ToArray(); + schemaTypes.Add(new EnumType( + schemaName, + genNamespace, + description, + enumValues)); + } + } + + private ObjectType.FieldInfo GetObjectTypeFieldInfo(JsonElement rootElt, string fieldName, JsonElement schemaElt, string? internalDefsKey, HashSet indirectFields, HashSet requiredFields, CodeName genNamespace, Dictionary schemaTextsByName) + { + return new ObjectType.FieldInfo( + GetSchemaTypeFromJsonElement(rootElt, schemaElt, internalDefsKey, genNamespace, schemaTextsByName), + indirectFields.Contains(fieldName), + requiredFields.Contains(fieldName), + schemaElt.TryGetProperty("description", out JsonElement descElt) ? descElt.GetString() : null, + schemaElt.TryGetProperty("index", out JsonElement indexElt) ? indexElt.GetInt32() : null); + } + + private SchemaType GetSchemaTypeFromJsonElement(JsonElement rootElt, JsonElement schemaElt, string? internalDefsKey, CodeName genNamespace, Dictionary schemaTextsByName) + { + if (!schemaElt.TryGetProperty("$ref", out JsonElement referencingElt)) + { + return GetPrimitiveTypeFromJsonElement(rootElt, schemaElt, internalDefsKey, genNamespace, schemaTextsByName); + } + + string refString = referencingElt.GetString()!; + + if (internalDefsKey == null || !refString.StartsWith($"#/{internalDefsKey}/")) + { + using (JsonDocument refDoc = JsonDocument.Parse(schemaTextsByName[refString])) + { + string title = refDoc.RootElement.GetProperty("title").GetString()!; + string type = refDoc.RootElement.GetProperty("type").GetString()!; + return new ReferenceType(new CodeName(title), genNamespace, isNullable: type == "object"); + } + } + + JsonElement referencedElt = rootElt.GetProperty(internalDefsKey).GetProperty(refString.Substring($"#/{internalDefsKey}/".Length)); + + if (referencedElt.TryGetProperty("properties", out _) || referencedElt.TryGetProperty("enum", out _)) + { + string title = referencedElt.GetProperty("title").GetString()!; + string type = referencedElt.GetProperty("type").GetString()!; + return new ReferenceType(new CodeName(title), genNamespace, isNullable: type == "object"); + } + + return GetPrimitiveTypeFromJsonElement(rootElt, referencedElt, internalDefsKey, genNamespace, schemaTextsByName); + } + + private bool TryGetNestedNullableJsonElement(ref JsonElement jsonElement) + { + if (jsonElement.TryGetProperty("anyOf", out JsonElement anyOfElt) && anyOfElt.ValueKind == JsonValueKind.Array) + { + if (anyOfElt[0].TryGetProperty("type", out JsonElement typeElt) && typeElt.GetString() == "null") + { + jsonElement = anyOfElt[1]; + return true; + } + else if (anyOfElt[1].TryGetProperty("type", out typeElt) && typeElt.GetString() == "null") + { + jsonElement = anyOfElt[0]; + return true; + } + } + + return false; + } + + private SchemaType GetPrimitiveTypeFromJsonElement(JsonElement rootElt, JsonElement schemaElt, string? internalDefsKey, CodeName genNamespace, Dictionary schemaTextsByName) + { + switch (schemaElt.GetProperty("type").GetString()) + { + case "array": + return new ArrayType(GetSchemaTypeFromJsonElement(rootElt, schemaElt.GetProperty("items"), internalDefsKey, genNamespace, schemaTextsByName)); + case "object": + JsonElement typeAndAddendaElt = schemaElt.GetProperty("additionalProperties"); + bool nullValues = TryGetNestedNullableJsonElement(ref typeAndAddendaElt); + return new MapType(GetSchemaTypeFromJsonElement(rootElt, typeAndAddendaElt, internalDefsKey, genNamespace, schemaTextsByName), nullValues); + case "boolean": + return new BooleanType(); + case "number": + return schemaElt.GetProperty("format").GetString() == "float" ? new FloatType() : new DoubleType(); + case "integer": + return schemaElt.GetProperty("maximum").GetUInt64() switch + { + < 128 => new ByteType(), + < 256 => new UnsignedByteType(), + < 32768 => new ShortType(), + < 65536 => new UnsignedShortType(), + < 2147483648 => new IntegerType(), + < 4294967296 => new UnsignedIntegerType(), + < 9223372036854775808 => new LongType(), + _ => new UnsignedLongType(), + }; + case "string": + if (schemaElt.TryGetProperty("format", out JsonElement formatElt)) + { + return formatElt.GetString() switch + { + "date" => new DateType(), + "date-time" => new DateTimeType(), + "time" => new TimeType(), + "duration" => new DurationType(), + "uuid" => new UuidType(), + _ => throw new Exception($"unrecognized 'string' schema (format = {formatElt.GetString()})"), + }; + } + + if (schemaElt.TryGetProperty("contentEncoding", out JsonElement encodingElt)) + { + return encodingElt.GetString() switch + { + "base64" => new BytesType(), + _ => throw new Exception($"unrecognized 'string' schema (contentEncoding = {encodingElt.GetString()})"), + }; + } + + if (schemaElt.TryGetProperty("pattern", out JsonElement patternElt)) + { + return patternElt.GetString() switch + { + "^(?:\\+|-)?(?:[1-9][0-9]*|0)(?:\\.[0-9]*)?$" => new DecimalType(), + _ => throw new Exception($"unrecognized 'string' schema (pattern = {patternElt.GetString()})"), + }; + } + + return new StringType(); + default: + throw new Exception($"unrecognized schema (type = {schemaElt.GetProperty("type").GetString()})"); + } + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/RustTypeGenerator.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/RustTypeGenerator.cs new file mode 100644 index 0000000000..6eb4c4856c --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/RustTypeGenerator.cs @@ -0,0 +1,21 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + using System; + using System.Linq; + using Azure.Iot.Operations.CodeGeneration; + + internal class RustTypeGenerator : ITypeGenerator + { + public GeneratedType GenerateTypeFromSchema(SchemaType schemaType, string projectName, SerializationFormat serFormat) + { + ITypeTemplateTransform templateTransform = schemaType switch + { + ObjectType objectType => new RustObject(objectType, allowSkipping: serFormat == SerializationFormat.Json), + EnumType enumType => new RustEnum(enumType), + _ => throw new Exception("unrecognized schema type"), + }; + + return new GeneratedType(templateTransform.TransformText(), templateTransform.FileName, templateTransform.FolderPath); + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/TypeGenerator.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/TypeGenerator.cs new file mode 100644 index 0000000000..dce7fa7045 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/TypeGenerator.cs @@ -0,0 +1,40 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + using System; + using System.Collections.Generic; + using Azure.Iot.Operations.CodeGeneration; + + public class TypeGenerator + { + private ISchemaStandardizer schemaStandardizer; + private ITypeGenerator typeGenerator; + + public TypeGenerator(SerializationFormat serializationFormat, TargetLanguage targetLanguage) + { + this.schemaStandardizer = serializationFormat switch + { + SerializationFormat.Json => new JsonSchemaStandardizer(), + _ => throw new NotSupportedException($"Serialization format {serializationFormat} is not supported."), + }; + + this.typeGenerator = targetLanguage switch + { + TargetLanguage.CSharp => new DotNetTypeGenerator(), + TargetLanguage.Rust => new RustTypeGenerator(), + _ => throw new NotSupportedException($"Target language {targetLanguage} is not supported."), + }; + } + + public List GenerateTypes(Dictionary schemaTextsByName, CodeName genNamespace, string projectName) + { + List generatedTypes = new(); + + foreach (SchemaType schemaType in schemaStandardizer.GetStandardizedSchemas(schemaTextsByName, genNamespace)) + { + generatedTypes.Add(this.typeGenerator.GenerateTypeFromSchema(schemaType, projectName, schemaStandardizer.SerializationFormat)); + } + + return generatedTypes; + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/TypeGeneratorSupport.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/TypeGeneratorSupport.cs new file mode 100644 index 0000000000..577c1d1c04 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/TypeGeneratorSupport.cs @@ -0,0 +1,36 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + using System.Collections.Generic; + + internal static class TypeGeneratorSupport + { + internal static IReadOnlyCollection GetReferencedSchemas(SchemaType schemaType) + { + HashSet referencedSchemas = new(); + AddReferencedSchemaNames(referencedSchemas, schemaType); + return referencedSchemas; + } + + private static void AddReferencedSchemaNames(HashSet referencedSchemas, SchemaType schemaType) + { + switch (schemaType) + { + case ArrayType arrayType: + AddReferencedSchemaNames(referencedSchemas, arrayType.ElementSchema); + break; + case MapType mapType: + AddReferencedSchemaNames(referencedSchemas, mapType.ValueSchema); + break; + case ObjectType objectType: + foreach (var fieldInfo in objectType.FieldInfos) + { + AddReferencedSchemaNames(referencedSchemas, fieldInfo.Value.SchemaType); + } + break; + case ReferenceType referenceType: + referencedSchemas.Add(referenceType); + break; + } + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ArrayType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ArrayType.cs new file mode 100644 index 0000000000..da28581f71 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ArrayType.cs @@ -0,0 +1,14 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + internal class ArrayType : SchemaType + { + internal override SchemaKind Kind { get => SchemaKind.Array; } + + internal ArrayType(SchemaType elementSchema) + { + ElementSchema = elementSchema; + } + + internal SchemaType ElementSchema { get; set; } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/BooleanType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/BooleanType.cs new file mode 100644 index 0000000000..54330299b3 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/BooleanType.cs @@ -0,0 +1,11 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + internal class BooleanType : SchemaType + { + internal override SchemaKind Kind { get => SchemaKind.Boolean; } + + internal BooleanType() + { + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ByteType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ByteType.cs new file mode 100644 index 0000000000..27f0a5e4c2 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ByteType.cs @@ -0,0 +1,11 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + internal class ByteType : SchemaType + { + internal override SchemaKind Kind { get => SchemaKind.Byte; } + + internal ByteType() + { + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/BytesType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/BytesType.cs new file mode 100644 index 0000000000..30da5a18a1 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/BytesType.cs @@ -0,0 +1,11 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + internal class BytesType : SchemaType + { + internal override SchemaKind Kind { get => SchemaKind.Bytes; } + + internal BytesType() + { + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DateTimeType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DateTimeType.cs new file mode 100644 index 0000000000..743c142e06 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DateTimeType.cs @@ -0,0 +1,11 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + internal class DateTimeType : SchemaType + { + internal override SchemaKind Kind { get => SchemaKind.DateTime; } + + internal DateTimeType() + { + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DateType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DateType.cs new file mode 100644 index 0000000000..86e6b1638e --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DateType.cs @@ -0,0 +1,11 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + internal class DateType : SchemaType + { + internal override SchemaKind Kind { get => SchemaKind.Date; } + + internal DateType() + { + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DecimalType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DecimalType.cs new file mode 100644 index 0000000000..98ed164eff --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DecimalType.cs @@ -0,0 +1,11 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + internal class DecimalType : SchemaType + { + internal override SchemaKind Kind { get => SchemaKind.Decimal; } + + internal DecimalType() + { + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DoubleType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DoubleType.cs new file mode 100644 index 0000000000..d8b404a12d --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DoubleType.cs @@ -0,0 +1,11 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + internal class DoubleType : SchemaType + { + internal override SchemaKind Kind { get => SchemaKind.Double; } + + internal DoubleType() + { + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DurationType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DurationType.cs new file mode 100644 index 0000000000..244761dc93 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DurationType.cs @@ -0,0 +1,11 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + internal class DurationType : SchemaType + { + internal override SchemaKind Kind { get => SchemaKind.Duration; } + + internal DurationType() + { + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/EnumType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/EnumType.cs new file mode 100644 index 0000000000..394a38de79 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/EnumType.cs @@ -0,0 +1,25 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + + internal class EnumType : SchemaType + { + internal override SchemaKind Kind { get => SchemaKind.Enum; } + + internal EnumType(CodeName schemaName, CodeName genNamespace, string? description, CodeName[] enumValues) + { + SchemaName = schemaName; + Namespace = genNamespace; + Description = description; + EnumValues = enumValues; + } + + internal CodeName SchemaName { get; } + + internal CodeName Namespace { get; } + + internal string? Description { get; } + + internal CodeName[] EnumValues { get; } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/FloatType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/FloatType.cs new file mode 100644 index 0000000000..8122e12234 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/FloatType.cs @@ -0,0 +1,11 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + internal class FloatType : SchemaType + { + internal override SchemaKind Kind { get => SchemaKind.Float; } + + internal FloatType() + { + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/IntegerType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/IntegerType.cs new file mode 100644 index 0000000000..b0a1910ea8 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/IntegerType.cs @@ -0,0 +1,11 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + internal class IntegerType : SchemaType + { + internal override SchemaKind Kind { get => SchemaKind.Integer; } + + internal IntegerType() + { + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/LongType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/LongType.cs new file mode 100644 index 0000000000..f294b5f23f --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/LongType.cs @@ -0,0 +1,11 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + internal class LongType : SchemaType + { + internal override SchemaKind Kind { get => SchemaKind.Long; } + + internal LongType() + { + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/MapType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/MapType.cs new file mode 100644 index 0000000000..1f74d15511 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/MapType.cs @@ -0,0 +1,17 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + internal class MapType : SchemaType + { + internal override SchemaKind Kind { get => SchemaKind.Map; } + + internal MapType(SchemaType valueSchema, bool nullValues) + { + ValueSchema = valueSchema; + NullValues = nullValues; + } + + internal SchemaType ValueSchema { get; set; } + + internal bool NullValues { get; set; } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ObjectType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ObjectType.cs new file mode 100644 index 0000000000..0fefbb31dd --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ObjectType.cs @@ -0,0 +1,48 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + using System.Collections.Generic; + using Azure.Iot.Operations.CodeGeneration; + + internal class ObjectType : SchemaType + { + internal override SchemaKind Kind { get => SchemaKind.Object; } + + internal ObjectType(CodeName schemaName, CodeName genNamespace, string? description, Dictionary fieldInfos) + { + SchemaName = schemaName; + Namespace = genNamespace; + Description = description; + FieldInfos = fieldInfos; + } + + internal CodeName SchemaName { get; } + + internal CodeName Namespace { get; } + + internal string? Description { get; } + + internal Dictionary FieldInfos { get; } + + internal class FieldInfo + { + internal FieldInfo(SchemaType schemaType, bool isIndirect, bool isRequired, string? description, int? index) + { + SchemaType = schemaType; + IsIndirect = isIndirect; + IsRequired = isRequired; + Description = description; + Index = index; + } + + internal SchemaType SchemaType { get; } + + internal bool IsIndirect { get; } + + internal bool IsRequired { get; } + + internal string? Description { get; } + + internal int? Index { get; } + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ReferenceType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ReferenceType.cs new file mode 100644 index 0000000000..66aa9a8f42 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ReferenceType.cs @@ -0,0 +1,40 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + + internal class ReferenceType : SchemaType + { + internal override SchemaKind Kind { get => SchemaKind.Reference; } + + internal ReferenceType(CodeName schemaName, CodeName genNamespace, bool isNullable = true, bool isEnum = false) + { + SchemaName = schemaName; + Namespace = genNamespace; + IsNullable = isNullable; + IsEnum = isEnum; + } + + internal CodeName SchemaName { get; } + + internal CodeName Namespace { get; } + + internal bool IsNullable { get; } + + internal bool IsEnum { get; } + + public override bool Equals(object? obj) + { + return Equals(obj as ReferenceType); + } + + internal bool Equals(ReferenceType? other) + { + return !ReferenceEquals(null, other) && SchemaName.Equals(other.SchemaName) && Namespace.Equals(other.Namespace); + } + + public override int GetHashCode() + { + return SchemaName.GetHashCode() ^ Namespace.GetHashCode(); + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/SchemaKind.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/SchemaKind.cs new file mode 100644 index 0000000000..caf0f4a4bf --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/SchemaKind.cs @@ -0,0 +1,31 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + internal enum SchemaKind + { + Array, + Boolean, + Bytes, + Byte, + DateTime, + Date, + Decimal, + Double, + Duration, + Enum, + Float, + Integer, + Long, + Map, + Object, + Reference, + Schema, + Short, + String, + Time, + UnsignedByte, + UnsignedInteger, + UnsignedLong, + UnsignedShort, + Uuid, + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/SchemaType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/SchemaType.cs new file mode 100644 index 0000000000..969dafa9e1 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/SchemaType.cs @@ -0,0 +1,7 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + internal abstract class SchemaType + { + internal abstract SchemaKind Kind { get; } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ShortType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ShortType.cs new file mode 100644 index 0000000000..6d5e52c531 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ShortType.cs @@ -0,0 +1,11 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + internal class ShortType : SchemaType + { + internal override SchemaKind Kind { get => SchemaKind.Short; } + + internal ShortType() + { + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/StringType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/StringType.cs new file mode 100644 index 0000000000..72fc46f560 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/StringType.cs @@ -0,0 +1,11 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + internal class StringType : SchemaType + { + internal override SchemaKind Kind { get => SchemaKind.String; } + + internal StringType() + { + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/TimeType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/TimeType.cs new file mode 100644 index 0000000000..a390fba072 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/TimeType.cs @@ -0,0 +1,11 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + internal class TimeType : SchemaType + { + internal override SchemaKind Kind { get => SchemaKind.Time; } + + internal TimeType() + { + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedByteType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedByteType.cs new file mode 100644 index 0000000000..5bc3875205 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedByteType.cs @@ -0,0 +1,11 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + internal class UnsignedByteType : SchemaType + { + internal override SchemaKind Kind { get => SchemaKind.UnsignedByte; } + + internal UnsignedByteType() + { + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedIntegerType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedIntegerType.cs new file mode 100644 index 0000000000..6df92d8ae4 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedIntegerType.cs @@ -0,0 +1,11 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + internal class UnsignedIntegerType : SchemaType + { + internal override SchemaKind Kind { get => SchemaKind.UnsignedInteger; } + + internal UnsignedIntegerType() + { + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedLongType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedLongType.cs new file mode 100644 index 0000000000..8b7ed7b5d5 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedLongType.cs @@ -0,0 +1,11 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + internal class UnsignedLongType : SchemaType + { + internal override SchemaKind Kind { get => SchemaKind.UnsignedLong; } + + internal UnsignedLongType() + { + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedShortType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedShortType.cs new file mode 100644 index 0000000000..114b604b69 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedShortType.cs @@ -0,0 +1,11 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + internal class UnsignedShortType : SchemaType + { + internal override SchemaKind Kind { get => SchemaKind.UnsignedShort; } + + internal UnsignedShortType() + { + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UuidType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UuidType.cs new file mode 100644 index 0000000000..52998fbde1 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UuidType.cs @@ -0,0 +1,11 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + internal class UuidType : SchemaType + { + internal override SchemaKind Kind { get => SchemaKind.Uuid; } + + internal UuidType() + { + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/DotNetSchemaSupport.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/DotNetSchemaSupport.cs new file mode 100644 index 0000000000..f214063f28 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/DotNetSchemaSupport.cs @@ -0,0 +1,55 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + using System; + using Azure.Iot.Operations.CodeGeneration; + + internal static class DotNetSchemaSupport + { + internal static string GetType(SchemaType schemaType) + { + return schemaType switch + { + ArrayType arrayType => $"List<{GetType(arrayType.ElementSchema)}>", + MapType mapType => $"Dictionary", + ObjectType objectType => objectType.SchemaName.GetTypeName(TargetLanguage.CSharp), + EnumType enumType => enumType.SchemaName.GetTypeName(TargetLanguage.CSharp), + BooleanType _ => "bool", + DoubleType _ => "double", + FloatType _ => "float", + IntegerType _ => "int", + LongType _ => "long", + ByteType _ => "sbyte", + ShortType _ => "short", + UnsignedIntegerType _ => "uint", + UnsignedLongType _ => "ulong", + UnsignedByteType _ => "byte", + UnsignedShortType _ => "ushort", + DateType _ => "DateOnly", + DateTimeType _ => "DateTime", + TimeType _ => "TimeOnly", + DurationType _ => "TimeSpan", + UuidType _ => "Guid", + StringType _ => "string", + BytesType _ => "byte[]", + DecimalType _ => "DecimalString", + ReferenceType referenceType => referenceType.SchemaName.GetTypeName(TargetLanguage.CSharp), + _ => throw new Exception($"unrecognized SchemaType type {schemaType.GetType()}"), + }; + } + + internal static bool IsNullable(SchemaType schemaType) + { + return schemaType switch + { + ArrayType _ => true, + MapType _ => true, + ObjectType _ => true, + StringType _ => true, + BytesType _ => true, + DecimalType _ => true, + ReferenceType refType => refType.IsNullable, + _ => false, + }; + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/code/DotNetEnum.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/code/DotNetEnum.cs new file mode 100644 index 0000000000..47e61ea021 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/code/DotNetEnum.cs @@ -0,0 +1,20 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + + public partial class DotNetEnum : ITypeTemplateTransform + { + private readonly string projectName; + private readonly EnumType enumType; + + internal DotNetEnum(string projectName, EnumType enumType) + { + this.projectName = projectName; + this.enumType = enumType; + } + + public string FileName { get => $"{this.enumType.SchemaName.GetFileName(TargetLanguage.CSharp)}.g.cs"; } + + public string FolderPath { get => this.enumType.Namespace.GetFolderName(TargetLanguage.CSharp); } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/code/DotNetObject.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/code/DotNetObject.cs new file mode 100644 index 0000000000..8046e34072 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/code/DotNetObject.cs @@ -0,0 +1,28 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + using System.Collections.Generic; + using System.Linq; + using Azure.Iot.Operations.CodeGeneration; + + public partial class DotNetObject : ITypeTemplateTransform + { + private readonly string projectName; + private readonly ObjectType objectType; + private readonly HashSet referencedNamespaces; + private readonly SerializationFormat serFormat; + private readonly bool needsNullCheck; + + internal DotNetObject(string projectName, ObjectType objectType, SerializationFormat serFormat) + { + this.projectName = projectName; + this.objectType = objectType; + this.referencedNamespaces = new(TypeGeneratorSupport.GetReferencedSchemas(objectType).Select(s => s.Namespace).Where(n => !n.Equals(objectType.Namespace))); + this.serFormat = serFormat; + this.needsNullCheck = objectType.FieldInfos.Any(fi => fi.Value.IsRequired && DotNetSchemaSupport.IsNullable(fi.Value.SchemaType)); + } + + public string FileName { get => $"{this.objectType.SchemaName.GetFileName(TargetLanguage.CSharp)}.g.cs"; } + + public string FolderPath { get => this.objectType.Namespace.GetFolderName(TargetLanguage.CSharp); } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetEnum.tt b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetEnum.tt new file mode 100644 index 0000000000..34385a9ce0 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetEnum.tt @@ -0,0 +1,26 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="System.Linq" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by <#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Name#> v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ + +#nullable enable +<# if (this.enumType.SchemaName.AsGiven.All(c => char.IsLower(c))) { #> + +#pragma warning disable CS8981 // The type name '<#=this.enumType.SchemaName.AsGiven#>' only contains lower-cased ascii characters. +<# } #> + +namespace <#=this.projectName#>.<#=this.enumType.Namespace.GetTypeName(TargetLanguage.CSharp)#> +{ +<# if (this.enumType.Description != null) { #> + /// + /// <#=this.enumType.Description#> + /// +<# } #> + [System.CodeDom.Compiler.GeneratedCode("Azure.Iot.Operations.ProtocolCompilerLib", "<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>")] + public enum <#=this.enumType.SchemaName.AsGiven#> + { +<# foreach (var enumValue in this.enumType.EnumValues) { #> + <#=enumValue.AsGiven#>, +<# } #> + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetObject.tt b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetObject.tt new file mode 100644 index 0000000000..385da9f1c1 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetObject.tt @@ -0,0 +1,79 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by <#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Name#> v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ + +#nullable enable + +namespace <#=this.projectName#>.<#=this.objectType.Namespace.GetTypeName(TargetLanguage.CSharp)#> +{ + using System; + using System.Collections.Generic; +<# if (this.serFormat == SerializationFormat.Json) { #> + using System.Text.Json.Serialization; +<# } #> + using <#=this.projectName#>; +<# foreach (CodeName referencedNamespace in this.referencedNamespaces) { #> + using <#=this.projectName#>.<#=referencedNamespace.GetTypeName(TargetLanguage.CSharp)#>; +<# } #> + +<# if (this.objectType.Description != null) { #> + /// + /// <#=this.objectType.Description#> + /// +<# } #> + [System.CodeDom.Compiler.GeneratedCode("Azure.Iot.Operations.ProtocolCompilerLib", "<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>")] + public partial class <#=this.objectType.SchemaName.GetTypeName(TargetLanguage.CSharp)#><#=this.Exports()#> + { +<# foreach (var fieldInfo in this.objectType.FieldInfos) { #> +<# if (fieldInfo.Value.Description != null) { #> + /// + /// <#=fieldInfo.Value.Description#> + /// +<# } #> +<# if (this.serFormat == SerializationFormat.Json) { #> + [JsonPropertyName("<#=fieldInfo.Key.AsGiven#>")] + [JsonIgnore(Condition = JsonIgnoreCondition.<#=fieldInfo.Value.IsRequired ? "Never" : "WhenWritingDefault"#>)] +<# if (fieldInfo.Value.IsRequired) { #> + [JsonRequired] +<# } #> +<# } #> +<# if (fieldInfo.Value.Index != null) { #> + [Dahomey.Cbor.Attributes.CborPropertyAttribute(index: <#=fieldInfo.Value.Index#>)] +<# } #> + public <#=DotNetSchemaSupport.GetType(fieldInfo.Value.SchemaType)#><#=fieldInfo.Value.IsRequired ? "" : "?"#> <#=fieldInfo.Key.GetFieldName(TargetLanguage.CSharp)#> { get; set; } = default<#=fieldInfo.Value.IsRequired ? "!" : ""#>; + +<# } #> +<# if (this.serFormat == SerializationFormat.Json && this.needsNullCheck) { #> + void IJsonOnDeserialized.OnDeserialized() + { +<# foreach (var fieldInfo in this.objectType.FieldInfos) { #> +<# if (fieldInfo.Value.IsRequired && DotNetSchemaSupport.IsNullable(fieldInfo.Value.SchemaType)) { #> + if (<#=fieldInfo.Key.GetFieldName(TargetLanguage.CSharp)#> is null) + { + throw new ArgumentNullException("<#=fieldInfo.Key.AsGiven#> field cannot be null"); + } +<# } #> +<# } #> + } + + void IJsonOnSerializing.OnSerializing() + { +<# foreach (var fieldInfo in this.objectType.FieldInfos) { #> +<# if (fieldInfo.Value.IsRequired && DotNetSchemaSupport.IsNullable(fieldInfo.Value.SchemaType)) { #> + if (<#=fieldInfo.Key.GetFieldName(TargetLanguage.CSharp)#> is null) + { + throw new ArgumentNullException("<#=fieldInfo.Key.AsGiven#> field cannot be null"); + } +<# } #> +<# } #> + } +<# } #> + } +} +<#+ + public string Exports() => this.serFormat switch + { + SerializationFormat.Json when this.needsNullCheck => " : IJsonOnDeserialized, IJsonOnSerializing", + _ => "", + }; +#> diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/RustSchemaSupport.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/RustSchemaSupport.cs new file mode 100644 index 0000000000..9cf7a741b9 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/RustSchemaSupport.cs @@ -0,0 +1,54 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + using System; + using Azure.Iot.Operations.CodeGeneration; + + internal static class RustSchemaSupport + { + internal static string GetType(SchemaType schemaType, bool isIndirect, bool isRequired) + { + string innerType = schemaType switch + { + ArrayType arrayType => $"Vec<{GetType(arrayType.ElementSchema, false, true)}>", + MapType mapType => $"HashMap", + ObjectType objectType => objectType.SchemaName.GetTypeName(TargetLanguage.Rust), + EnumType enumType => enumType.SchemaName.GetTypeName(TargetLanguage.Rust), + BooleanType _ => "bool", + DoubleType _ => "f64", + FloatType _ => "f32", + IntegerType _ => "i32", + LongType _ => "i64", + ByteType _ => "i8", + ShortType _ => "i16", + UnsignedIntegerType _ => "u32", + UnsignedLongType _ => "u64", + UnsignedByteType _ => "u8", + UnsignedShortType _ => "u16", + DateType _ => "Date", + DateTimeType _ => "DateTime", + TimeType _ => "Time", + DurationType _ => "Duration", + UuidType _ => "Uuid", + StringType _ => "String", + BytesType _ => "Bytes", + DecimalType _ => "Decimal", + ReferenceType referenceType => referenceType.SchemaName.GetTypeName(TargetLanguage.Rust), + _ => throw new Exception($"unrecognized SchemaType type {schemaType.GetType()}"), + }; + + string wrappedType = isIndirect ? $"Box<{innerType}>" : innerType; + + return isRequired ? wrappedType : $"Option<{wrappedType}>"; + } + + internal static bool HasNativeDefault(SchemaType schemaType) + { + return schemaType switch + { + ArrayType _ => true, + MapType _ => true, + _ => false, + }; + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/code/RustEnum.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/code/RustEnum.cs new file mode 100644 index 0000000000..2fa417bf84 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/code/RustEnum.cs @@ -0,0 +1,18 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + + public partial class RustEnum : ITypeTemplateTransform + { + private readonly EnumType enumType; + + internal RustEnum(EnumType enumType) + { + this.enumType = enumType; + } + + public string FileName { get => $"{this.enumType.SchemaName.GetFileName(TargetLanguage.Rust)}.rs"; } + + public string FolderPath { get => this.enumType.Namespace.GetFolderName(TargetLanguage.Rust); } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/code/RustObject.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/code/RustObject.cs new file mode 100644 index 0000000000..ce44081261 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/code/RustObject.cs @@ -0,0 +1,23 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + using System.Collections.Generic; + using Azure.Iot.Operations.CodeGeneration; + + public partial class RustObject : ITypeTemplateTransform + { + private readonly ObjectType objectType; + private readonly IReadOnlyCollection referencedSchemas; + private readonly bool allowSkipping; + + internal RustObject(ObjectType objectType, bool allowSkipping) + { + this.objectType = objectType; + this.referencedSchemas = TypeGeneratorSupport.GetReferencedSchemas(objectType); + this.allowSkipping = allowSkipping; + } + + public string FileName { get => $"{this.objectType.SchemaName.GetFileName(TargetLanguage.Rust)}.rs"; } + + public string FolderPath { get => this.objectType.Namespace.GetFolderName(TargetLanguage.Rust); } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustEnum.tt b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustEnum.tt new file mode 100644 index 0000000000..a01e17d2c6 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustEnum.tt @@ -0,0 +1,15 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by <#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Name#> v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ + +use serde::{Deserialize, Serialize}; + +<# if (this.enumType.Description != null) { #> +/// <#=this.enumType.Description#> +<# } #> +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum <#=this.enumType.SchemaName.GetTypeName(TargetLanguage.Rust)#> { +<# int index = 0; foreach (var enumValue in this.enumType.EnumValues) { #> + <#=enumValue.AsGiven#>, +<# ++index; } #> +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustObject.tt b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustObject.tt new file mode 100644 index 0000000000..9be59952c0 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustObject.tt @@ -0,0 +1,50 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by <#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Name#> v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ +#![allow(unused_imports)] + +use std::collections::HashMap; + +use chrono::{DateTime, Utc}; +use derive_builder::Builder; +use iso8601_duration::Duration; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +<# foreach (var referencedSchema in this.referencedSchemas) { #> +<# if (!referencedSchema.SchemaName.Equals(this.objectType.SchemaName)) { #> +<# if (referencedSchema.Namespace.Equals(this.objectType.Namespace)) { #> +use super::<#=referencedSchema.SchemaName.GetFileName(TargetLanguage.Rust)#>::<#=referencedSchema.SchemaName.GetTypeName(TargetLanguage.Rust)#>; +<# } else { #> +use super::super::<#=referencedSchema.Namespace.GetFolderName(TargetLanguage.Rust)#>::<#=referencedSchema.SchemaName.GetFileName(TargetLanguage.Rust)#>::<#=referencedSchema.SchemaName.GetTypeName(TargetLanguage.Rust)#>; +<# } #> +<# } #> +<# } #> +use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; + +<# if (this.objectType.Description != null) { #> +/// <#=this.objectType.Description#> +<# } #> +#[derive(Serialize, Deserialize, Debug, Clone, Builder)] +pub struct <#=this.objectType.SchemaName.GetTypeName(TargetLanguage.Rust)#> { +<# bool firstField = true; foreach (var fieldInfo in this.objectType.FieldInfos) { #> +<# if (!firstField) { #> + +<# } #> +<# if (fieldInfo.Value.Description != null) { #> + /// <#=fieldInfo.Value.Description#> +<# } #> +<# if (fieldInfo.Key.GetFieldName(TargetLanguage.Rust) != fieldInfo.Key.AsGiven) { #> + #[serde(rename = "<#=fieldInfo.Key.AsGiven#>")] +<# } #> +<# if (!fieldInfo.Value.IsRequired) { #> +<# if (this.allowSkipping) { #> + #[serde(skip_serializing_if = "Option::is_none")] +<# } #> + #[builder(default = "None")] +<# } else if (RustSchemaSupport.HasNativeDefault(fieldInfo.Value.SchemaType)) { #> + #[builder(default)] +<# } #> + pub <#=fieldInfo.Key.GetFieldName(TargetLanguage.Rust)#>: <#=RustSchemaSupport.GetType(fieldInfo.Value.SchemaType, fieldInfo.Value.IsIndirect, fieldInfo.Value.IsRequired)#>, +<# firstField = false; } #> +} diff --git a/codegen2/src/SchemaTester/Program.cs b/codegen2/src/SchemaTester/Program.cs new file mode 100644 index 0000000000..30378b931e --- /dev/null +++ b/codegen2/src/SchemaTester/Program.cs @@ -0,0 +1,63 @@ +namespace SchemaTester +{ + using System; + using System.Collections.Generic; + using System.IO; + using System.Linq; + using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser; + using Azure.Iot.Operations.TDParser.Model; + using Azure.Iot.Operations.SchemaGenerator; + + internal class Program + { + static void Main(string[] args) + { + if (args.Length < 2) + { + Console.WriteLine("Usage: SchemaTester "); + return; + } + + DirectoryInfo modelFolder = new DirectoryInfo(args[0]); + if (!modelFolder.Exists) + { + Console.WriteLine($"Folder not found: {modelFolder.FullName}"); + return; + } + + DirectoryInfo outputFolder = new DirectoryInfo(args[1]); + + Dictionary modelTextsByName = modelFolder.GetFiles("*.TD.json").ToDictionary(f => f.Name, f => File.ReadAllText(f.FullName)); + + foreach (KeyValuePair modelNameAndText in modelTextsByName) + { + TDThing? thing = TDParser.Parse(modelNameAndText.Value); + if (thing == null) + { + Console.WriteLine($"Failed to parse model: {modelNameAndText.Key}"); + continue; + } + + Console.WriteLine($"Processing model: {modelNameAndText.Key}"); + + string? schemaNamesFilename = thing.Links?.FirstOrDefault(l => l.Relation == TDValues.RelationSchemaNaming)?.Href; + string? schemaNameInfoText = schemaNamesFilename != null ? File.ReadAllText(Path.Combine(modelFolder.FullName, schemaNamesFilename)) : null; + SchemaNamer schemaNamer = new SchemaNamer(schemaNameInfoText); + + foreach (GeneratedSchema genSchema in SchemaGenerator.GenerateSchemas(thing, schemaNamer, "GeneratedProject", "Namespace")) + { + DirectoryInfo folderPath = new DirectoryInfo(Path.Combine(outputFolder.FullName, genSchema.FolderPath)); + if (!folderPath.Exists) + { + folderPath.Create(); + } + + string filePath = Path.Combine(folderPath.FullName, genSchema.FileName); + File.WriteAllText(filePath, genSchema.Content); + Console.WriteLine($"Generated {filePath}"); + } + } + } + } +} diff --git a/codegen2/src/SchemaTester/SchemaTester.csproj b/codegen2/src/SchemaTester/SchemaTester.csproj new file mode 100644 index 0000000000..e8a4720023 --- /dev/null +++ b/codegen2/src/SchemaTester/SchemaTester.csproj @@ -0,0 +1,14 @@ + + + + Exe + net9.0 + enable + + + + + + + + diff --git a/codegen2/src/TDParse/Program.cs b/codegen2/src/TDParse/Program.cs new file mode 100644 index 0000000000..2364f24e4d --- /dev/null +++ b/codegen2/src/TDParse/Program.cs @@ -0,0 +1,93 @@ +namespace TDParse +{ + using System; + using System.IO; + using Azure.Iot.Operations.TDParser; + using Azure.Iot.Operations.TDParser.Model; + + internal class Program + { + static void Main(string[] args) + { + if (args.Length < 1) + { + Console.WriteLine("Usage: TDParse "); + return; + } + + FileInfo file = new FileInfo(args[0]); + if (!file.Exists) + { + Console.WriteLine($"File not found: {file.FullName}"); + return; + } + + string tdJson = File.ReadAllText(file.FullName); + TDThing? thing = TDParser.Parse(tdJson); + if (thing != null) + { + if (thing.Context != null) + { + foreach (var context in thing.Context) + { + Console.WriteLine($"@context: {context}"); + } + } + Console.WriteLine($"ID: {thing.Id}"); + Console.WriteLine($"Title: {thing.Title}"); + if (thing.Forms != null) + { + foreach (var form in thing.Forms) + { + Console.WriteLine($"Form href: {form.Href}"); + if (form.ContentType != null) + { + Console.WriteLine($" ContentType: {form.ContentType}"); + } + if (form.Topic != null) + { + Console.WriteLine($" Topic: {form.Topic}"); + } + if (form.Op != null) + { + Console.WriteLine($" Op: {string.Join(", ", form.Op)}"); + } + } + } + if (thing.Events != null) + { + foreach (var evt in thing.Events) + { + Console.WriteLine($"Event: {evt.Key}"); + } + } + if (thing.SchemaDefinitions != null) + { + foreach (var schema in thing.SchemaDefinitions) + { + Console.WriteLine($"SchemaDefinition: {schema.Key}"); + if (schema.Value.AdditionalProperties != null) + { + Console.WriteLine($" AdditionalProperties: {schema.Value.AdditionalProperties}"); + } + } + } + if (thing.Properties != null) + { + foreach (var prop in thing.Properties) + { + Console.WriteLine($"Property: {prop.Key}"); + if (prop.Value.AdditionalProperties != null) + { + Console.WriteLine($" AdditionalProperties: {prop.Value.AdditionalProperties}"); + } + } + } + } + else + { + Console.WriteLine("Failed to parse the Thing Description."); + } + } + } +} diff --git a/codegen2/src/TDParse/TDParse.csproj b/codegen2/src/TDParse/TDParse.csproj new file mode 100644 index 0000000000..c9ccdc8384 --- /dev/null +++ b/codegen2/src/TDParse/TDParse.csproj @@ -0,0 +1,13 @@ + + + + Exe + net9.0 + enable + + + + + + + diff --git a/codegen2/src/TypeTester/Program.cs b/codegen2/src/TypeTester/Program.cs new file mode 100644 index 0000000000..5baec0f249 --- /dev/null +++ b/codegen2/src/TypeTester/Program.cs @@ -0,0 +1,62 @@ +namespace TypeTester +{ + using System; + using System.Collections.Generic; + using System.IO; + using System.Linq; + using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TypeGenerator; + + internal class Program + { + static Dictionary FormatFilters = new() + { + { SerializationFormat.Json, "*.schema.json" }, + }; + + static void Main(string[] args) + { + if (args.Length < 3) + { + Console.WriteLine("Usage: TypeTester C#|Rust"); + return; + } + + DirectoryInfo schemaFolder = new DirectoryInfo(args[0]); + if (!schemaFolder.Exists) + { + Console.WriteLine($"Folder not found: {schemaFolder.FullName}"); + return; + } + + DirectoryInfo outputFolder = new DirectoryInfo(args[1]); + + TargetLanguage targetLanguage = args[2].ToLower() switch + { + "c#" => TargetLanguage.CSharp, + "rust" => TargetLanguage.Rust, + _ => throw new NotSupportedException($"Target language {args[3]} is not supported."), + }; + + foreach (KeyValuePair formatFilter in FormatFilters) + { + TypeGenerator typeGenerator = new TypeGenerator(formatFilter.Key, targetLanguage); + + Dictionary schemaTextsByName = schemaFolder.GetFiles(formatFilter.Value).ToDictionary(f => f.Name, f => File.ReadAllText(f.FullName)); + + foreach (GeneratedType genType in typeGenerator.GenerateTypes(schemaTextsByName, new CodeName("Namespace"), "GeneratedProject")) + { + DirectoryInfo folderPath = new DirectoryInfo(Path.Combine(outputFolder.FullName, genType.FolderPath)); + if (!folderPath.Exists) + { + folderPath.Create(); + } + + string filePath = Path.Combine(folderPath.FullName, genType.FileName); + File.WriteAllText(filePath, genType.Content); + Console.WriteLine($"Generated {filePath}"); + } + } + } + } +} diff --git a/codegen2/src/TypeTester/TypeTester.csproj b/codegen2/src/TypeTester/TypeTester.csproj new file mode 100644 index 0000000000..ec593e0471 --- /dev/null +++ b/codegen2/src/TypeTester/TypeTester.csproj @@ -0,0 +1,13 @@ + + + + Exe + net9.0 + enable + + + + + + + From fd45293c14e9fe8ab409fd41a11624dac793d8f2 Mon Sep 17 00:00:00 2001 From: Auto Gen Date: Thu, 16 Oct 2025 16:01:33 -0700 Subject: [PATCH 02/52] EnvoyGenerator --- codegen2/codegen.sln | 18 + codegen2/eval/.cargo/config.toml | 2 + codegen2/eval/.gitignore | 4 +- codegen2/eval/SchemaNames.json | 78 +- codegen2/eval/bld.sh | 27 + codegen2/eval/dg.sh | 29 + codegen2/eval/diffschemas.sh | 5 - codegen2/eval/gen.sh | 51 ++ codegen2/eval/genschemas.sh | 18 - codegen2/eval/gentypes.sh | 33 - .../CommandComplexSchemas.SchemaNames.json | 22 + .../CommandComplexSchemas.TD.json | 55 +- .../eval/wot/CommandVariants.SchemaNames.json | 22 + codegen2/eval/wot/CommandVariants.TD.json | 117 +++ .../wot/CounterCollection.SchemaNames.json | 27 + .../CounterCollection.TD.json | 57 +- .../wot/PropertySeparate.SchemaNames.json | 22 + .../PropertySeparate.TD.json | 25 +- .../wot/PropertyTogether.SchemaNames.json | 21 + .../PropertyTogether.TD.json | 43 +- .../TelemetryComplexSchemas.SchemaNames.json | 17 + .../TelemetryComplexSchemas.TD.json | 89 +-- ...TelemetryPrimitiveSchemas.SchemaNames.json | 22 + .../wot/TelemetryPrimitiveSchemas.TD.json | 199 +++++ codegen2/eval/wot/ThingOne.SchemaNames.json | 14 + codegen2/eval/wot/ThingTwo.SchemaNames.json | 14 + codegen2/eval/wot/TwoThings.TD.json | 96 +++ codegen2/res/rust/AVRO/common_types.rs | 7 + codegen2/res/rust/AVRO/common_types/b64.rs | 43 + .../res/rust/AVRO/common_types/empty_avro.rs | 45 ++ codegen2/res/rust/JSON/common_types.rs | 7 + codegen2/res/rust/JSON/common_types/b64.rs | 44 ++ .../res/rust/JSON/common_types/empty_json.rs | 28 + codegen2/res/rust/common/common_types.rs | 5 + .../res/rust/common/common_types/date_only.rs | 68 ++ .../res/rust/common/common_types/decimal.rs | 45 ++ .../res/rust/common/common_types/options.rs | 62 ++ .../res/rust/common/common_types/time_only.rs | 74 ++ codegen2/res/rust/custom/common_types.rs | 3 + .../custom/common_types/custom_payload.rs | 6 + codegen2/res/rust/raw/common_types.rs | 2 + .../EmptyTypeName.cs | 8 +- .../FormInfo.cs | 47 +- .../FormatSupport.cs | 32 + .../GeneratedItem.cs | 4 + .../ParsedThing.cs | 6 + .../SchemaNameInfo.cs | 60 +- .../SchemaNamer.cs | 73 +- .../ThingSupport.cs | 100 +++ .../.gitignore | 1 + .../ActionEnvoyGenerator.cs | 118 +++ .../ActionSpec.cs | 62 ++ .../AggregateErrorSpec.cs | 6 + ...Azure.Iot.Operations.EnvoyGenerator.csproj | 310 ++++++++ .../EnvoyGenerator.cs | 154 ++++ .../EnvoyTransformFactory.cs | 544 +++++++++++++ .../ErrorSpec.cs | 4 + .../EventEnvoyGenerator.cs | 45 ++ .../EventSpec.cs | 16 + .../IEnvoyTemplateTransform.cs | 11 + .../MqttTopicTokens.cs | 58 ++ .../PropertyEnvoyGenerator.cs | 232 ++++++ .../PropertySpec.cs | 62 ++ .../ResourceTransform.cs | 42 + .../TypedConstant.cs | 6 + .../Actions/code/DotNetCommandExecutor.cs | 55 ++ .../Actions/code/DotNetCommandInvoker.cs | 49 ++ .../Actions/code/DotNetResponseExtension.cs | 47 ++ .../Actions/t4/DotNetCommandExecutor.tt | 50 ++ .../dotnet/Actions/t4/DotNetCommandInvoker.tt | 44 ++ .../Actions/t4/DotNetResponseExtension.tt | 67 ++ .../dotnet/Constants/code/DotNetConstants.cs | 39 + .../dotnet/Constants/t4/DotNetConstants.tt | 22 + .../dotnet/Error/code/DotNetAggregateError.cs | 25 + .../dotnet/Error/code/DotNetError.cs | 36 + .../dotnet/Error/t4/DotNetAggregateError.tt | 38 + .../dotnet/Error/t4/DotNetError.tt | 59 ++ .../Events/code/DotNetTelemetryReceiver.cs | 47 ++ .../Events/code/DotNetTelemetrySender.cs | 44 ++ .../Events/t4/DotNetTelemetryReceiver.tt | 40 + .../dotnet/Events/t4/DotNetTelemetrySender.tt | 40 + .../dotnet/Project/code/DotNetProject.cs | 36 + .../dotnet/Project/t4/DotNetProject.tt | 19 + .../Properties/code/DotNetPropertyConsumer.cs | 73 ++ .../code/DotNetPropertyMaintainer.cs | 73 ++ .../Properties/t4/DotNetPropertyConsumer.tt | 101 +++ .../Properties/t4/DotNetPropertyMaintainer.tt | 104 +++ .../dotnet/Service/code/DotNetService.cs | 56 ++ .../dotnet/Service/t4/DotNetService.tt | 732 ++++++++++++++++++ .../rust/Actions/code/RustCommandExecutor.cs | 66 ++ .../code/RustCommandExecutorHeaders.cs | 45 ++ .../rust/Actions/code/RustCommandInvoker.cs | 63 ++ .../Actions/code/RustCommandInvokerHeaders.cs | 45 ++ .../rust/Actions/t4/RustCommandExecutor.tt | 174 +++++ .../Actions/t4/RustCommandExecutorHeaders.tt | 39 + .../rust/Actions/t4/RustCommandInvoker.tt | 264 +++++++ .../Actions/t4/RustCommandInvokerHeaders.tt | 46 ++ .../rust/Constants/code/RustConstants.cs | 38 + .../rust/Constants/t4/RustConstants.tt | 10 + .../rust/Error/code/RustAggregateError.cs | 26 + .../rust/Error/code/RustError.cs | 29 + .../rust/Error/t4/RustAggregateError.tt | 41 + .../rust/Error/t4/RustError.tt | 32 + .../rust/Events/code/RustTelemetryReceiver.cs | 35 + .../rust/Events/code/RustTelemetrySender.cs | 33 + .../rust/Events/t4/RustTelemetryReceiver.tt | 90 +++ .../rust/Events/t4/RustTelemetrySender.tt | 145 ++++ .../rust/Project/code/RustCargoToml.cs | 33 + .../rust/Project/code/RustIndex.cs | 34 + .../rust/Project/code/RustLib.cs | 25 + .../rust/Project/t4/RustCargoToml.tt | 43 + .../rust/Project/t4/RustIndex.tt | 33 + .../rust/Project/t4/RustLib.tt | 11 + .../Properties/code/RustPropertyConsumer.cs | 86 ++ .../Properties/code/RustPropertyMaintainer.cs | 80 ++ .../Properties/t4/RustPropertyConsumer.tt | 445 +++++++++++ .../Properties/t4/RustPropertyMaintainer.tt | 280 +++++++ .../Serialization/code/RustSerialization.cs | 74 ++ .../Serialization/t4/RustSerialization.tt | 73 ++ .../ArgBinder.cs | 91 +++ ...ure.Iot.Operations.ProtocolCompiler.csproj | 21 + .../CommandHandler.cs | 197 +++++ .../OptionContainer.cs | 46 ++ .../Program.cs | 112 +++ .../ActionSchemaGenerator.cs | 33 +- .../EnumSpec.cs | 4 +- .../EventSchemaGenerator.cs | 5 +- .../FieldSpec.cs | 2 +- .../GeneratedSchema.cs | 4 - .../ISchemaTemplateTransform.cs | 4 + .../ObjectSpec.cs | 4 +- .../PropertySchemaGenerator.cs | 145 ++-- .../SchemaGenerator.cs | 63 +- .../SchemaSpec.cs | 2 +- .../SchemaTransformFactory.cs | 8 +- .../free/code/ConstSchema.cs | 25 - .../free/t4/ConstSchema.tt | 8 - .../json/JsonSchemaSupport.cs | 12 +- .../json/code/EnumJsonSchema.cs | 4 + .../json/code/ObjectJsonSchema.cs | 8 +- .../json/t4/ObjectJsonSchema.tt | 8 +- .../Model/TDDataSchema.cs | 2 +- .../Model/TDForm.cs | 4 +- .../Model/TDStringArray.cs | 50 ++ .../Azure.Iot.Operations.TDParser/TDParser.cs | 24 + .../Azure.Iot.Operations.TypeGenerator.csproj | 1 + .../DotNetTypeGenerator.cs | 4 +- .../GeneratedType.cs | 4 - .../ITypeGenerator.cs | 2 +- .../RustTypeGenerator.cs | 8 +- .../TypeGenerator.cs | 6 +- .../dotnet/t4/DotNetEnum.tt | 2 +- .../dotnet/t4/DotNetObject.tt | 2 +- .../rust/code/RustEnum.cs | 10 +- .../rust/code/RustObject.cs | 7 +- .../rust/t4/RustEnum.tt | 6 +- .../rust/t4/RustObject.tt | 4 +- codegen2/src/EnvoyTester/EnvoyTester.csproj | 13 + codegen2/src/EnvoyTester/Program.cs | 78 ++ codegen2/src/SchemaTester/Program.cs | 25 +- codegen2/src/TDParse/Program.cs | 7 +- codegen2/src/TypeTester/Program.cs | 14 +- 162 files changed, 8514 insertions(+), 466 deletions(-) create mode 100644 codegen2/eval/.cargo/config.toml create mode 100644 codegen2/eval/bld.sh create mode 100644 codegen2/eval/dg.sh delete mode 100644 codegen2/eval/diffschemas.sh create mode 100644 codegen2/eval/gen.sh delete mode 100644 codegen2/eval/genschemas.sh delete mode 100644 codegen2/eval/gentypes.sh create mode 100644 codegen2/eval/wot/CommandComplexSchemas.SchemaNames.json rename codegen2/eval/{CommandComplexSchemas => wot}/CommandComplexSchemas.TD.json (81%) create mode 100644 codegen2/eval/wot/CommandVariants.SchemaNames.json create mode 100644 codegen2/eval/wot/CommandVariants.TD.json create mode 100644 codegen2/eval/wot/CounterCollection.SchemaNames.json rename codegen2/eval/{CounterCollection => wot}/CounterCollection.TD.json (71%) create mode 100644 codegen2/eval/wot/PropertySeparate.SchemaNames.json rename codegen2/eval/{PropertySeparate => wot}/PropertySeparate.TD.json (93%) create mode 100644 codegen2/eval/wot/PropertyTogether.SchemaNames.json rename codegen2/eval/{PropertyTogether => wot}/PropertyTogether.TD.json (86%) create mode 100644 codegen2/eval/wot/TelemetryComplexSchemas.SchemaNames.json rename codegen2/eval/{TelemetryComplexSchemas => wot}/TelemetryComplexSchemas.TD.json (82%) create mode 100644 codegen2/eval/wot/TelemetryPrimitiveSchemas.SchemaNames.json create mode 100644 codegen2/eval/wot/TelemetryPrimitiveSchemas.TD.json create mode 100644 codegen2/eval/wot/ThingOne.SchemaNames.json create mode 100644 codegen2/eval/wot/ThingTwo.SchemaNames.json create mode 100644 codegen2/eval/wot/TwoThings.TD.json create mode 100644 codegen2/res/rust/AVRO/common_types.rs create mode 100644 codegen2/res/rust/AVRO/common_types/b64.rs create mode 100644 codegen2/res/rust/AVRO/common_types/empty_avro.rs create mode 100644 codegen2/res/rust/JSON/common_types.rs create mode 100644 codegen2/res/rust/JSON/common_types/b64.rs create mode 100644 codegen2/res/rust/JSON/common_types/empty_json.rs create mode 100644 codegen2/res/rust/common/common_types.rs create mode 100644 codegen2/res/rust/common/common_types/date_only.rs create mode 100644 codegen2/res/rust/common/common_types/decimal.rs create mode 100644 codegen2/res/rust/common/common_types/options.rs create mode 100644 codegen2/res/rust/common/common_types/time_only.rs create mode 100644 codegen2/res/rust/custom/common_types.rs create mode 100644 codegen2/res/rust/custom/common_types/custom_payload.rs create mode 100644 codegen2/res/rust/raw/common_types.rs create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/FormatSupport.cs create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/GeneratedItem.cs create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/ParsedThing.cs create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingSupport.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/.gitignore create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionSpec.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/AggregateErrorSpec.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/Azure.Iot.Operations.EnvoyGenerator.csproj create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyTransformFactory.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ErrorSpec.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EventEnvoyGenerator.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EventSpec.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/IEnvoyTemplateTransform.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/MqttTopicTokens.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/PropertyEnvoyGenerator.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/PropertySpec.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ResourceTransform.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/TypedConstant.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/code/DotNetCommandExecutor.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/code/DotNetCommandInvoker.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/code/DotNetResponseExtension.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandExecutor.tt create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandInvoker.tt create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetResponseExtension.tt create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Constants/code/DotNetConstants.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Constants/t4/DotNetConstants.tt create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Error/code/DotNetAggregateError.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Error/code/DotNetError.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Error/t4/DotNetAggregateError.tt create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Error/t4/DotNetError.tt create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/code/DotNetTelemetryReceiver.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/code/DotNetTelemetrySender.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetryReceiver.tt create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetrySender.tt create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Project/code/DotNetProject.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Project/t4/DotNetProject.tt create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/code/DotNetPropertyConsumer.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/code/DotNetPropertyMaintainer.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyConsumer.tt create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyMaintainer.tt create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Service/code/DotNetService.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Service/t4/DotNetService.tt create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandExecutor.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandExecutorHeaders.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandInvoker.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandInvokerHeaders.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutor.tt create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutorHeaders.tt create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.tt create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvokerHeaders.tt create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Constants/code/RustConstants.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Constants/t4/RustConstants.tt create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Error/code/RustAggregateError.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Error/code/RustError.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Error/t4/RustAggregateError.tt create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Error/t4/RustError.tt create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/code/RustTelemetryReceiver.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/code/RustTelemetrySender.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.tt create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.tt create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/code/RustCargoToml.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/code/RustIndex.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/code/RustLib.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustCargoToml.tt create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustIndex.tt create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustLib.tt create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/code/RustPropertyConsumer.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/code/RustPropertyMaintainer.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyConsumer.tt create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyMaintainer.tt create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Serialization/code/RustSerialization.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Serialization/t4/RustSerialization.tt create mode 100644 codegen2/src/Azure.Iot.Operations.ProtocolCompiler/ArgBinder.cs create mode 100644 codegen2/src/Azure.Iot.Operations.ProtocolCompiler/Azure.Iot.Operations.ProtocolCompiler.csproj create mode 100644 codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs create mode 100644 codegen2/src/Azure.Iot.Operations.ProtocolCompiler/OptionContainer.cs create mode 100644 codegen2/src/Azure.Iot.Operations.ProtocolCompiler/Program.cs delete mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/GeneratedSchema.cs delete mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/free/code/ConstSchema.cs delete mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/free/t4/ConstSchema.tt create mode 100644 codegen2/src/Azure.Iot.Operations.TDParser/Model/TDStringArray.cs delete mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/GeneratedType.cs create mode 100644 codegen2/src/EnvoyTester/EnvoyTester.csproj create mode 100644 codegen2/src/EnvoyTester/Program.cs diff --git a/codegen2/codegen.sln b/codegen2/codegen.sln index 755a2489a1..6c33a0953b 100644 --- a/codegen2/codegen.sln +++ b/codegen2/codegen.sln @@ -17,6 +17,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Azure.Iot.Operations.Schema EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SchemaTester", "src\SchemaTester\SchemaTester.csproj", "{372B32CC-898F-434B-9BFC-40C90E29DF2F}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Azure.Iot.Operations.EnvoyGenerator", "src\Azure.Iot.Operations.EnvoyGenerator\Azure.Iot.Operations.EnvoyGenerator.csproj", "{7A0261EF-4C5B-009B-1F89-A78993646A3D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EnvoyTester", "src\EnvoyTester\EnvoyTester.csproj", "{E710D7E8-D341-4F41-80EE-EA4D2D82E0C6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Azure.Iot.Operations.ProtocolCompiler", "src\Azure.Iot.Operations.ProtocolCompiler\Azure.Iot.Operations.ProtocolCompiler.csproj", "{5A83D072-8E7F-424C-B009-4A6011A13CA5}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -51,6 +57,18 @@ Global {372B32CC-898F-434B-9BFC-40C90E29DF2F}.Debug|Any CPU.Build.0 = Debug|Any CPU {372B32CC-898F-434B-9BFC-40C90E29DF2F}.Release|Any CPU.ActiveCfg = Release|Any CPU {372B32CC-898F-434B-9BFC-40C90E29DF2F}.Release|Any CPU.Build.0 = Release|Any CPU + {7A0261EF-4C5B-009B-1F89-A78993646A3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7A0261EF-4C5B-009B-1F89-A78993646A3D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7A0261EF-4C5B-009B-1F89-A78993646A3D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7A0261EF-4C5B-009B-1F89-A78993646A3D}.Release|Any CPU.Build.0 = Release|Any CPU + {E710D7E8-D341-4F41-80EE-EA4D2D82E0C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E710D7E8-D341-4F41-80EE-EA4D2D82E0C6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E710D7E8-D341-4F41-80EE-EA4D2D82E0C6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E710D7E8-D341-4F41-80EE-EA4D2D82E0C6}.Release|Any CPU.Build.0 = Release|Any CPU + {5A83D072-8E7F-424C-B009-4A6011A13CA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5A83D072-8E7F-424C-B009-4A6011A13CA5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5A83D072-8E7F-424C-B009-4A6011A13CA5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5A83D072-8E7F-424C-B009-4A6011A13CA5}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/codegen2/eval/.cargo/config.toml b/codegen2/eval/.cargo/config.toml new file mode 100644 index 0000000000..08eaec46f6 --- /dev/null +++ b/codegen2/eval/.cargo/config.toml @@ -0,0 +1,2 @@ +[registries] +aio-sdks = { index = "sparse+https://pkgs.dev.azure.com/azure-iot-sdks/iot-operations/_packaging/preview/Cargo/index/" } diff --git a/codegen2/eval/.gitignore b/codegen2/eval/.gitignore index 79e5fb145e..a89535bb38 100644 --- a/codegen2/eval/.gitignore +++ b/codegen2/eval/.gitignore @@ -1,4 +1,6 @@ **/*.const.json **/*.schema.json -**/*.g.cs +**/*.cs +**/*.csproj **/*.rs +**/Cargo.toml diff --git a/codegen2/eval/SchemaNames.json b/codegen2/eval/SchemaNames.json index 1c8175f699..fcdd6ba74d 100644 --- a/codegen2/eval/SchemaNames.json +++ b/codegen2/eval/SchemaNames.json @@ -1,4 +1,7 @@ { + "suppressTitles": false, + "constantsSchema": "Constants", + "aggregateEventName": "Events", "aggregateEventSchema": "EventCollection", "aggregatePropName": "Properties", "aggregatePropSchema": "PropertyCollection", @@ -7,25 +10,37 @@ "aggregatePropWriteRespSchema": "PropertyCollectionWriteRespSchema", "aggregatePropReadErrSchema": "PropertyCollectionReadError", "aggregatePropWriteErrSchema": "PropertyCollectionWriteError", + "readRequesterBinder": "ReadRequester", + "readResponderBinder": "ReadResponder", + "writeRequesterBinder": "WriteRequester", + "writeResponderBinder": "WriteResponder", "aggregateReadRespValueField": "_properties", "aggregateRespErrorField": "_errors", - "propRespErrorField": "_error", - "actionRespErrorField": "_error", "eventSchema": { "in": [ "eventName" ], "out": "{eventName}Event", "capitalize": true }, + "eventValueSchema": { + "in": [ "eventSchema" ], + "out": "Event{eventSchema}Value", + "capitalize": true + }, + "eventSenderBinder": { + "in": [ "eventSchema" ], + "out": "{eventSchema}Sender", + "capitalize": true + }, + "eventReceiverBinder": { + "in": [ "eventSchema" ], + "out": "{eventSchema}Receiver", + "capitalize": true + }, "propSchema": { "in": [ "propName" ], "out": "{propName}Property", "capitalize": true }, - "eventValueSchema": { - "in": [ "eventName" ], - "out": "Event{eventName}Value", - "capitalize": true - }, "writablePropSchema": { "in": [ "propName" ], "out": "{propName}WritableProperty", @@ -46,14 +61,34 @@ "out": "Property{propName}Value", "capitalize": true }, + "propReadActName": { + "in": [ "propName" ], + "out": "Read{propName}", + "capitalize": true + }, + "propWriteActName": { + "in": [ "propName" ], + "out": "Write{propName}", + "capitalize": true + }, + "propMaintainerBinder": { + "in": [ "propSchema" ], + "out": "{propSchema}Maintainer", + "capitalize": true + }, + "propConsumerBinder": { + "in": [ "propSchema" ], + "out": "{propSchema}Consumer", + "capitalize": true + }, "actionInSchema": { "in": [ "actionName" ], - "out": "{actionName}InputArgs", + "out": "{actionName}InputArguments", "capitalize": true }, "actionOutSchema": { "in": [ "actionName" ], - "out": "{actionName}OutputArgs", + "out": "{actionName}OutputArguments", "capitalize": true }, "actionRespSchema": { @@ -61,6 +96,31 @@ "out": "{actionName}ResponseSchema", "capitalize": true }, + "actionExecutorBinder": { + "in": [ "actionName" ], + "out": "{actionName}ActionExecutor", + "capitalize": true + }, + "actionInvokerBinder": { + "in": [ "actionName" ], + "out": "{actionName}ActionInvoker", + "capitalize": true + }, + "propReadRespErrorField": { + "in": [ "propName", "errorSchemaName" ], + "out": "_error", + "capitalize": false + }, + "propWriteRespErrorField": { + "in": [ "propName", "errorSchemaName" ], + "out": "_error", + "capitalize": false + }, + "actionRespErrorField": { + "in": [ "actionName", "errorSchemaName" ], + "out": "_error", + "capitalize": false + }, "backupSchemaName": { "in": [ "parentSchemaName", "childName" ], "out": "{parentSchemaName}{childName}", diff --git a/codegen2/eval/bld.sh b/codegen2/eval/bld.sh new file mode 100644 index 0000000000..f99c82036a --- /dev/null +++ b/codegen2/eval/bld.sh @@ -0,0 +1,27 @@ +#!/bin/sh + +dotnet build dotnet/CommandComplexSchemasSample +dotnet build dotnet/CommandVariantsSample +dotnet build dotnet/Counters +dotnet build dotnet/TelemetryComplexSchemasSample +dotnet build dotnet/TelemetryPrimitiveSchemasSample + +cd rust/command_complex_schemas_gen +cargo build +cd ../.. + +cd rust/command_variants_gen +cargo build +cd ../.. + +cd rust/counters +cargo build +cd ../.. + +cd rust/telemetry_complex_schemas_gen +cargo build +cd ../.. + +cd rust/telemetry_primitive_schemas_gen +cargo build +cd ../.. diff --git a/codegen2/eval/dg.sh b/codegen2/eval/dg.sh new file mode 100644 index 0000000000..4d1b2ee271 --- /dev/null +++ b/codegen2/eval/dg.sh @@ -0,0 +1,29 @@ +#!/bin/sh + +# odd ../../codegen/test/samples/dotnet/CommandComplexSchemasSample dotnet/CommandComplexSchemasSample & + +# odd ../../codegen/test/samples/rust/CommandComplexSchemasSample/command_complex_schemas_gen/src rust/command_complex_schemas_gen/src & + +# odd ../../codegen/test/samples/dotnet/CommandVariantsSample dotnet/CommandVariantsSample & + +# odd ../../codegen/test/samples/rust/CommandVariantsSample/command_variants_gen/src rust/command_variants_gen/src & + +# odd ../../codegen/demo/dotnet/ProtocolCompiler.Demo/Counters dotnet/Counters & + +# odd ../../codegen/demo/rust/protocol_compiler_demo/counters/src rust/counters/src & + +# odd ../../codegen/test/samples/dotnet/TelemetryComplexSchemasSample dotnet/TelemetryComplexSchemasSample & + +# odd ../../codegen/test/samples/rust/TelemetryComplexSchemasSample/telemetry_complex_schemas_gen/src rust/telemetry_complex_schemas_gen/src & + +# odd ../../codegen/test/samples/dotnet/TelemetryPrimitiveSchemasSample dotnet/TelemetryPrimitiveSchemasSample & + +# odd ../../codegen/test/samples/rust/TelemetryPrimitiveSchemasSample/telemetry_primitive_schemas_gen/src rust/telemetry_primitive_schemas_gen/src & + +# odd ../../codegen/test/samples/dotnet/PropertySeparateSample dotnet/PropertySeparateSample & + +# odd ../../codegen/test/samples/rust/PropertySeparateSample/property_separate_gen/src rust/property_separate_gen/src & + +# odd ../../codegen/test/samples/dotnet/PropertyTogetherSample dotnet/PropertyTogetherSample & + +# odd ../../codegen/test/samples/rust/PropertyTogetherSample/property_together_gen/src rust/property_together_gen/src & diff --git a/codegen2/eval/diffschemas.sh b/codegen2/eval/diffschemas.sh deleted file mode 100644 index 0e6f90b205..0000000000 --- a/codegen2/eval/diffschemas.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh - -odd PropertySeparate/JsonSchemas/Namespace/ ../../codegen/test/samples/dotnet/PropertySeparateSample/obj/Akri/PropertySeparate/ & - -odd PropertyTogether/JsonSchemas/Namespace/ ../../codegen/test/samples/dotnet/PropertyTogetherSample/obj/Akri/PropertyTogether/ & diff --git a/codegen2/eval/gen.sh b/codegen2/eval/gen.sh new file mode 100644 index 0000000000..f9207c3ae5 --- /dev/null +++ b/codegen2/eval/gen.sh @@ -0,0 +1,51 @@ +#!/bin/sh + +gen=../src/Azure.Iot.Operations.ProtocolCompiler/bin/Debug/net9.0/Azure.Iot.Operations.ProtocolCompiler.exe + +[[ -d dotnet/CommandComplexSchemasSample ]] && rm -r dotnet/CommandComplexSchemasSample +$gen --thingFiles wot/CommandComplexSchemas.TD.json --outDir dotnet/CommandComplexSchemasSample --lang csharp --namespace CommandComplexSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol + +[[ -d rust/command_complex_schemas_gen ]] && rm -r rust/command_complex_schemas_gen +$gen --thingFiles wot/CommandComplexSchemas.TD.json --outDir rust/command_complex_schemas_gen --lang rust --namespace CommandComplexSchemas --sdkPath ../../rust --srcSubdir src + +[[ -d dotnet/CommandVariantsSample ]] && rm -r dotnet/CommandVariantsSample +$gen --thingFiles wot/CommandVariants.TD.json --outDir dotnet/CommandVariantsSample --lang csharp --namespace CommandVariants --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol --defaultImpl + +[[ -d rust/command_variants_gen ]] && rm -r rust/command_variants_gen +$gen --thingFiles wot/CommandVariants.TD.json --outDir rust/command_variants_gen --lang rust --namespace CommandVariants --sdkPath ../../rust --srcSubdir src + +[[ -d dotnet/Counters ]] && rm -r dotnet/Counters +$gen --thingFiles wot/CounterCollection.TD.json --outDir dotnet/Counters --lang csharp --namespace CounterCollection --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol + +[[ -d rust/counters ]] && rm -r rust/counters +$gen --thingFiles wot/CounterCollection.TD.json --outDir rust/counters --lang rust --namespace CounterCollection --sdkPath ../../rust --srcSubdir src + +[[ -d dotnet/TelemetryComplexSchemasSample ]] && rm -r dotnet/TelemetryComplexSchemasSample +$gen --thingFiles wot/TelemetryComplexSchemas.TD.json --outDir dotnet/TelemetryComplexSchemasSample --lang csharp --namespace TelemetryComplexSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol + +[[ -d rust/telemetry_complex_schemas_gen ]] && rm -r rust/telemetry_complex_schemas_gen +$gen --thingFiles wot/TelemetryComplexSchemas.TD.json --outDir rust/telemetry_complex_schemas_gen --lang rust --namespace TelemetryComplexSchemas --sdkPath ../../rust --srcSubdir src + +[[ -d dotnet/TelemetryPrimitiveSchemasSample ]] && rm -r dotnet/TelemetryPrimitiveSchemasSample +$gen --thingFiles wot/TelemetryPrimitiveSchemas.TD.json --outDir dotnet/TelemetryPrimitiveSchemasSample --lang csharp --namespace TelemetryPrimitiveSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol + +[[ -d rust/telemetry_primitive_schemas_gen ]] && rm -r rust/telemetry_primitive_schemas_gen +$gen --thingFiles wot/TelemetryPrimitiveSchemas.TD.json --outDir rust/telemetry_primitive_schemas_gen --lang rust --namespace TelemetryPrimitiveSchemas --sdkPath ../../rust --srcSubdir src + +[[ -d dotnet/PropertySeparateSample ]] && rm -r dotnet/PropertySeparateSample +$gen --thingFiles wot/PropertySeparate.TD.json --outDir dotnet/PropertySeparateSample --lang csharp --namespace PropertySeparate --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol + +[[ -d rust/property_separate_gen ]] && rm -r rust/property_separate_gen +$gen --thingFiles wot/PropertySeparate.TD.json --outDir rust/property_separate_gen --lang rust --namespace PropertySeparate --sdkPath ../../rust --srcSubdir src + +[[ -d dotnet/PropertyTogetherSample ]] && rm -r dotnet/PropertyTogetherSample +$gen --thingFiles wot/PropertyTogether.TD.json --outDir dotnet/PropertyTogetherSample --lang csharp --namespace PropertyTogether --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol + +[[ -d rust/property_together_gen ]] && rm -r rust/property_together_gen +$gen --thingFiles wot/PropertyTogether.TD.json --outDir rust/property_together_gen --lang rust --namespace PropertyTogether --sdkPath ../../rust --srcSubdir src + +[[ -d dotnet/TwoThingsSample ]] && rm -r dotnet/TwoThingsSample +$gen --thingFiles wot/TwoThings.TD.json --outDir dotnet/TwoThingsSample --lang csharp --namespace TwoThings --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol + +[[ -d rust/two_things_gen ]] && rm -r rust/two_things_gen +$gen --thingFiles wot/TwoThings.TD.json --outDir rust/two_things_gen --lang rust --namespace TwoThings --sdkPath ../../rust --srcSubdir src diff --git a/codegen2/eval/genschemas.sh b/codegen2/eval/genschemas.sh deleted file mode 100644 index 0b2595a0c8..0000000000 --- a/codegen2/eval/genschemas.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh - -gen=../src/SchemaTester/bin/Debug/net9.0/SchemaTester - -[[ -d PropertySeparate/JsonSchemas ]] && rm -r PropertySeparate/JsonSchemas -$gen PropertySeparate PropertySeparate/JsonSchemas - -[[ -d PropertyTogether/JsonSchemas ]] && rm -r PropertyTogether/JsonSchemas -$gen PropertyTogether PropertyTogether/JsonSchemas - -[[ -d CommandComplexSchemas/JsonSchemas ]] && rm -r CommandComplexSchemas/JsonSchemas -$gen CommandComplexSchemas CommandComplexSchemas/JsonSchemas - -[[ -d CounterCollection/JsonSchemas ]] && rm -r CounterCollection/JsonSchemas -$gen CounterCollection CounterCollection/JsonSchemas - -[[ -d TelemetryComplexSchemas/JsonSchemas ]] && rm -r TelemetryComplexSchemas/JsonSchemas -$gen TelemetryComplexSchemas TelemetryComplexSchemas/JsonSchemas diff --git a/codegen2/eval/gentypes.sh b/codegen2/eval/gentypes.sh deleted file mode 100644 index b95d5baa99..0000000000 --- a/codegen2/eval/gentypes.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/sh - -gen=../src/TypeTester/bin/Debug/net9.0/TypeTester - -[[ -d PropertySeparate/DotNet ]] && rm -r PropertySeparate/DotNet -$gen PropertySeparate/JsonSchemas/Namespace PropertySeparate/DotNet C# - -[[ -d PropertyTogether/DotNet ]] && rm -r PropertyTogether/DotNet -$gen PropertyTogether/JsonSchemas/Namespace PropertyTogether/DotNet C# - -[[ -d PropertySeparate/Rust ]] && rm -r PropertySeparate/Rust -$gen PropertySeparate/JsonSchemas/Namespace PropertySeparate/Rust Rust - -[[ -d PropertyTogether/Rust ]] && rm -r PropertyTogether/Rust -$gen PropertyTogether/JsonSchemas/Namespace PropertyTogether/Rust Rust - -[[ -d CommandComplexSchemas/DotNet ]] && rm -r CommandComplexSchemas/DotNet -$gen CommandComplexSchemas/JsonSchemas/Namespace CommandComplexSchemas/DotNet C# - -[[ -d CommandComplexSchemas/Rust ]] && rm -r CommandComplexSchemas/Rust -$gen CommandComplexSchemas/JsonSchemas/Namespace CommandComplexSchemas/Rust Rust - -[[ -d CounterCollection/DotNet ]] && rm -r CounterCollection/DotNet -$gen CounterCollection/JsonSchemas/Namespace CounterCollection/DotNet C# - -[[ -d CounterCollection/Rust ]] && rm -r CounterCollection/Rust -$gen CounterCollection/JsonSchemas/Namespace CounterCollection/Rust Rust - -[[ -d TelemetryComplexSchemas/DotNet ]] && rm -r TelemetryComplexSchemas/DotNet -$gen TelemetryComplexSchemas/JsonSchemas/Namespace TelemetryComplexSchemas/DotNet C# - -[[ -d TelemetryComplexSchemas/Rust ]] && rm -r TelemetryComplexSchemas/Rust -$gen TelemetryComplexSchemas/JsonSchemas/Namespace TelemetryComplexSchemas/Rust Rust diff --git a/codegen2/eval/wot/CommandComplexSchemas.SchemaNames.json b/codegen2/eval/wot/CommandComplexSchemas.SchemaNames.json new file mode 100644 index 0000000000..a2b5d5600d --- /dev/null +++ b/codegen2/eval/wot/CommandComplexSchemas.SchemaNames.json @@ -0,0 +1,22 @@ +{ + "actionInSchema": { + "in": [ "actionName" ], + "out": "{actionName}RequestPayload", + "capitalize": true + }, + "actionOutSchema": { + "in": [ "actionName" ], + "out": "{actionName}ResponsePayload", + "capitalize": true + }, + "actionExecutorBinder": { + "in": [ "actionName" ], + "out": "{actionName}CommandExecutor", + "capitalize": true + }, + "actionInvokerBinder": { + "in": [ "actionName" ], + "out": "{actionName}CommandInvoker", + "capitalize": true + } +} diff --git a/codegen2/eval/CommandComplexSchemas/CommandComplexSchemas.TD.json b/codegen2/eval/wot/CommandComplexSchemas.TD.json similarity index 81% rename from codegen2/eval/CommandComplexSchemas/CommandComplexSchemas.TD.json rename to codegen2/eval/wot/CommandComplexSchemas.TD.json index 152d561294..b816e0a788 100644 --- a/codegen2/eval/CommandComplexSchemas/CommandComplexSchemas.TD.json +++ b/codegen2/eval/wot/CommandComplexSchemas.TD.json @@ -16,81 +16,82 @@ "links": [ { "rel": "service-desc", - "href": "../SchemaNames.json", + "href": "./CommandComplexSchemas.SchemaNames.json", "type": "application/json" } ], "schemaDefinitions": { "WhenNow": { + "description": "Indicates that the action should be performed immediately.", "type": "integer", "const": 1 }, "WhenLater": { + "description": "Indicates that the action should be performed after a deferral.", "type": "integer", "const": 2 + }, + "Hello": { + "type": "string", + "const": "Hello, World!" } }, "actions": { "doSomething": { "input": { - "title": "UserInput", + "title": "DoSomethingRequestPayload", "type": "object", "dtv:additionalProperties": false, "required": [ "input" ], "properties": { "input": { "type": "object", - "title": "UserInputProp", + "title": "DoSomethingRequestSchema", "dtv:additionalProperties": false, "properties": { - "when": { - "type": "integer", - "minimum": -2147483648, - "maximum": 2147483647 - }, "actions": { "type": "array", "items": { "type": "string" } + }, + "when": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 } } } } }, "output": { + "title": "SomeResponseInfo", "type": "object", "description": "The result of the doSomething command.", "dtv:additionalProperties": false, "properties": { - "overallResult": { - "title": "ResultValue", - "type": "string", - "enum": [ - "success", - "failure" - ] - }, - "magnitude": { - "type": "string", - "pattern": "^(?:\\+|-)?(?:[1-9][0-9]*|0)(?:\\.[0-9]*)?$" - }, - "nonDetails": { - "type": "object", - "dtv:additionalProperties": { - "type": "string" - } - }, "details": { "type": "object", "dtv:additionalProperties": { - "title": "ResultValue", + "title": "Results", "type": "string", "enum": [ "success", "failure" ] } + }, + "magnitude": { + "type": "string", + "pattern": "^(?:\\+|-)?(?:[1-9][0-9]*|0)(?:\\.[0-9]*)?$" + }, + "overallResult": { + "title": "Results", + "type": "string", + "enum": [ + "success", + "failure" + ] } } }, diff --git a/codegen2/eval/wot/CommandVariants.SchemaNames.json b/codegen2/eval/wot/CommandVariants.SchemaNames.json new file mode 100644 index 0000000000..a2b5d5600d --- /dev/null +++ b/codegen2/eval/wot/CommandVariants.SchemaNames.json @@ -0,0 +1,22 @@ +{ + "actionInSchema": { + "in": [ "actionName" ], + "out": "{actionName}RequestPayload", + "capitalize": true + }, + "actionOutSchema": { + "in": [ "actionName" ], + "out": "{actionName}ResponsePayload", + "capitalize": true + }, + "actionExecutorBinder": { + "in": [ "actionName" ], + "out": "{actionName}CommandExecutor", + "capitalize": true + }, + "actionInvokerBinder": { + "in": [ "actionName" ], + "out": "{actionName}CommandInvoker", + "capitalize": true + } +} diff --git a/codegen2/eval/wot/CommandVariants.TD.json b/codegen2/eval/wot/CommandVariants.TD.json new file mode 100644 index 0000000000..dc7598eab5 --- /dev/null +++ b/codegen2/eval/wot/CommandVariants.TD.json @@ -0,0 +1,117 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:jsonTest:CommandVariants;1", + "title": "CommandVariants", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "links": [ + { + "rel": "service-desc", + "href": "./CommandVariants.SchemaNames.json", + "type": "application/json" + } + ], + "actions": { + "noop": { + "idempotent": true, + "forms": [ + { + "href": "dtmi:jsonTest:CommandVariants:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "samples/command/noop/{executorId}", + "op": "invokeaction" + } + ] + }, + "peek": { + "output": { + "type": "object", + "dtv:additionalProperties": false, + "required": [ "outVal" ], + "properties": { + "outVal": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + } + } + }, + "idempotent": true, + "forms": [ + { + "href": "dtmi:jsonTest:CommandVariants:_contents:__peek;1", + "contentType": "application/json", + "dtv:topic": "samples/command/peek/{executorId}", + "dtv:serviceGroupId": "PeekCmdGroup", + "op": "invokeaction" + } + ] + }, + "poke": { + "input": { + "type": "object", + "dtv:additionalProperties": false, + "required": [ "inVal" ], + "properties": { + "inVal": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + } + } + }, + "forms": [ + { + "href": "dtmi:jsonTest:CommandVariants:_contents:__poke;1", + "contentType": "application/json", + "dtv:topic": "samples/command/poke/{executorId}", + "dtv:serviceGroupId": "PokeCmdGroup", + "op": "invokeaction" + } + ] + }, + "setColor": { + "input": { + "type": "object", + "dtv:additionalProperties": false, + "required": [ "newColor" ], + "properties": { + "newColor": { + "type": "string" + } + } + }, + "output": { + "type": "object", + "dtv:additionalProperties": false, + "required": [ "oldColor" ], + "properties": { + "oldColor": { + "type": "string" + } + } + }, + "forms": [ + { + "href": "dtmi:jsonTest:CommandVariants:_contents:__setColor;1", + "contentType": "application/json", + "dtv:topic": "samples/command/setColor/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/eval/wot/CounterCollection.SchemaNames.json b/codegen2/eval/wot/CounterCollection.SchemaNames.json new file mode 100644 index 0000000000..597f63c62e --- /dev/null +++ b/codegen2/eval/wot/CounterCollection.SchemaNames.json @@ -0,0 +1,27 @@ +{ + "actionInSchema": { + "in": [ "actionName" ], + "out": "{actionName}RequestPayload", + "capitalize": true + }, + "actionOutSchema": { + "in": [ "actionName" ], + "out": "{actionName}ResponsePayload", + "capitalize": true + }, + "actionExecutorBinder": { + "in": [ "actionName" ], + "out": "{actionName}CommandExecutor", + "capitalize": true + }, + "actionInvokerBinder": { + "in": [ "actionName" ], + "out": "{actionName}CommandInvoker", + "capitalize": true + }, + "actionRespErrorField": { + "in": [ "actionName", "errorSchemaName" ], + "out": "{errorSchemaName}", + "capitalize": false + } +} diff --git a/codegen2/eval/CounterCollection/CounterCollection.TD.json b/codegen2/eval/wot/CounterCollection.TD.json similarity index 71% rename from codegen2/eval/CounterCollection/CounterCollection.TD.json rename to codegen2/eval/wot/CounterCollection.TD.json index 46eaba4714..c70c96c7a9 100644 --- a/codegen2/eval/CounterCollection/CounterCollection.TD.json +++ b/codegen2/eval/wot/CounterCollection.TD.json @@ -13,8 +13,32 @@ "security": [ "nosec_sc" ], + "links": [ + { + "rel": "service-desc", + "href": "./CounterCollection.SchemaNames.json", + "type": "application/json" + } + ], "schemaDefinitions": { - "CounterList": { + "condition": { + "title": "ErrorCondition", + "type": "string", + "enum": [ + "NotFound", + "Overflow" + ] + }, + "errorCondition": { + "title": "ErrorCondition", + "type": "string", + "enum": [ + "NotFound", + "Overflow" + ] + }, + "availableCounters": { + "title": "CounterList", "type": "object", "dtv:additionalProperties": false, "properties": { @@ -26,10 +50,13 @@ } } }, - "CounterError": { - "descriptions": { - "en": "The requested counter operation could not be completed." - }, + "extantCounters": { + "title": "CounterList", + "type": "object" + }, + "locationError": { + "title": "CounterError", + "description": "The requested counter operation could not be completed.", "type": "object", "dtv:additionalProperties": false, "dtv:errorMessage": "explanation", @@ -71,13 +98,10 @@ "dtv:headerInfo": [ { "contentType": "application/json", - "schema": "CounterList" + "schema": "extantCounters" } ], - "dtv:headerCode": [ - "counterNotFound", - "counterOverflow" - ], + "dtv:headerCode": "errorCondition", "dtv:topic": "test/CounterCollection/increment", "op": "invokeaction" } @@ -90,6 +114,7 @@ "required": [ "counterName" ], "properties": { "counterName": { + "description": "Name of counter whose location to determine", "type": "string" } } @@ -97,9 +122,10 @@ "output": { "type": "object", "dtv:additionalProperties": false, - "required": [ "counterLocation" ], "properties": { "counterLocation": { + "title": "CounterLocation", + "description": "Location of counter, null if not deployed", "type": "object", "dtv:additionalProperties": false, "required": [ "latitude", "longitude" ], @@ -125,9 +151,16 @@ "additionalResponses": [ { "success": false, - "schema": "CounterError" + "schema": "locationError" + } + ], + "dtv:headerInfo": [ + { + "contentType": "application/json", + "schema": "availableCounters" } ], + "dtv:headerCode": "condition", "dtv:topic": "test/CounterCollection/getLocation", "op": "invokeaction" } diff --git a/codegen2/eval/wot/PropertySeparate.SchemaNames.json b/codegen2/eval/wot/PropertySeparate.SchemaNames.json new file mode 100644 index 0000000000..14b43a11d8 --- /dev/null +++ b/codegen2/eval/wot/PropertySeparate.SchemaNames.json @@ -0,0 +1,22 @@ +{ + "propMaintainerBinder": { + "in": [ "propSchema" ], + "out": "{propSchema}PropertyMaintainer", + "capitalize": true + }, + "propConsumerBinder": { + "in": [ "propSchema" ], + "out": "{propSchema}PropertyConsumer", + "capitalize": true + }, + "propReadRespErrorField": { + "in": [ "propName", "errorSchemaName" ], + "out": "propReadError", + "capitalize": false + }, + "propWriteRespErrorField": { + "in": [ "propName", "errorSchemaName" ], + "out": "propWriteError", + "capitalize": false + } +} diff --git a/codegen2/eval/PropertySeparate/PropertySeparate.TD.json b/codegen2/eval/wot/PropertySeparate.TD.json similarity index 93% rename from codegen2/eval/PropertySeparate/PropertySeparate.TD.json rename to codegen2/eval/wot/PropertySeparate.TD.json index b12399380c..8ca97a97e9 100644 --- a/codegen2/eval/PropertySeparate/PropertySeparate.TD.json +++ b/codegen2/eval/wot/PropertySeparate.TD.json @@ -13,6 +13,13 @@ "security": [ "nosec_sc" ], + "links": [ + { + "rel": "service-desc", + "href": "./PropertySeparate.SchemaNames.json", + "type": "application/json" + } + ], "schemaDefinitions": { "PropertyError": { "description": "The requested property read/write could not be completed.", @@ -69,21 +76,9 @@ ] }, "Beta": { - "type": "object", - "title": "Coordinates", - "dtv:additionalProperties": false, - "properties": { - "latitude": { - "type": "number", - "minimum": -1.80e+308, - "maximum": 1.80e+308 - }, - "longitude": { - "type": "number", - "minimum": -1.80e+308, - "maximum": 1.80e+308 - } - }, + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647, "readOnly": false, "forms": [ { diff --git a/codegen2/eval/wot/PropertyTogether.SchemaNames.json b/codegen2/eval/wot/PropertyTogether.SchemaNames.json new file mode 100644 index 0000000000..6256860571 --- /dev/null +++ b/codegen2/eval/wot/PropertyTogether.SchemaNames.json @@ -0,0 +1,21 @@ +{ + "aggregatePropName": "Properties", + "aggregateReadRespValueField": "Properties", + "aggregateRespErrorField": "Errors", + "propReadActName": { + "in": [ "propName" ], + "out": "ReadPropertyCollection" + }, + "propWriteActName": { + "in": [ "propName" ], + "out": "WritePropertyCollection" + }, + "propMaintainerBinder": { + "in": [ "propSchema" ], + "out": "PropertyMaintainer" + }, + "propConsumerBinder": { + "in": [ "propSchema" ], + "out": "PropertyConsumer" + } +} diff --git a/codegen2/eval/PropertyTogether/PropertyTogether.TD.json b/codegen2/eval/wot/PropertyTogether.TD.json similarity index 86% rename from codegen2/eval/PropertyTogether/PropertyTogether.TD.json rename to codegen2/eval/wot/PropertyTogether.TD.json index 53c07f5862..ad4dc39b12 100644 --- a/codegen2/eval/PropertyTogether/PropertyTogether.TD.json +++ b/codegen2/eval/wot/PropertyTogether.TD.json @@ -13,6 +13,13 @@ "security": [ "nosec_sc" ], + "links": [ + { + "rel": "service-desc", + "href": "./PropertyTogether.SchemaNames.json", + "type": "application/json" + } + ], "schemaDefinitions": { "PropertyError": { "description": "The requested property read/write could not be completed.", @@ -91,21 +98,9 @@ ] }, "Beta": { - "type": "object", - "title": "Coordinates", - "dtv:additionalProperties": false, - "properties": { - "latitude": { - "type": "number", - "minimum": -1.80e+308, - "maximum": 1.80e+308 - }, - "longitude": { - "type": "number", - "minimum": -1.80e+308, - "maximum": 1.80e+308 - } - }, + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647, "readOnly": false, "forms": [ { @@ -137,21 +132,9 @@ ] }, "Delta": { - "type": "object", - "title": "Coordinates", - "dtv:additionalProperties": false, - "properties": { - "latitude": { - "type": "number", - "minimum": -1.80e+308, - "maximum": 1.80e+308 - }, - "longitude": { - "type": "number", - "minimum": -1.80e+308, - "maximum": 1.80e+308 - } - }, + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647, "readOnly": false, "forms": [ { diff --git a/codegen2/eval/wot/TelemetryComplexSchemas.SchemaNames.json b/codegen2/eval/wot/TelemetryComplexSchemas.SchemaNames.json new file mode 100644 index 0000000000..a950212a83 --- /dev/null +++ b/codegen2/eval/wot/TelemetryComplexSchemas.SchemaNames.json @@ -0,0 +1,17 @@ +{ + "aggregateEventName": "Telemetry", + "aggregateEventSchema": "TelemetryCollection", + "eventValueSchema": { + "in": [ "eventSchema" ], + "out": "{eventSchema}Schema", + "capitalize": true + }, + "eventSenderBinder": { + "in": [ "eventSchema" ], + "out": "TelemetrySender" + }, + "eventReceiverBinder": { + "in": [ "eventSchema" ], + "out": "TelemetryReceiver" + } +} diff --git a/codegen2/eval/TelemetryComplexSchemas/TelemetryComplexSchemas.TD.json b/codegen2/eval/wot/TelemetryComplexSchemas.TD.json similarity index 82% rename from codegen2/eval/TelemetryComplexSchemas/TelemetryComplexSchemas.TD.json rename to codegen2/eval/wot/TelemetryComplexSchemas.TD.json index 6d24743b7b..de1931b532 100644 --- a/codegen2/eval/TelemetryComplexSchemas/TelemetryComplexSchemas.TD.json +++ b/codegen2/eval/wot/TelemetryComplexSchemas.TD.json @@ -13,6 +13,13 @@ "security": [ "nosec_sc" ], + "links": [ + { + "rel": "service-desc", + "href": "./TelemetryComplexSchemas.SchemaNames.json", + "type": "application/json" + } + ], "schemaDefinitions": { "near": { "type": "integer", @@ -28,6 +35,7 @@ "href": "dtmi:jsonTest:TelemetryComplexSchemas;1", "contentType": "application/json", "dtv:topic": "sample/{senderId}/telemetry", + "dtv:serviceGroupId": "AggregTelemGroup", "op": "subscribeallevents" } ], @@ -36,22 +44,26 @@ "properties": { }, "events": { - "resultArray": { + "coordinates": { "data": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "success", - "failure" - ] + "type": "object", + "dtv:additionalProperties": false, + "properties": { + "latitude": { + "type": "number", + "minimum": -1.80e+308, + "maximum": 1.80e+308 + }, + "longitude": { + "type": "number", + "minimum": -1.80e+308, + "maximum": 1.80e+308 + } } }, "forms": [ { - "href": "dtmi:jsonTest:TelemetryComplexSchemas:_contents:__resultArray;1", - "contentType": "application/json", - "dtv:topic": "sample/{senderId}/telemetry/resultArray", + "href": "dtmi:jsonTest:TelemetryComplexSchemas:_contents:__coordinates;1", "op": "subscribeevent" } ] @@ -71,8 +83,6 @@ "forms": [ { "href": "dtmi:jsonTest:TelemetryComplexSchemas:_contents:__doubleArray2D;1", - "contentType": "application/json", - "dtv:topic": "sample/{senderId}/telemetry/doubleArray2D", "op": "subscribeevent" } ] @@ -89,8 +99,6 @@ "forms": [ { "href": "dtmi:jsonTest:TelemetryComplexSchemas:_contents:__doubleMap;1", - "contentType": "application/json", - "dtv:topic": "sample/{senderId}/telemetry/doubleMap", "op": "subscribeevent" } ] @@ -110,34 +118,6 @@ "forms": [ { "href": "dtmi:jsonTest:TelemetryComplexSchemas:_contents:__doubleMapArray;1", - "contentType": "application/json", - "dtv:topic": "sample/{senderId}/telemetry/doubleMapArray", - "op": "subscribeevent" - } - ] - }, - "coordinates": { - "data": { - "type": "object", - "dtv:additionalProperties": false, - "properties": { - "latitude": { - "type": "number", - "minimum": -1.80e+308, - "maximum": 1.80e+308 - }, - "longitude": { - "type": "number", - "minimum": -1.80e+308, - "maximum": 1.80e+308 - } - } - }, - "forms": [ - { - "href": "dtmi:jsonTest:TelemetryComplexSchemas:_contents:__coordinates;1", - "contentType": "application/json", - "dtv:topic": "sample/{senderId}/telemetry/coordinates", "op": "subscribeevent" } ] @@ -154,8 +134,25 @@ "forms": [ { "href": "dtmi:jsonTest:TelemetryComplexSchemas:_contents:__proximity;1", - "contentType": "application/json", - "dtv:topic": "sample/{senderId}/telemetry/proximity", + "op": "subscribeevent" + } + ] + }, + "resultArray": { + "data": { + "type": "array", + "items": { + "title": "Results", + "type": "string", + "enum": [ + "success", + "failure" + ] + } + }, + "forms": [ + { + "href": "dtmi:jsonTest:TelemetryComplexSchemas:_contents:__resultArray;1", "op": "subscribeevent" } ] @@ -171,8 +168,6 @@ "forms": [ { "href": "dtmi:jsonTest:TelemetryComplexSchemas:_contents:__speed;1", - "contentType": "application/json", - "dtv:topic": "sample/{senderId}/telemetry/speed", "op": "subscribeevent" } ] diff --git a/codegen2/eval/wot/TelemetryPrimitiveSchemas.SchemaNames.json b/codegen2/eval/wot/TelemetryPrimitiveSchemas.SchemaNames.json new file mode 100644 index 0000000000..b7299af40c --- /dev/null +++ b/codegen2/eval/wot/TelemetryPrimitiveSchemas.SchemaNames.json @@ -0,0 +1,22 @@ +{ + "eventSchema": { + "in": [ "eventName" ], + "out": "{eventName}Telemetry", + "capitalize": true + }, + "eventValueSchema": { + "in": [ "eventSchema" ], + "out": "{eventSchema}Schema", + "capitalize": true + }, + "eventSenderBinder": { + "in": [ "eventSchema" ], + "out": "{eventSchema}TelemetrySender", + "capitalize": true + }, + "eventReceiverBinder": { + "in": [ "eventSchema" ], + "out": "{eventSchema}TelemetryReceiver", + "capitalize": true + } +} diff --git a/codegen2/eval/wot/TelemetryPrimitiveSchemas.TD.json b/codegen2/eval/wot/TelemetryPrimitiveSchemas.TD.json new file mode 100644 index 0000000000..e707b63989 --- /dev/null +++ b/codegen2/eval/wot/TelemetryPrimitiveSchemas.TD.json @@ -0,0 +1,199 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:jsonTest:TelemetryPrimitiveSchemas;1", + "title": "TelemetryPrimitiveSchemas", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "links": [ + { + "rel": "service-desc", + "href": "./TelemetryPrimitiveSchemas.SchemaNames.json", + "type": "application/json" + } + ], + "actions": { + }, + "properties": { + }, + "events": { + "endDate": { + "data": { + "type": "string", + "format": "date" + }, + "forms": [ + { + "href": "dtmi:jsonTest:TelemetryPrimitiveSchemas:_contents:__endDate;1", + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry/endDate", + "op": "subscribeevent" + } + ] + }, + "startDateTime": { + "data": { + "type": "string", + "format": "date-time" + }, + "forms": [ + { + "href": "dtmi:jsonTest:TelemetryPrimitiveSchemas:_contents:__startDateTime;1", + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry/startDateTime", + "op": "subscribeevent" + } + ] + }, + "targetTime": { + "data": { + "type": "string", + "format": "time" + }, + "forms": [ + { + "href": "dtmi:jsonTest:TelemetryPrimitiveSchemas:_contents:__targetTime;1", + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry/targetTime", + "op": "subscribeevent" + } + ] + }, + "allottedDuration": { + "data": { + "type": "string", + "pattern": "^P(?!$)(?:(?:(?:(?:\\d+Y)|(?:\\d+\\.\\d+Y$))?(?:(?:\\d+M)|(?:\\d+\\.\\d+M$))?)|(?:(?:(?:\\d+W)|(?:\\d+\\.\\d+W$))?))(?:(?:\\d+D)|(?:\\d+\\.\\d+D$))?(?:T(?!$)(?:(?:\\d+H)|(?:\\d+\\.\\d+H$))?(?:(?:\\d+M)|(?:\\d+\\.\\d+M$))?(?:\\d+(?:\\.\\d+)?S)?)?$" + }, + "forms": [ + { + "href": "dtmi:jsonTest:TelemetryPrimitiveSchemas:_contents:__allottedDuration;1", + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry/allottedDuration", + "op": "subscribeevent" + } + ] + }, + "identifier": { + "data": { + "type": "string", + "format": "uuid" + }, + "forms": [ + { + "href": "dtmi:jsonTest:TelemetryPrimitiveSchemas:_contents:__identifier;1", + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry/identifier", + "op": "subscribeevent" + } + ] + }, + "data": { + "data": { + "type": "string", + "contentEncoding": "base64" + }, + "forms": [ + { + "href": "dtmi:jsonTest:TelemetryPrimitiveSchemas:_contents:__data;1", + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry/data", + "op": "subscribeevent" + } + ] + }, + "flipflop": { + "data": { + "type": "boolean" + }, + "forms": [ + { + "href": "dtmi:jsonTest:TelemetryNativeSchemas:_contents:__flipflop;1", + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry/flipflop", + "op": "subscribeevent" + } + ] + }, + "absoluteDistance": { + "data": { + "type": "number", + "minimum": -1.80e+308, + "maximum": 1.80e+308 + }, + "forms": [ + { + "href": "dtmi:jsonTest:TelemetryNativeSchemas:_contents:__absoluteDistance;1", + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry/absoluteDistance", + "op": "subscribeevent" + } + ] + }, + "relativeDistance": { + "data": { + "type": "number", + "minimum": -3.40e+38, + "maximum": 3.40e+38 + }, + "forms": [ + { + "href": "dtmi:jsonTest:TelemetryNativeSchemas:_contents:__relativeDistance;1", + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry/relativeDistance", + "op": "subscribeevent" + } + ] + }, + "count": { + "data": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + }, + "forms": [ + { + "href": "dtmi:jsonTest:TelemetryNativeSchemas:_contents:__count;1", + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry/count", + "op": "subscribeevent" + } + ] + }, + "totalCount": { + "data": { + "type": "integer", + "minimum": -9223372036854775808, + "maximum": 9223372036854775807 + }, + "forms": [ + { + "href": "dtmi:jsonTest:TelemetryNativeSchemas:_contents:__totalCount;1", + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry/totalCount", + "op": "subscribeevent" + } + ] + }, + "notes": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:jsonTest:TelemetryNativeSchemas:_contents:__notes;1", + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry/notes", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/eval/wot/ThingOne.SchemaNames.json b/codegen2/eval/wot/ThingOne.SchemaNames.json new file mode 100644 index 0000000000..3cc856b6eb --- /dev/null +++ b/codegen2/eval/wot/ThingOne.SchemaNames.json @@ -0,0 +1,14 @@ +{ + "aggregateEventName": "EventsOne", + "aggregateEventSchema": "EventCollectionOne", + "eventSchema": { + "in": [ "eventName" ], + "out": "{eventName}EventOne", + "capitalize": true + }, + "eventValueSchema": { + "in": [ "eventSchema" ], + "out": "EventOne{eventSchema}Value", + "capitalize": true + } +} diff --git a/codegen2/eval/wot/ThingTwo.SchemaNames.json b/codegen2/eval/wot/ThingTwo.SchemaNames.json new file mode 100644 index 0000000000..90e9a01e8c --- /dev/null +++ b/codegen2/eval/wot/ThingTwo.SchemaNames.json @@ -0,0 +1,14 @@ +{ + "aggregateEventName": "EventsTwo", + "aggregateEventSchema": "EventCollectionTwo", + "eventSchema": { + "in": [ "eventName" ], + "out": "{eventName}EventTwo", + "capitalize": true + }, + "eventValueSchema": { + "in": [ "eventSchema" ], + "out": "EventTwo{eventSchema}Value", + "capitalize": true + } +} diff --git a/codegen2/eval/wot/TwoThings.TD.json b/codegen2/eval/wot/TwoThings.TD.json new file mode 100644 index 0000000000..6208a31e5a --- /dev/null +++ b/codegen2/eval/wot/TwoThings.TD.json @@ -0,0 +1,96 @@ +[ + { + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:jsonTest:ThingOne;1", + "title": "ThingOne", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "links": [ + { + "rel": "service-desc", + "href": "./ThingOne.SchemaNames.json", + "type": "application/json" + } + ], + "forms": [ + { + "href": "dtmi:jsonTest:ThingOne;1", + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry1", + "op": "subscribeallevents" + } + ], + "actions": { + }, + "properties": { + }, + "events": { + "Alpha": { + "data": { + "type": "string" + } + }, + "Beta": { + "data": { + "type": "string" + } + } + } + }, + { + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:jsonTest:ThingTwo;1", + "title": "ThingTwo", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "links": [ + { + "rel": "service-desc", + "href": "./ThingTwo.SchemaNames.json", + "type": "application/json" + } + ], + "forms": [ + { + "href": "dtmi:jsonTest:ThingTwo;1", + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry2", + "op": "subscribeallevents" + } + ], + "actions": { + }, + "properties": { + }, + "events": { + "Gamma": { + "data": { + "type": "string" + } + }, + "Beta": { + "data": { + "type": "string" + } + } + } + } +] diff --git a/codegen2/res/rust/AVRO/common_types.rs b/codegen2/res/rust/AVRO/common_types.rs new file mode 100644 index 0000000000..ed2a18d83a --- /dev/null +++ b/codegen2/res/rust/AVRO/common_types.rs @@ -0,0 +1,7 @@ +/* This file will be copied into the folder for generated code. */ +pub mod b64; +pub mod date_only; +pub mod decimal; +pub mod empty_avro; +pub mod options; +pub mod time_only; diff --git a/codegen2/res/rust/AVRO/common_types/b64.rs b/codegen2/res/rust/AVRO/common_types/b64.rs new file mode 100644 index 0000000000..66a3fe1d2f --- /dev/null +++ b/codegen2/res/rust/AVRO/common_types/b64.rs @@ -0,0 +1,43 @@ +/* This file will be copied into the folder for generated code. */ + +use std::ops::{Deref, DerefMut}; + +use base64::prelude::*; +use serde::{Deserialize, Deserializer, Serialize, Serializer, de}; +use serde_bytes; + +#[derive(Clone, Debug)] +pub struct Bytes(pub Vec); + +impl Deref for Bytes { + type Target = Vec; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl DerefMut for Bytes { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } +} + +impl Serialize for Bytes { + fn serialize(&self, s: S) -> Result + where + S: Serializer, + { + s.serialize_bytes(&self.0) + } +} + +impl<'de> Deserialize<'de> for Bytes { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let s: Vec = serde_bytes::deserialize(deserializer)?; + Ok(Bytes(s)) + } +} diff --git a/codegen2/res/rust/AVRO/common_types/empty_avro.rs b/codegen2/res/rust/AVRO/common_types/empty_avro.rs new file mode 100644 index 0000000000..c12f0393a8 --- /dev/null +++ b/codegen2/res/rust/AVRO/common_types/empty_avro.rs @@ -0,0 +1,45 @@ +/* This file will be copied into the folder for generated code. */ + +use std::io::Cursor; + +use apache_avro; +use azure_iot_operations_protocol::common::payload_serialize::{ + DeserializationError, FormatIndicator, PayloadSerialize, SerializedPayload, +}; +use lazy_static; +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct EmptyAvro { +} + +impl PayloadSerialize for EmptyAvro{ + type Error = String; + + fn serialize(self) -> Result { + Ok(SerializedPayload { + payload: apache_avro::to_avro_datum(&SCHEMA, apache_avro::to_value(self).unwrap()).unwrap(), + content_type: "application/avro".to_string(), + format_indicator: FormatIndicator::UnspecifiedBytes, + }) + } + + fn deserialize( + payload: &[u8], + _content_type: Option<&String>, + _format_indicator: &FormatIndicator, + ) -> Result> { + Ok(apache_avro::from_value(&apache_avro::from_avro_datum(&SCHEMA, &mut Cursor::new(payload), None).unwrap()).unwrap()) + } +} + +lazy_static::lazy_static! { pub static ref SCHEMA: apache_avro::Schema = apache_avro::Schema::parse_str(RAW_SCHEMA).unwrap(); } + +const RAW_SCHEMA: &str = r#" +{ + "namespace": "resources.common_types", + "name": "EmptyAvro", + "type": "record", + "fields": [] +} +"#; diff --git a/codegen2/res/rust/JSON/common_types.rs b/codegen2/res/rust/JSON/common_types.rs new file mode 100644 index 0000000000..6e6592aa9f --- /dev/null +++ b/codegen2/res/rust/JSON/common_types.rs @@ -0,0 +1,7 @@ +/* This file will be copied into the folder for generated code. */ +pub mod b64; +pub mod date_only; +pub mod decimal; +pub mod empty_json; +pub mod options; +pub mod time_only; diff --git a/codegen2/res/rust/JSON/common_types/b64.rs b/codegen2/res/rust/JSON/common_types/b64.rs new file mode 100644 index 0000000000..66453d9ccf --- /dev/null +++ b/codegen2/res/rust/JSON/common_types/b64.rs @@ -0,0 +1,44 @@ +/* This file will be copied into the folder for generated code. */ + +use std::ops::{Deref, DerefMut}; + +use base64::prelude::*; +use serde::{Deserialize, Deserializer, Serialize, Serializer, de}; + +#[derive(Clone, Debug)] +pub struct Bytes(pub Vec); + +impl Deref for Bytes { + type Target = Vec; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl DerefMut for Bytes { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } +} + +impl Serialize for Bytes { + fn serialize(&self, s: S) -> Result + where + S: Serializer, + { + s.serialize_str(BASE64_STANDARD.encode(&self.0).as_str()) + } +} + +impl<'de> Deserialize<'de> for Bytes { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let s: String = String::deserialize(deserializer)?; + Ok(Bytes( + BASE64_STANDARD.decode(&s).map_err(de::Error::custom)?, + )) + } +} diff --git a/codegen2/res/rust/JSON/common_types/empty_json.rs b/codegen2/res/rust/JSON/common_types/empty_json.rs new file mode 100644 index 0000000000..755086513d --- /dev/null +++ b/codegen2/res/rust/JSON/common_types/empty_json.rs @@ -0,0 +1,28 @@ +/* This file will be copied into the folder for generated code. */ + +use azure_iot_operations_protocol::common::payload_serialize::{ + DeserializationError, FormatIndicator, PayloadSerialize, SerializedPayload, +}; + +#[derive(Debug, Clone)] +pub struct EmptyJson {} + +impl PayloadSerialize for EmptyJson { + type Error = String; + + fn serialize(self) -> Result { + Ok(SerializedPayload { + payload: "".as_bytes().to_owned(), + content_type: "application/json".to_string(), + format_indicator: FormatIndicator::Utf8EncodedCharacterData, + }) + } + + fn deserialize( + _payload: &[u8], + _content_type: Option<&String>, + _format_indicator: &FormatIndicator, + ) -> Result> { + Ok(Self {}) + } +} diff --git a/codegen2/res/rust/common/common_types.rs b/codegen2/res/rust/common/common_types.rs new file mode 100644 index 0000000000..2c16445370 --- /dev/null +++ b/codegen2/res/rust/common/common_types.rs @@ -0,0 +1,5 @@ +/* This file will be copied into the folder for generated code. */ +pub mod date_only; +pub mod decimal; +pub mod options; +pub mod time_only; diff --git a/codegen2/res/rust/common/common_types/date_only.rs b/codegen2/res/rust/common/common_types/date_only.rs new file mode 100644 index 0000000000..cdabee9cab --- /dev/null +++ b/codegen2/res/rust/common/common_types/date_only.rs @@ -0,0 +1,68 @@ +/* This file will be copied into the folder for generated code. */ + +use std::ops::{Deref, DerefMut}; + +use chrono::{TimeZone, Utc}; +use serde::{Deserialize, Deserializer, Serialize, Serializer, de, ser}; +use time::{self, format_description::well_known::Rfc3339}; + +#[derive(Clone, Debug)] +pub struct Date(time::Date); + +impl Deref for Date { + type Target = time::Date; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl DerefMut for Date { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } +} + +impl Serialize for Date { + fn serialize(&self, s: S) -> Result + where + S: Serializer, + { + s.serialize_str(date_to_rfc3339(self).map_err(ser::Error::custom)?.as_str()) + } +} + +impl<'de> Deserialize<'de> for Date { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let s: String = String::deserialize(deserializer)?; + rfc3339_to_date(&s).map_err(de::Error::custom) + } +} + +fn date_to_rfc3339(date: &Date) -> Result { + let date_time = Utc + .with_ymd_and_hms( + date.year(), + date.month() as u32, + u32::from(date.day()), + 0, + 0, + 0, + ) + .unwrap(); + let date_time_string = date_time.to_rfc3339(); + let t_ix = date_time_string + .find('T') + .ok_or("error serializing Date to RFC 3339 format")?; + Ok((date_time_string[..t_ix]).to_string()) +} + +fn rfc3339_to_date(date_str: &str) -> Result { + Ok(Date( + time::Date::parse(format!("{date_str}T00:00:00Z").as_str(), &Rfc3339) + .map_err(|_| "error deserializing Date from RFC 3339 format")?, + )) +} diff --git a/codegen2/res/rust/common/common_types/decimal.rs b/codegen2/res/rust/common/common_types/decimal.rs new file mode 100644 index 0000000000..bbd88ef785 --- /dev/null +++ b/codegen2/res/rust/common/common_types/decimal.rs @@ -0,0 +1,45 @@ +/* This file will be copied into the folder for generated code. */ + +use std::ops::{Deref, DerefMut}; +use std::str::FromStr; + +use bigdecimal; +use serde::{Deserialize, Deserializer, Serialize, Serializer, de}; + +#[derive(Clone, Debug)] +pub struct Decimal(bigdecimal::BigDecimal); + +impl Deref for Decimal { + type Target = bigdecimal::BigDecimal; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl DerefMut for Decimal { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } +} + +impl Serialize for Decimal { + fn serialize(&self, s: S) -> Result + where + S: Serializer, + { + s.serialize_str(self.to_string().as_str()) + } +} + +impl<'de> Deserialize<'de> for Decimal { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let s: String = String::deserialize(deserializer)?; + Ok(Decimal( + bigdecimal::BigDecimal::from_str(&s).map_err(de::Error::custom)?, + )) + } +} diff --git a/codegen2/res/rust/common/common_types/options.rs b/codegen2/res/rust/common/common_types/options.rs new file mode 100644 index 0000000000..7b5de1594e --- /dev/null +++ b/codegen2/res/rust/common/common_types/options.rs @@ -0,0 +1,62 @@ +/* This file will be copied into the folder for generated code. */ + +use std::collections::HashMap; + +use derive_builder::Builder; + +#[allow(unused)] +#[derive(Builder, Clone)] +pub struct CommandExecutorOptions { + /// Optional Topic namespace to be prepended to the topic pattern + #[builder(default = "None")] + pub topic_namespace: Option, + /// Topic token keys/values to be replaced in the topic pattern + #[builder(default)] + pub topic_token_map: HashMap, +} + +#[allow(unused)] +#[derive(Builder, Clone)] +pub struct CommandInvokerOptions { + /// Optional Topic namespace to be prepended to the topic pattern + #[builder(default = "None")] + pub topic_namespace: Option, + /// Topic token keys/values to be replaced in the topic pattern + #[builder(default)] + pub topic_token_map: HashMap, + /// Prefix for the response topic. + /// If all response topic options are `None`, the response topic will be generated + /// based on the request topic in the form: `clients//` + #[builder(default = "None")] + pub response_topic_prefix: Option, + /// Suffix for the response topic. + /// If all response topic options are `None`, the response topic will be generated + /// based on the request topic in the form: `clients//` + #[builder(default = "None")] + pub response_topic_suffix: Option, +} + +#[allow(unused)] +#[derive(Builder, Clone)] +pub struct TelemetryReceiverOptions { + /// Optional Topic namespace to be prepended to the topic pattern + #[builder(default = "None")] + pub topic_namespace: Option, + /// Topic token keys/values to be replaced in the topic pattern + #[builder(default)] + pub topic_token_map: HashMap, + /// If true, telemetry messages are auto-acknowledged when received + #[builder(default = "true")] + pub auto_ack: bool, +} + +#[allow(unused)] +#[derive(Builder, Clone)] +pub struct TelemetrySenderOptions { + /// Optional Topic namespace to be prepended to the topic pattern + #[builder(default = "None")] + pub topic_namespace: Option, + /// Topic token keys/values to be replaced in the topic pattern + #[builder(default)] + pub topic_token_map: HashMap, +} diff --git a/codegen2/res/rust/common/common_types/time_only.rs b/codegen2/res/rust/common/common_types/time_only.rs new file mode 100644 index 0000000000..2de7500629 --- /dev/null +++ b/codegen2/res/rust/common/common_types/time_only.rs @@ -0,0 +1,74 @@ +/* This file will be copied into the folder for generated code. */ + +use std::ops::{Deref, DerefMut}; + +use chrono::{TimeZone, Utc}; +use serde::{Deserialize, Deserializer, Serialize, Serializer, de, ser}; +use time::{self, format_description::well_known::Rfc3339}; + +#[derive(Clone, Debug)] +pub struct Time(time::Time); + +impl Deref for Time { + type Target = time::Time; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl DerefMut for Time { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } +} + +impl Serialize for Time { + fn serialize(&self, s: S) -> Result + where + S: Serializer, + { + s.serialize_str(time_to_rfc3339(self).map_err(ser::Error::custom)?.as_str()) + } +} + +impl<'de> Deserialize<'de> for Time { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let s: String = String::deserialize(deserializer)?; + rfc3339_to_time(&s).map_err(de::Error::custom) + } +} + +fn time_to_rfc3339(time: &Time) -> Result { + let date_time = Utc + .with_ymd_and_hms( + 0, + 1, + 1, + u32::from(time.hour()), + u32::from(time.minute()), + u32::from(time.second()), + ) + .unwrap(); + let date_time_string = date_time.to_rfc3339(); + let t_ix = date_time_string + .find('T') + .ok_or("error serializing Time to RFC 3339 format")?; + let plus_ix = date_time_string + .find('+') + .ok_or("error serializing Time to RFC 3339 format")?; + let time_str = &date_time_string[t_ix + 1..plus_ix]; + let mut time_string = time_str.to_string(); + time_string.push('Z'); + Ok(time_string) +} + +fn rfc3339_to_time(time_str: &str) -> Result { + Ok(Time( + time::Time::parse(format!("0000-01-01T{time_str}").as_str(), &Rfc3339) + .map_err(|_| "error deserializing Time from RFC 3339 format")?, + )) +} diff --git a/codegen2/res/rust/custom/common_types.rs b/codegen2/res/rust/custom/common_types.rs new file mode 100644 index 0000000000..c8c8466eaf --- /dev/null +++ b/codegen2/res/rust/custom/common_types.rs @@ -0,0 +1,3 @@ +/* This file will be copied into the folder for generated code. */ +pub mod custom_payload; +pub mod options; diff --git a/codegen2/res/rust/custom/common_types/custom_payload.rs b/codegen2/res/rust/custom/common_types/custom_payload.rs new file mode 100644 index 0000000000..7877d6d6f5 --- /dev/null +++ b/codegen2/res/rust/custom/common_types/custom_payload.rs @@ -0,0 +1,6 @@ +/* This file will be copied into the folder for generated code. */ + +use azure_iot_operations_protocol::common::payload_serialize::BypassPayload; + +/// A provided convenience struct for data that is externally serialized via custom code. +pub type CustomPayload = BypassPayload; diff --git a/codegen2/res/rust/raw/common_types.rs b/codegen2/res/rust/raw/common_types.rs new file mode 100644 index 0000000000..680494dd9e --- /dev/null +++ b/codegen2/res/rust/raw/common_types.rs @@ -0,0 +1,2 @@ +/* This file will be copied into the folder for generated code. */ +pub mod options; diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/EmptyTypeName.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/EmptyTypeName.cs index bdbd966d12..e008613f95 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/EmptyTypeName.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/EmptyTypeName.cs @@ -29,7 +29,7 @@ public class EmptyAvroTypeName : EmptyTypeName public override string GetAllocator(TargetLanguage language) => language switch { TargetLanguage.CSharp => "new EmptyAvro()", - TargetLanguage.Rust => "EmptyAvro{}", + TargetLanguage.Rust => "EmptyAvro {}", _ => throw new InvalidOperationException($"There is no {language} allocator for {typeof(EmptyAvroTypeName)}"), }; } @@ -72,7 +72,7 @@ public class EmptyJsonTypeName : EmptyTypeName public override string GetAllocator(TargetLanguage language) => language switch { TargetLanguage.CSharp => "new EmptyJson()", - TargetLanguage.Rust => "EmptyJson{}", + TargetLanguage.Rust => "EmptyJson {}", _ => throw new InvalidOperationException($"There is no {language} allocator for {typeof(EmptyAvroTypeName)}"), }; } @@ -112,7 +112,7 @@ public override string GetFileName(TargetLanguage language, string? suffix1 = nu public override string GetAllocator(TargetLanguage language) => language switch { TargetLanguage.CSharp => "Array.Empty()", - TargetLanguage.Rust => "byte[]{}", + TargetLanguage.Rust => "byte[] {}", _ => throw new InvalidOperationException($"There is no {language} allocator for {typeof(EmptyAvroTypeName)}"), }; } @@ -132,7 +132,7 @@ public override string GetFileName(TargetLanguage language, string? suffix1 = nu public override string GetAllocator(TargetLanguage language) => language switch { TargetLanguage.CSharp => "ExternalSerializer.EmptyValue", - TargetLanguage.Rust => "CustomPayload{}", + TargetLanguage.Rust => "CustomPayload {}", _ => throw new InvalidOperationException($"There is no {language} allocator for {typeof(EmptyAvroTypeName)}"), }; } diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/FormInfo.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/FormInfo.cs index a67d5a30c9..31610a708c 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/FormInfo.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/FormInfo.cs @@ -7,12 +7,15 @@ public record FormInfo( SerializationFormat Format, bool HasErrorResponse, - string? ErrorSchemaName, - TDDataSchema? ErrorSchema, - SerializationFormat ErrorSchemaFormat, - string? HeaderSchemaName, - TDDataSchema? HeaderSchema, - SerializationFormat HeaderSchemaFormat, + string? ErrorRespName, + TDDataSchema? ErrorRespSchema, + SerializationFormat ErrorRespFormat, + string? HeaderInfoName, + TDDataSchema? HeaderInfoSchema, + SerializationFormat HeaderInfoFormat, + string? HeaderCodeName, + TDDataSchema? HeaderCodeSchema, + string? ServiceGroupId, string? TopicPattern) { public static FormInfo? CreateFromForm(TDForm? form, Dictionary? schemaDefinitions) @@ -22,23 +25,37 @@ public record FormInfo( return null; } - SerializationFormat format = ContentTypeToFormat(form.ContentType); + SerializationFormat format = ThingSupport.ContentTypeToFormat(form.ContentType); bool hasErrorResponse = form.AdditionalResponses?.Any(r => !r.Success) ?? false; TDSchemaReference? errorSchemaRef = form.AdditionalResponses?.FirstOrDefault(r => !r.Success && r.Schema != null); - var (errorSchemaName, errorSchema, errorSchemaFormat) = GetSchemaAndFormat(errorSchemaRef, form, schemaDefinitions); + var (errorRespName, errorRespSchema, errorRespFormat) = GetSchemaAndFormat(errorSchemaRef, form, schemaDefinitions); TDSchemaReference? headerSchemaRef = form.HeaderInfo?.FirstOrDefault(r => r.Schema != null); - var (headerSchemaName, headerSchema, headerSchemaFormat) = GetSchemaAndFormat(headerSchemaRef, form, schemaDefinitions); + var (headerInfoName, headerInfoSchema, headerInfoFormat) = GetSchemaAndFormat(headerSchemaRef, form, schemaDefinitions); - return new FormInfo(format, hasErrorResponse, errorSchemaName, errorSchema, errorSchemaFormat, headerSchemaName, headerSchema, headerSchemaFormat, form.Topic); + TDDataSchema? headerCodeSchema = GetSchema(form.HeaderCode, schemaDefinitions); + + return new FormInfo( + format, + hasErrorResponse, + errorRespName, + errorRespSchema, + errorRespFormat, + headerInfoName, + headerInfoSchema, + headerInfoFormat, + form.HeaderCode, + headerCodeSchema, + form.ServiceGroupId, + form.Topic); } private static (string?, TDDataSchema?, SerializationFormat) GetSchemaAndFormat(TDSchemaReference? schemaRef, TDForm? form, Dictionary? schemaDefinitions) { string? schemaName = schemaRef?.Schema; - SerializationFormat schemaFormat = ContentTypeToFormat(schemaRef?.ContentType ?? form?.ContentType); + SerializationFormat schemaFormat = ThingSupport.ContentTypeToFormat(schemaRef?.ContentType ?? form?.ContentType); TDDataSchema? schema = null; schemaDefinitions?.TryGetValue(schemaName ?? string.Empty, out schema); @@ -46,13 +63,9 @@ private static (string?, TDDataSchema?, SerializationFormat) GetSchemaAndFormat( return (schemaName, schema, schemaFormat); } - private static SerializationFormat ContentTypeToFormat(string? contentType) + private static TDDataSchema? GetSchema(string? schemaName, Dictionary? schemaDefinitions) { - return contentType switch - { - TDValues.ContentTypeJson => SerializationFormat.Json, - _ => SerializationFormat.None, - }; + return schemaDefinitions?.TryGetValue(schemaName ?? string.Empty, out TDDataSchema? schema) ?? false ? schema : null; } } } diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/FormatSupport.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/FormatSupport.cs new file mode 100644 index 0000000000..a79be2c9ce --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/FormatSupport.cs @@ -0,0 +1,32 @@ +namespace Azure.Iot.Operations.CodeGeneration +{ + public static class FormatSupport + { + public static string GetSerializerSubNamespace(this SerializationFormat format) + { + return format switch + { + SerializationFormat.Json => "JSON", + _ => string.Empty, + }; + } + + public static string GetSerializerClassName(this SerializationFormat format) + { + return format switch + { + SerializationFormat.Json => "Utf8JsonSerializer", + _ => string.Empty, + }; + } + + public static EmptyTypeName GetEmptyTypeName(this SerializationFormat format) + { + return format switch + { + SerializationFormat.Json => EmptyTypeName.JsonInstance, + _ => EmptyTypeName.JsonInstance, + }; + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/GeneratedItem.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/GeneratedItem.cs new file mode 100644 index 0000000000..b98a944171 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/GeneratedItem.cs @@ -0,0 +1,4 @@ +namespace Azure.Iot.Operations.CodeGeneration +{ + public record GeneratedItem(string Content, string FileName, string FolderPath); +} diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ParsedThing.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ParsedThing.cs new file mode 100644 index 0000000000..e5a882634c --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ParsedThing.cs @@ -0,0 +1,6 @@ +namespace Azure.Iot.Operations.CodeGeneration +{ + using Azure.Iot.Operations.TDParser.Model; + + public record ParsedThing(TDThing Thing, SchemaNamer SchemaNamer); +} diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNameInfo.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNameInfo.cs index eb53feb020..2b5831bc39 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNameInfo.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNameInfo.cs @@ -4,6 +4,15 @@ public class SchemaNameInfo { + [JsonPropertyName("suppressTitles")] + public bool SuppressTitles { get; set; } + + [JsonPropertyName("constantsSchema")] + public string? ConstantsSchema { get; set; } + + [JsonPropertyName("aggregateEventName")] + public string? AggregateEventName { get; set; } + [JsonPropertyName("aggregateEventSchema")] public string? AggregateEventSchema { get; set; } @@ -28,24 +37,36 @@ public class SchemaNameInfo [JsonPropertyName("aggregatePropWriteErrSchema")] public string? AggregatePropWriteErrSchema { get; set; } + [JsonPropertyName("readRequesterBinder")] + public string? ReadRequesterBinder { get; set; } + + [JsonPropertyName("readResponderBinder")] + public string? ReadResponderBinder { get; set; } + + [JsonPropertyName("writeRequesterBinder")] + public string? WriteRequesterBinder { get; set; } + + [JsonPropertyName("writeResponderBinder")] + public string? WriteResponderBinder { get; set; } + [JsonPropertyName("aggregateReadRespValueField")] public string? AggregateReadRespValueField { get; set; } [JsonPropertyName("aggregateRespErrorField")] public string? AggregateRespErrorField { get; set; } - [JsonPropertyName("propRespErrorField")] - public string? PropRespErrorField { get; set; } - - [JsonPropertyName("actionRespErrorField")] - public string? ActionRespErrorField { get; set; } - [JsonPropertyName("eventSchema")] public FuncInfo? EventSchema { get; set; } [JsonPropertyName("eventValueSchema")] public FuncInfo? EventValueSchema { get; set; } + [JsonPropertyName("eventSenderBinder")] + public FuncInfo? EventSenderBinder { get; set; } + + [JsonPropertyName("eventReceiverBinder")] + public FuncInfo? EventReceiverBinder { get; set; } + [JsonPropertyName("propSchema")] public FuncInfo? PropSchema { get; set; } @@ -61,6 +82,18 @@ public class SchemaNameInfo [JsonPropertyName("propValueSchema")] public FuncInfo? PropValueSchema { get; set; } + [JsonPropertyName("propReadActName")] + public FuncInfo? PropReadActName { get; set; } + + [JsonPropertyName("propWriteActName")] + public FuncInfo? PropWriteActName { get; set; } + + [JsonPropertyName("propMaintainerBinder")] + public FuncInfo? PropMaintainerBinder { get; set; } + + [JsonPropertyName("propConsumerBinder")] + public FuncInfo? PropConsumerBinder { get; set; } + [JsonPropertyName("actionInSchema")] public FuncInfo? ActionInSchema { get; set; } @@ -70,7 +103,22 @@ public class SchemaNameInfo [JsonPropertyName("actionRespSchema")] public FuncInfo? ActionRespSchema { get; set; } + [JsonPropertyName("actionExecutorBinder")] + public FuncInfo? ActionExecutorBinder { get; set; } + + [JsonPropertyName("actionInvokerBinder")] + public FuncInfo? ActionInvokerBinder { get; set; } + [JsonPropertyName("backupSchemaName")] public FuncInfo? BackupSchemaName { get; set; } + + [JsonPropertyName("propReadRespErrorField")] + public FuncInfo? PropReadRespErrorField { get; set; } + + [JsonPropertyName("propWriteRespErrorField")] + public FuncInfo? PropWriteRespErrorField { get; set; } + + [JsonPropertyName("actionRespErrorField")] + public FuncInfo? ActionRespErrorField { get; set; } } } diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNamer.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNamer.cs index edc9d7b774..5d2640a88d 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNamer.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNamer.cs @@ -1,17 +1,24 @@ namespace Azure.Iot.Operations.CodeGeneration { + using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Linq; public class SchemaNamer { private SchemaNameInfo? schemaNameInfo; + private bool suppressTitles; public SchemaNamer(string? schemaNameInfoText) { this.schemaNameInfo = schemaNameInfoText != null ? JsonSerializer.Deserialize(schemaNameInfoText) : null; + this.suppressTitles = this.schemaNameInfo?.SuppressTitles ?? false; } + public string ConstantsSchema { get => this.schemaNameInfo?.ConstantsSchema ?? "Constants"; } + + public string AggregateEventName { get => this.schemaNameInfo?.AggregateEventName ?? "Events"; } + public string AggregateEventSchema { get => this.schemaNameInfo?.AggregateEventSchema ?? "EventCollection"; } public string AggregatePropName { get => this.schemaNameInfo?.AggregatePropName ?? "Properties"; } @@ -28,38 +35,74 @@ public SchemaNamer(string? schemaNameInfoText) public string AggregatePropWriteErrSchema { get => this.schemaNameInfo?.AggregatePropWriteErrSchema ?? "PropertyCollectionWriteError"; } + public string ReadRequesterBinder { get => this.schemaNameInfo?.ReadRequesterBinder ?? "ReadRequester"; } + + public string ReadResponderBinder { get => this.schemaNameInfo?.ReadResponderBinder ?? "ReadResponder"; } + + public string WriteRequesterBinder { get => this.schemaNameInfo?.WriteRequesterBinder ?? "WriteRequester"; } + + public string WriteResponderBinder { get => this.schemaNameInfo?.WriteResponderBinder ?? "WriteResponder"; } + public string AggregateReadRespValueField { get => this.schemaNameInfo?.AggregateReadRespValueField ?? "_properties"; } public string AggregateRespErrorField { get => this.schemaNameInfo?.AggregateRespErrorField ?? "_errors"; } - public string PropRespErrorField { get => this.schemaNameInfo?.PropRespErrorField ?? "_error"; } + public string GetEventSchema(string eventName) => Expand(null, this.schemaNameInfo?.EventSchema, $"{Cap(eventName)}Event", eventName); + + public string GetEventValueSchema(string eventSchema) => Expand(null, this.schemaNameInfo?.EventValueSchema, $"{Cap(eventSchema)}Value", eventSchema); + + public string GetEventSenderBinder(string eventSchema) => Expand(null, this.schemaNameInfo?.EventSenderBinder, $"{Cap(eventSchema)}Sender", eventSchema); + + public string GetEventReceiverBinder(string eventSchema) => Expand(null, this.schemaNameInfo?.EventReceiverBinder, $"{Cap(eventSchema)}Receiver", eventSchema); + + public string GetPropSchema(string propName) => Expand(null, this.schemaNameInfo?.PropSchema, $"{Cap(propName)}Property", propName); - public string ActionRespErrorField { get => this.schemaNameInfo?.ActionRespErrorField ?? "_error"; } + public string GetWritablePropSchema(string propName) => Expand(null, this.schemaNameInfo?.WritablePropSchema, $"{Cap(propName)}WritableProperty", propName); - public string GetEventSchema(string eventName) => Expand(this.schemaNameInfo?.EventSchema, $"{Cap(eventName)}Event", eventName); + public string GetPropReadRespSchema(string propName) => Expand(null, this.schemaNameInfo?.PropReadRespSchema, $"{Cap(propName)}ReadResponseSchema", propName); - public string GetEventValueSchema(string eventName) => Expand(this.schemaNameInfo?.EventValueSchema, $"Event{Cap(eventName)}Value", eventName); + public string GetPropWriteRespSchema(string propName) => Expand(null, this.schemaNameInfo?.PropWriteRespSchema, $"{Cap(propName)}WriteResponseSchema", propName); - public string GetPropSchema(string propName) => Expand(this.schemaNameInfo?.PropSchema, $"{Cap(propName)}Property", propName); + public string GetPropValueSchema(string propName) => Expand(null, this.schemaNameInfo?.PropValueSchema, $"Property{Cap(propName)}Value", propName); - public string GetWritablePropSchema(string propName) => Expand(this.schemaNameInfo?.WritablePropSchema, $"{Cap(propName)}WritableProperty", propName); + public string GetPropReadActName(string propName) => Expand(null, this.schemaNameInfo?.PropReadActName, $"Read{Cap(propName)}", propName); - public string GetPropReadRespSchema(string propName) => Expand(this.schemaNameInfo?.PropReadRespSchema, $"{Cap(propName)}ReadResponseSchema", propName); + public string GetPropWriteActName(string propName) => Expand(null, this.schemaNameInfo?.PropWriteActName, $"Write{Cap(propName)}", propName); - public string GetPropWriteRespSchema(string propName) => Expand(this.schemaNameInfo?.PropWriteRespSchema, $"{Cap(propName)}WriteResponseSchema", propName); + public string GetPropMaintainerBinder(string propSchema) => Expand(null, this.schemaNameInfo?.PropMaintainerBinder, $"{Cap(propSchema)}Maintainer", propSchema); - public string GetPropValueSchema(string propName) => Expand(this.schemaNameInfo?.PropValueSchema, $"Property{Cap(propName)}Value", propName); + public string GetPropConsumerBinder(string propSchema) => Expand(null, this.schemaNameInfo?.PropConsumerBinder, $"{Cap(propSchema)}Consumer", propSchema); - public string GetActionInSchema(string actionName) => Expand(this.schemaNameInfo?.ActionInSchema, $"{Cap(actionName)}InputArguments", actionName); + public string GetActionInSchema(string? title, string actionName) => Expand(title, this.schemaNameInfo?.ActionInSchema, $"{Cap(actionName)}InputArguments", actionName); - public string GetActionOutSchema(string actionName) => Expand(this.schemaNameInfo?.ActionOutSchema, $"{Cap(actionName)}OutputArguments", actionName); + public string GetActionOutSchema(string? title, string actionName) => Expand(title, this.schemaNameInfo?.ActionOutSchema, $"{Cap(actionName)}OutputArguments", actionName); - public string GetActionRespSchema(string actionName) => Expand(this.schemaNameInfo?.ActionRespSchema, $"{Cap(actionName)}ResponseSchema", actionName); + public string GetActionRespSchema(string actionName) => Expand(null, this.schemaNameInfo?.ActionRespSchema, $"{Cap(actionName)}ResponseSchema", actionName); - public string GetBackupSchemaName(string parentSchemaName, string childName) => Expand(this.schemaNameInfo?.BackupSchemaName, $"{Cap(parentSchemaName)}{Cap(childName)}", parentSchemaName, childName); + public string GetActionExecutorBinder(string actionName) => Expand(null, this.schemaNameInfo?.ActionExecutorBinder, $"{Cap(actionName)}ActionExecutor", actionName); - private static string Expand(FuncInfo? funcInfo, string defaultOut, params string[] args) + public string GetActionInvokerBinder(string actionName) => Expand(null, this.schemaNameInfo?.ActionInvokerBinder, $"{Cap(actionName)}ActionInvoker", actionName); + + public string GetPropReadRespErrorField(string propName, string errorSchemaName) => Expand(null, this.schemaNameInfo?.PropReadRespErrorField, "_error", propName, errorSchemaName); + + public string GetPropWriteRespErrorField(string propName, string errorSchemaName) => Expand(null, this.schemaNameInfo?.PropWriteRespErrorField, "_error", propName, errorSchemaName); + + public string GetActionRespErrorField(string actionName, string errorSchemaName) => Expand(null, this.schemaNameInfo?.ActionRespErrorField, "_error", actionName, errorSchemaName); + + public string GetBackupSchemaName(string parentSchemaName, string childName) => Expand(null, this.schemaNameInfo?.BackupSchemaName, $"{Cap(parentSchemaName)}{Cap(childName)}", parentSchemaName, childName); + + public string ApplyBackupSchemaName(string? title, string backupName) => ChooseTitleOrName(title, backupName); + + [return: NotNullIfNotNull(nameof(name))] + public string? ChooseTitleOrName(string? title, string? name) => this.suppressTitles ? name : title ?? name; + + private string Expand(string? title, FuncInfo? funcInfo, string defaultOut, params string[] args) { + if (!this.suppressTitles && title != null) + { + return title; + } + if (funcInfo == null || funcInfo.Output == null || funcInfo.Input == null || funcInfo.Input.Length < args.Length) { return defaultOut; @@ -74,7 +117,7 @@ private static string Expand(FuncInfo? funcInfo, string defaultOut, params strin return outString; } - private static string Cap(string input) => char.ToUpper(input[0]) + input.Substring(1); + private static string Cap(string input) => input.Length == 0 ? input : char.ToUpper(input[0]) + input.Substring(1); private static string MaybeCap(string input, bool capitalize) => capitalize ? Cap(input) : input; } diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingSupport.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingSupport.cs new file mode 100644 index 0000000000..79c142d793 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingSupport.cs @@ -0,0 +1,100 @@ +namespace Azure.Iot.Operations.CodeGeneration +{ + using System.Collections.Generic; + using System.Linq; + using Azure.Iot.Operations.TDParser.Model; + + public static class ThingSupport + { + public static List GetSerializationFormats(List things) + { + HashSet formats = new(); + + foreach (TDThing thing in things) + { + AddFormatsFromLinks(thing.Links, formats); + AddFormatsFromForms(thing.Forms, formats); + + if (thing.Actions != null) + { + foreach (TDAction action in thing.Actions.Values) + { + AddFormatsFromForms(action.Forms, formats); + } + } + + if (thing.Properties != null) + { + foreach (TDProperty property in thing.Properties.Values) + { + AddFormatsFromForms(property.Forms, formats); + } + } + + if (thing.Events != null) + { + foreach (TDEvent evt in thing.Events.Values) + { + AddFormatsFromForms(evt.Forms, formats); + } + } + } + + return formats.ToList(); + } + + public static SerializationFormat ContentTypeToFormat(string? contentType) + { + return contentType switch + { + TDValues.ContentTypeJson => SerializationFormat.Json, + _ => SerializationFormat.None, + }; + } + + private static void AddFormatsFromForms(IEnumerable? forms, HashSet formats) + { + if (forms == null) + { + return; + } + + foreach (TDForm form in forms) + { + AddFormatFromContentType(form.ContentType, formats); + AddFormatsFromSchemaReferences(form.AdditionalResponses, formats); + AddFormatsFromSchemaReferences(form.HeaderInfo, formats); + } + } + + private static void AddFormatsFromLinks(IEnumerable? links, HashSet formats) + { + if (links != null) + { + foreach (TDLink link in links) + { + AddFormatFromContentType(link.ContentType, formats); + } + } + } + + private static void AddFormatsFromSchemaReferences(IEnumerable? schemaRefs, HashSet formats) + { + if (schemaRefs != null) + { + foreach (TDSchemaReference resp in schemaRefs) + { + AddFormatFromContentType(resp.ContentType, formats); + } + } + } + + private static void AddFormatFromContentType(string? contentType, HashSet formats) + { + if (contentType != null) + { + formats.Add(ContentTypeToFormat(contentType)); + } + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/.gitignore b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/.gitignore new file mode 100644 index 0000000000..db669da381 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/.gitignore @@ -0,0 +1 @@ +**/t4/*.cs diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs new file mode 100644 index 0000000000..430a4ceb48 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs @@ -0,0 +1,118 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Collections.Generic; + using System.Linq; + using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser.Model; + + internal static class ActionEnvoyGenerator + { + internal static List GenerateActionEnvoys(TDThing tdThing, SchemaNamer schemaNamer, CodeName serviceName, EnvoyTransformFactory envoyFactory, Dictionary transforms, Dictionary errorSpecs, HashSet typesToSerialize) + { + List actionSpecs = new(); + + foreach (KeyValuePair actionKvp in tdThing.Actions ?? new()) + { + FormInfo? actionForm = FormInfo.CreateFromForm(actionKvp.Value.Forms?.FirstOrDefault(f => (f.Op?.Values.Contains(TDValues.OpInvokeAction) ?? false) || (f.Op?.Values.Contains(TDValues.OpQueryAction) ?? false)), tdThing.SchemaDefinitions); + actionForm ??= FormInfo.CreateFromForm(actionKvp.Value.Forms?.FirstOrDefault(f => f.Op == null), tdThing.SchemaDefinitions); + + if (actionForm?.TopicPattern != null && actionForm.Format != SerializationFormat.None) + { + string? inputSchemaType = actionKvp.Value.Input != null ? schemaNamer.GetActionInSchema(actionKvp.Value.Input.Title, actionKvp.Key) : null; + string? outArgsType = actionKvp.Value.Output != null ? schemaNamer.GetActionOutSchema(actionKvp.Value.Output.Title, actionKvp.Key) : null; + string? outputSchemaType = actionForm.ErrorRespSchema != null ? schemaNamer.GetActionRespSchema(actionKvp.Key) : outArgsType; + string? errSchemaName = schemaNamer.ChooseTitleOrName(actionForm.ErrorRespSchema?.Title, actionForm.ErrorRespName); + + List normalResultNames = actionKvp.Value.Output?.Properties?.Keys?.ToList() ?? new(); + List normalRequiredNames = actionKvp.Value.Output?.Required?.ToList() ?? new(); + string? headerCodeSchema = schemaNamer.ChooseTitleOrName(actionForm.HeaderCodeSchema?.Title, actionForm.HeaderCodeName); + string? headerInfoSchema = schemaNamer.ChooseTitleOrName(actionForm.HeaderInfoSchema?.Title, actionForm.HeaderInfoName); + + bool doesTargetExecutor = DoesTopicReferToExecutor(actionForm.TopicPattern); + + actionSpecs.Add(new ActionSpec( + schemaNamer, + actionKvp.Key, + inputSchemaType, + outputSchemaType, + actionForm.Format, + normalResultNames, + normalRequiredNames, + outArgsType, + actionForm.ErrorRespName, + errSchemaName, + actionForm.HeaderCodeName, + headerCodeSchema, + actionForm.HeaderInfoName, + headerInfoSchema, + doesTargetExecutor)); + + foreach (IEnvoyTemplateTransform transform in envoyFactory.GetActionTransforms( + schemaNamer, + tdThing.Id!, + serviceName, + actionKvp.Key, + inputSchemaType, + outputSchemaType, + actionForm.Format, + actionForm.ServiceGroupId, + actionForm.TopicPattern, + actionKvp.Value.Idempotent, + normalResultNames, + normalRequiredNames, + outArgsType, + actionForm.ErrorRespName, + errSchemaName, + actionForm.HeaderCodeName, + headerCodeSchema, + actionForm.HeaderInfoName, + headerInfoSchema, + actionForm.HeaderCodeSchema?.Enum?.ToList(), + doesTargetExecutor)) + { + transforms[transform.FileName] = transform; + } + + if (inputSchemaType != null) + { + typesToSerialize.Add(inputSchemaType); + } + + if (outputSchemaType != null) + { + typesToSerialize.Add(outputSchemaType); + } + + if (actionForm.ErrorRespSchema != null) + { + if (outArgsType != null) + { + typesToSerialize.Add(outArgsType); + } + + typesToSerialize.Add(errSchemaName!); + + ErrorSpec errorSpec = new ErrorSpec( + errSchemaName!, + actionForm.ErrorRespSchema.Description ?? "The action could not be completed", + actionForm.ErrorRespSchema.ErrorMessage, + actionForm.ErrorRespSchema.Required?.Contains(actionForm.ErrorRespSchema.ErrorMessage ?? string.Empty) ?? false, + actionForm.HeaderCodeName, + schemaNamer.ChooseTitleOrName(actionForm.HeaderCodeSchema?.Title, actionForm.HeaderCodeName), + actionForm.HeaderInfoName, + schemaNamer.ChooseTitleOrName(actionForm.HeaderInfoSchema?.Title, actionForm.HeaderInfoName)); + + errorSpecs[errSchemaName!] = errorSpec; + } + } + } + + return actionSpecs; + } + + private static bool DoesTopicReferToExecutor(string? topic) + { + return topic != null && topic.Contains(MqttTopicTokens.CommandExecutorId); + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionSpec.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionSpec.cs new file mode 100644 index 0000000000..a1b1ab3c9c --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionSpec.cs @@ -0,0 +1,62 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Collections.Generic; + using Azure.Iot.Operations.CodeGeneration; + + public record ActionSpec( + CodeName Name, + CodeName Invoker, + CodeName Executor, + ITypeName? RequestSchema, + ITypeName? ResponseSchema, + EmptyTypeName SerializerEmptyType, + List NormalResultNames, + List NormalRequiredNames, + CodeName? NormalResultSchema, + CodeName? ErrorResultName, + CodeName? ErrorResultSchema, + CodeName? ErrorCodeName, + CodeName? ErrorCodeSchema, + CodeName? ErrorInfoName, + CodeName? ErrorInfoSchema, + bool DoesTargetExecutor, + bool ResponseNullable) + { + public ActionSpec( + SchemaNamer schemaNamer, + string actionName, + string? inputSchemaType, + string? outputSchemaType, + SerializationFormat format, + List normalResultNames, + List normalRequiredNames, + string? normalResultSchema, + string? errorResultName, + string? errorResultSchema, + string? headerCodeName, + string? headerCodeSchema, + string? headerInfoName, + string? headerInfoSchema, + bool doesTargetExecutor) + : this( + new CodeName(actionName), + new CodeName(schemaNamer.GetActionInvokerBinder(actionName)), + new CodeName(schemaNamer.GetActionExecutorBinder(actionName)), + inputSchemaType != null ? new CodeName(inputSchemaType) : null, + outputSchemaType != null ? new CodeName(outputSchemaType) : null, + format.GetEmptyTypeName(), + normalResultNames.ConvertAll(name => new CodeName(name)), + normalRequiredNames.ConvertAll(name => new CodeName(name)), + normalResultSchema != null ? new CodeName(normalResultSchema) : null, + errorResultName != null ? new CodeName(errorResultName) : null, + errorResultSchema != null ? new CodeName(errorResultSchema) : null, + headerCodeName != null ? new CodeName(headerCodeName) : null, + headerCodeSchema != null ? new CodeName(headerCodeSchema) : null, + headerInfoName != null ? new CodeName(headerInfoName) : null, + headerInfoSchema != null ? new CodeName(headerInfoSchema) : null, + doesTargetExecutor, + ResponseNullable: false) + { + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/AggregateErrorSpec.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/AggregateErrorSpec.cs new file mode 100644 index 0000000000..5f7fd91b45 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/AggregateErrorSpec.cs @@ -0,0 +1,6 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Collections.Generic; + + public record AggregateErrorSpec(string SchemaName, Dictionary InnerErrors); +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/Azure.Iot.Operations.EnvoyGenerator.csproj b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/Azure.Iot.Operations.EnvoyGenerator.csproj new file mode 100644 index 0000000000..28ecc28204 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/Azure.Iot.Operations.EnvoyGenerator.csproj @@ -0,0 +1,310 @@ + + + + 0.10.0 + net9.0 + enable + + + + + + + + + + + + + + TextTemplatingFilePreprocessor + DotNetCommandExecutor.cs + Azure.Iot.Operations.EnvoyGenerator + + + TextTemplatingFilePreprocessor + DotNetCommandInvoker.cs + Azure.Iot.Operations.EnvoyGenerator + + + TextTemplatingFilePreprocessor + DotNetResponseExtension.cs + Azure.Iot.Operations.EnvoyGenerator + + + TextTemplatingFilePreprocessor + DotNetConstants.cs + Azure.Iot.Operations.EnvoyGenerator + + + TextTemplatingFilePreprocessor + DotNetAggregateError.cs + Azure.Iot.Operations.EnvoyGenerator + + + TextTemplatingFilePreprocessor + DotNetError.cs + Azure.Iot.Operations.EnvoyGenerator + + + TextTemplatingFilePreprocessor + DotNetTelemetryReceiver.cs + Azure.Iot.Operations.EnvoyGenerator + + + TextTemplatingFilePreprocessor + DotNetTelemetrySender.cs + Azure.Iot.Operations.EnvoyGenerator + + + TextTemplatingFilePreprocessor + DotNetProject.cs + Azure.Iot.Operations.EnvoyGenerator + + + TextTemplatingFilePreprocessor + DotNetPropertyConsumer.cs + Azure.Iot.Operations.EnvoyGenerator + + + TextTemplatingFilePreprocessor + DotNetPropertyMaintainer.cs + Azure.Iot.Operations.EnvoyGenerator + + + TextTemplatingFilePreprocessor + DotNetService.cs + Azure.Iot.Operations.EnvoyGenerator + + + TextTemplatingFilePreprocessor + RustCommandExecutor.cs + Azure.Iot.Operations.EnvoyGenerator + + + TextTemplatingFilePreprocessor + RustCommandExecutorHeaders.cs + Azure.Iot.Operations.EnvoyGenerator + + + TextTemplatingFilePreprocessor + RustCommandInvoker.cs + Azure.Iot.Operations.EnvoyGenerator + + + TextTemplatingFilePreprocessor + RustCommandInvokerHeaders.cs + Azure.Iot.Operations.EnvoyGenerator + + + TextTemplatingFilePreprocessor + RustConstants.cs + Azure.Iot.Operations.EnvoyGenerator + + + TextTemplatingFilePreprocessor + RustAggregateError.cs + Azure.Iot.Operations.EnvoyGenerator + + + TextTemplatingFilePreprocessor + RustError.cs + Azure.Iot.Operations.EnvoyGenerator + + + TextTemplatingFilePreprocessor + RustTelemetryReceiver.cs + Azure.Iot.Operations.EnvoyGenerator + + + TextTemplatingFilePreprocessor + RustTelemetrySender.cs + Azure.Iot.Operations.EnvoyGenerator + + + TextTemplatingFilePreprocessor + RustCargoToml.cs + Azure.Iot.Operations.EnvoyGenerator + + + TextTemplatingFilePreprocessor + RustLib.cs + Azure.Iot.Operations.EnvoyGenerator + + + TextTemplatingFilePreprocessor + RustPropertyConsumer.cs + Azure.Iot.Operations.EnvoyGenerator + + + TextTemplatingFilePreprocessor + RustPropertyMaintainer.cs + Azure.Iot.Operations.EnvoyGenerator + + + TextTemplatingFilePreprocessor + RustSerialization.cs + Azure.Iot.Operations.EnvoyGenerator + + + TextTemplatingFilePreprocessor + RustIndex.cs + Azure.Iot.Operations.EnvoyGenerator + + + + + + + + + + True + True + DotNetCommandExecutor.tt + + + True + True + DotNetCommandInvoker.tt + + + True + True + DotNetResponseExtension.tt + + + True + True + DotNetConstants.tt + + + True + True + DotNetAggregateError.tt + + + True + True + DotNetError.tt + + + True + True + DotNetTelemetryReceiver.tt + + + True + True + DotNetTelemetrySender.tt + + + True + True + DotNetProject.tt + + + True + True + DotNetPropertyConsumer.tt + + + True + True + DotNetPropertyMaintainer.tt + + + True + True + DotNetService.tt + + + True + True + RustCommandExecutor.tt + + + True + True + RustCommandExecutorHeaders.tt + + + True + True + RustCommandInvoker.tt + + + True + True + RustCommandInvokerHeaders.tt + + + True + True + RustConstants.tt + + + True + True + RustAggregateError.tt + + + True + True + RustError.tt + + + True + True + RustTelemetryReceiver.tt + + + True + True + RustTelemetrySender.tt + + + True + True + RustCargoToml.tt + + + True + True + RustLib.tt + + + True + True + RustPropertyConsumer.tt + + + True + True + RustPropertyMaintainer.tt + + + True + True + RustSerialization.tt + + + True + True + RustIndex.tt + + + + + + LanguageResources\csharp\%(RecursiveDir)%(Filename)%(Extension) + + + LanguageResources\csharp\common\%(RecursiveDir)%(Filename)%(Extension) + + + LanguageResources\rust\%(RecursiveDir)%(Filename)%(Extension) + + + + diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs new file mode 100644 index 0000000000..03dbd6db77 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs @@ -0,0 +1,154 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Collections.Generic; + using System.Linq; + using System.Text.Json; + using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser.Model; + + public static class EnvoyGenerator + { + public static List GenerateEnvoys( + List parsedThings, + List serializationFormats, + TargetLanguage targetLanguage, + string genNamespace, + string projectName, + string? sdkPath, + List typeFileNames, + string srcSubdir, + bool generateClient, + bool generateServer, + bool generateProject, + bool defaultImpl) + { + EnvoyTransformFactory envoyFactory = new(targetLanguage, new CodeName(genNamespace), projectName, srcSubdir, generateClient, generateServer, defaultImpl); + + Dictionary transforms = new(); + Dictionary errorSpecs = new(); + Dictionary aggErrorSpecs = new(); + HashSet typesToSerialize = new(); + Dictionary> schemaConstants = new(); + + foreach (ParsedThing parsedThing in parsedThings) + { + CodeName serviceName = new CodeName(parsedThing.Thing.Title ?? genNamespace); + + List actionSpecs = ActionEnvoyGenerator.GenerateActionEnvoys(parsedThing.Thing, parsedThing.SchemaNamer, serviceName, envoyFactory, transforms, errorSpecs, typesToSerialize); + List eventSpecs = EventEnvoyGenerator.GenerateEventEnvoys(parsedThing.Thing, parsedThing.SchemaNamer, serviceName, envoyFactory, transforms, typesToSerialize); + List propSpecs = PropertyEnvoyGenerator.GeneratePropertyEnvoys(parsedThing.Thing, parsedThing.SchemaNamer, serviceName, envoyFactory, transforms, errorSpecs, aggErrorSpecs, typesToSerialize); + GenerateServiceEnvoys(parsedThing.SchemaNamer, serviceName, actionSpecs, propSpecs, eventSpecs, envoyFactory, transforms); + CollectNamedConstants(parsedThing.Thing, parsedThing.SchemaNamer, schemaConstants); + } + + GenerateConstantEnvoys(schemaConstants, envoyFactory, transforms); + GenerateErrorEnvoys(errorSpecs, envoyFactory, transforms); + GenerateAggregateErrorEnvoys(aggErrorSpecs, envoyFactory, transforms); + GenerateSerializationEnvoys(typesToSerialize, envoyFactory, transforms); + + List generatedEnvoys = new(); + + foreach (KeyValuePair transform in transforms) + { + generatedEnvoys.Add(new GeneratedItem(transform.Value.TransformText(), transform.Key, transform.Value.FolderPath)); + } + + foreach (IEnvoyTemplateTransform project in envoyFactory.GetProjectTransforms(serializationFormats, sdkPath, transforms.Keys.Concat(typeFileNames).ToList(), generateProject)) + { + generatedEnvoys.Add(new GeneratedItem(project.TransformText(), project.FileName, project.FolderPath)); + } + + foreach (IEnvoyTemplateTransform resource in envoyFactory.GetResourceTransforms(serializationFormats)) + { + generatedEnvoys.Add(new GeneratedItem(resource.TransformText(), resource.FileName, resource.FolderPath)); + } + + return generatedEnvoys; + } + + private static void CollectNamedConstants(TDThing tdThing, SchemaNamer schemaNamer, Dictionary> schemaConstants) + { + IEnumerable>? constDefs = tdThing.SchemaDefinitions?.Where(d => d.Value.Const != null); + + if (constDefs?.Any() ?? false) + { + string schemaName = schemaNamer.ConstantsSchema; + if (!schemaConstants.TryGetValue(schemaName, out Dictionary? namedConstants)) + { + namedConstants = new(); + schemaConstants[schemaName] = namedConstants; + } + + foreach (var constDef in constDefs) + { + if (constDef.Value.Type == TDValues.TypeString || constDef.Value.Type == TDValues.TypeNumber || constDef.Value.Type == TDValues.TypeInteger) + { + JsonElement constElt = (JsonElement)constDef.Value.Const!; + object constValue = constDef.Value.Type switch + { + TDValues.TypeString => constElt.GetString()!, + TDValues.TypeNumber => constElt.GetDouble(), + TDValues.TypeInteger => constElt.GetInt32(), + _ => null!, + }; + + string constName = schemaNamer.ChooseTitleOrName(constDef.Value.Title, constDef.Key); + namedConstants[constName] = new TypedConstant(new CodeName(constName), constDef.Value.Type, constValue, constDef.Value.Description); + } + } + } + } + + private static void GenerateServiceEnvoys(SchemaNamer schemaNamer, CodeName serviceName, List actionSpecs, List propSpecs, List eventSpecs, EnvoyTransformFactory envoyFactory, Dictionary transforms) + { + foreach (IEnvoyTemplateTransform transform in envoyFactory.GetServiceTransforms(schemaNamer, serviceName, actionSpecs, propSpecs, eventSpecs)) + { + transforms[transform.FileName] = transform; + } + } + + private static void GenerateConstantEnvoys(Dictionary> schemaConstants, EnvoyTransformFactory envoyFactory, Dictionary transforms) + { + foreach (KeyValuePair> schemaConstant in schemaConstants) + { + foreach (IEnvoyTemplateTransform transform in envoyFactory.GetConstantTransforms(new CodeName(schemaConstant.Key), schemaConstant.Value.Values.OrderBy(c => c.Name.AsGiven).ToList())) + { + transforms[transform.FileName] = transform; + } + } + } + + private static void GenerateErrorEnvoys(Dictionary errorSpecs, EnvoyTransformFactory envoyFactory, Dictionary transforms) + { + foreach (KeyValuePair errorSpec in errorSpecs) + { + foreach (IEnvoyTemplateTransform transform in envoyFactory.GetErrorTransforms(errorSpec.Value)) + { + transforms[transform.FileName] = transform; + } + } + } + + private static void GenerateAggregateErrorEnvoys(Dictionary aggErrorSpecs, EnvoyTransformFactory envoyFactory, Dictionary transforms) + { + foreach (KeyValuePair aggErrorSpec in aggErrorSpecs) + { + foreach (IEnvoyTemplateTransform transform in envoyFactory.GetAggregateErrorTransforms(aggErrorSpec.Value)) + { + transforms[transform.FileName] = transform; + } + } + } + + private static void GenerateSerializationEnvoys(HashSet typesToSerialize, EnvoyTransformFactory envoyFactory, Dictionary transforms) + { + foreach (string typeToSerialize in typesToSerialize) + { + foreach (IEnvoyTemplateTransform transform in envoyFactory.GetSerializationTransforms(typeToSerialize)) + { + transforms[transform.FileName] = transform; + } + } + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyTransformFactory.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyTransformFactory.cs new file mode 100644 index 0000000000..e25019fa94 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyTransformFactory.cs @@ -0,0 +1,544 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System; + using System.Collections.Generic; + using System.IO; + using System.Linq; + using System.Reflection; + using System.Text.RegularExpressions; + using Azure.Iot.Operations.CodeGeneration; + + internal class EnvoyTransformFactory + { + private readonly TargetLanguage targetLanguage; + private readonly CodeName genNamespace; + private readonly string projectName; + private readonly string srcSubdir; + private readonly bool generateClient; + private readonly bool generateServer; + private readonly bool defaultImpl; + + internal EnvoyTransformFactory( + TargetLanguage targetLanguage, + CodeName genNamespace, + string projectName, + string srcSubdir, + bool generateClient, + bool generateServer, + bool defaultImpl) + { + this.targetLanguage = targetLanguage; + this.genNamespace = genNamespace; + this.projectName = projectName; + this.srcSubdir = srcSubdir; + this.generateClient = generateClient; + this.generateServer = generateServer; + this.defaultImpl = defaultImpl; + } + + internal IEnumerable GetConstantTransforms(CodeName schemaName, List constants) + { + switch (targetLanguage) + { + case TargetLanguage.CSharp: + yield return new DotNetConstants(projectName, schemaName, genNamespace, constants); + break; + case TargetLanguage.Rust: + yield return new RustConstants(schemaName, genNamespace, constants, srcSubdir); + break; + default: + throw new NotSupportedException($"Target language {targetLanguage} is not supported."); + } + } + + internal IEnumerable GetActionTransforms( + SchemaNamer schemaNamer, + string modelId, + CodeName serviceName, + string actionName, + string? inputSchemaType, + string? outputSchemaType, + SerializationFormat format, + string? serviceGroupId, + string topicPattern, + bool idempotent, + List normalResultFields, + List normalRequiredFields, + string? normalResultSchema, + string? errorResultName, + string? errorResultSchema, + string? headerCodeName, + string? headerCodeSchema, + string? headerInfoName, + string? headerInfoSchema, + List? codeValues, + bool doesCommandTargetExecutor) + { + string serializerClassName = format.GetSerializerClassName(); + EmptyTypeName serializerEmptyType = format.GetEmptyTypeName(); + + ITypeName? inputSchema = inputSchemaType != null ? new CodeName(inputSchemaType) : null; + ITypeName? outputSchema = outputSchemaType != null ? new CodeName(outputSchemaType) : null; + + List normalFields = normalResultFields.Select(f => new CodeName(f)).ToList(); + List requiredFields = normalRequiredFields.Select(f => new CodeName(f)).ToList(); + CodeName? normalSchema = normalResultSchema != null ? new CodeName(normalResultSchema) : null; + CodeName? errorName = errorResultName != null ? new CodeName(errorResultName) : null; + CodeName? errorSchema = errorResultSchema != null ? new CodeName(errorResultSchema) : null; + + CodeName? codeName = headerCodeName != null ? new CodeName(headerCodeName) : null; + CodeName? codeSchema = headerCodeSchema != null ? new CodeName(headerCodeSchema) : null; + CodeName? infoName = headerInfoName != null ? new CodeName(headerInfoName) : null; + CodeName? infoSchema = headerInfoSchema != null ? new CodeName(headerInfoSchema) : null; + + switch (targetLanguage) + { + case TargetLanguage.CSharp: + if (generateServer) + { + yield return new DotNetCommandExecutor( + actionName, + schemaNamer.GetActionExecutorBinder(actionName), + projectName, + genNamespace, + modelId, + serviceName, + serializerClassName, + serializerEmptyType, + inputSchema, + outputSchema, + serviceGroupId, + topicPattern, + idempotent); + } + + if (generateClient) + { + yield return new DotNetCommandInvoker( + actionName, + schemaNamer.GetActionInvokerBinder(actionName), + projectName, + genNamespace, + modelId, + serviceName, + serializerClassName, + serializerEmptyType, + inputSchema, + outputSchema, + topicPattern); + } + + if (outputSchema != null && codeName != null && codeValues != null) + { + yield return new DotNetResponseExtension( + projectName, + genNamespace, + outputSchema, + codeName, + codeSchema!, + infoName, + infoSchema, + codeValues, + generateClient, + generateServer); + } + + break; + case TargetLanguage.Rust: + if (generateServer) + { + yield return new RustCommandExecutor( + actionName, + schemaNamer.GetActionExecutorBinder(actionName), + genNamespace, + modelId, + serializerEmptyType, + inputSchema, + outputSchema, + normalFields, + requiredFields, + normalSchema, + errorName, + errorSchema, + idempotent, + serviceGroupId, + topicPattern, + srcSubdir); + if (codeName != null && codeValues != null) + { + yield return new RustCommandExecutorHeaders(actionName, schemaNamer.GetActionExecutorBinder(actionName), genNamespace, codeName, codeSchema!, infoName, infoSchema, codeValues, srcSubdir); + } + } + + if (generateClient) + { + yield return new RustCommandInvoker( + actionName, + schemaNamer.GetActionInvokerBinder(actionName), + genNamespace, + modelId, + serializerEmptyType, + inputSchema, + outputSchema, + normalFields, + requiredFields, + normalSchema, + errorName, + errorSchema, + topicPattern, + doesCommandTargetExecutor, + srcSubdir); + if (codeName != null && codeValues != null) + { + yield return new RustCommandInvokerHeaders(actionName, schemaNamer.GetActionInvokerBinder(actionName), genNamespace, codeName, codeSchema!, infoName, infoSchema, codeValues, srcSubdir); + } + } + + break; + default: + throw new NotSupportedException($"Target language {targetLanguage} is not supported."); + } + } + + internal IEnumerable GetPropertyTransforms( + SchemaNamer schemaNamer, + string modelId, + CodeName serviceName, + string propertyName, + string propSchema, + string? readRespSchema, + string? writeReqSchema, + string? writeRespSchema, + string? propValueName, + string? readErrorName, + string? readErrorSchema, + string? writeErrorName, + string? writeErrorSchema, + SerializationFormat readFormat, + SerializationFormat writeFormat, + string readTopicPattern, + string writeTopicPattern, + bool separateProperties, + bool doesPropertyTargetReadMaintainer, + bool doesPropertyTargetWriteMaintainer) + { + string readSerializerClassName = readFormat.GetSerializerClassName(); + EmptyTypeName readSerializerEmptyType = readFormat.GetEmptyTypeName(); + string writeSerializerClassName = writeFormat.GetSerializerClassName(); + EmptyTypeName writeSerializerEmptyType = writeFormat.GetEmptyTypeName(); + + switch (targetLanguage) + { + case TargetLanguage.CSharp: + if (generateServer) + { + yield return new DotNetPropertyMaintainer( + propertyName, + schemaNamer.GetPropMaintainerBinder(propertyName), + schemaNamer.ReadResponderBinder, + schemaNamer.WriteResponderBinder, + schemaNamer.GetPropReadActName(propertyName), + schemaNamer.GetPropWriteActName(propertyName), + projectName, + genNamespace, + modelId, + serviceName, + readSerializerClassName, + readSerializerEmptyType, + writeSerializerClassName, + writeSerializerEmptyType, + readRespSchema, + writeReqSchema, + writeRespSchema, + readTopicPattern, + writeTopicPattern); + } + + if (generateClient) + { + yield return new DotNetPropertyConsumer( + propertyName, + schemaNamer.GetPropConsumerBinder(propertyName), + schemaNamer.ReadRequesterBinder, + schemaNamer.WriteRequesterBinder, + schemaNamer.GetPropReadActName(propertyName), + schemaNamer.GetPropWriteActName(propertyName), + projectName, + genNamespace, + modelId, + serviceName, + readSerializerClassName, + readSerializerEmptyType, + writeSerializerClassName, + writeSerializerEmptyType, + readRespSchema, + writeReqSchema, + writeRespSchema, + readTopicPattern, + writeTopicPattern); + } + + break; + case TargetLanguage.Rust: + if (generateServer) + { + yield return new RustPropertyMaintainer( + propertyName, + new CodeName(propSchema), + schemaNamer.GetPropMaintainerBinder(propertyName), + schemaNamer.GetPropReadActName(propertyName), + schemaNamer.GetPropWriteActName(propertyName), + genNamespace, + modelId, + readSerializerEmptyType, + writeSerializerEmptyType, + readRespSchema, + writeReqSchema, + writeRespSchema, + propValueName, + readErrorName, + readErrorSchema, + writeErrorName, + writeErrorSchema, + readTopicPattern, + writeTopicPattern, + srcSubdir, + separateProperties); + } + + if (generateClient) + { + yield return new RustPropertyConsumer( + propertyName, + new CodeName(propSchema), + schemaNamer.GetPropConsumerBinder(propertyName), + schemaNamer.GetPropReadActName(propertyName), + schemaNamer.GetPropWriteActName(propertyName), + genNamespace, + modelId, + readSerializerEmptyType, + writeSerializerEmptyType, + readRespSchema, + writeReqSchema, + writeRespSchema, + propValueName, + readErrorName, + readErrorSchema, + writeErrorName, + writeErrorSchema, + readTopicPattern, + writeTopicPattern, + srcSubdir, + doesPropertyTargetReadMaintainer, + doesPropertyTargetWriteMaintainer, + separateProperties); + } + + break; + default: + throw new NotSupportedException($"Target language {targetLanguage} is not supported."); + } + } + + internal IEnumerable GetEventTransforms( + SchemaNamer schemaNamer, + string modelId, + CodeName serviceName, + string eventName, + string schemaType, + SerializationFormat format, + string? serviceGroupId, + string topicPattern) + { + string serializerClassName = format.GetSerializerClassName(); + EmptyTypeName serializerEmptyType = format.GetEmptyTypeName(); + + switch (targetLanguage) + { + case TargetLanguage.CSharp: + if (generateServer) + { + yield return new DotNetTelemetrySender(eventName, schemaNamer.GetEventSenderBinder(eventName), projectName, genNamespace, modelId, serviceName, serializerClassName, serializerEmptyType, new CodeName(schemaType), topicPattern); + } + + if (generateClient) + { + yield return new DotNetTelemetryReceiver(eventName, schemaNamer.GetEventReceiverBinder(eventName), projectName, genNamespace, modelId, serviceName, serializerClassName, serializerEmptyType, new CodeName(schemaType), serviceGroupId, topicPattern); + } + + break; + case TargetLanguage.Rust: + if (generateServer) + { + yield return new RustTelemetrySender(eventName, schemaNamer.GetEventSenderBinder(eventName), genNamespace, modelId, new CodeName(schemaType), topicPattern, srcSubdir); + } + + if (generateClient) + { + yield return new RustTelemetryReceiver(eventName, schemaNamer.GetEventReceiverBinder(eventName), genNamespace, modelId, new CodeName(schemaType), serviceGroupId, topicPattern, srcSubdir); + } + + break; + default: + throw new NotSupportedException($"Target language {targetLanguage} is not supported."); + } + } + + internal IEnumerable GetErrorTransforms(ErrorSpec errorSpec) + { + switch (targetLanguage) + { + case TargetLanguage.CSharp: + yield return new DotNetError( + projectName, + new CodeName(errorSpec.SchemaName), + genNamespace, + errorSpec.ErrorCodeName != null ? new CodeName(errorSpec.ErrorCodeName) : null, + errorSpec.ErrorCodeSchema != null ? new CodeName(errorSpec.ErrorCodeSchema): null, + errorSpec.ErrorInfoName != null ? new CodeName(errorSpec.ErrorInfoName) : null, + errorSpec.ErrorInfoSchema != null ? new CodeName(errorSpec.ErrorInfoSchema) : null, + errorSpec.Description, + errorSpec.MessageField != null ? new CodeName(errorSpec.MessageField) : null, + errorSpec.MessageIsRequired); + break; + case TargetLanguage.Rust: + yield return new RustError( + new CodeName(errorSpec.SchemaName), + genNamespace, + errorSpec.Description, + errorSpec.MessageField != null ? new CodeName(errorSpec.MessageField) : null, + errorSpec.MessageIsRequired, + srcSubdir); + break; + default: + throw new NotSupportedException($"Target language {targetLanguage} is not supported."); + } + } + + internal IEnumerable GetAggregateErrorTransforms(AggregateErrorSpec errorSpec) + { + switch (targetLanguage) + { + case TargetLanguage.CSharp: + yield return new DotNetAggregateError( + projectName, + new CodeName(errorSpec.SchemaName), + genNamespace, + errorSpec.InnerErrors.Select(kv => (new CodeName(kv.Key), new CodeName(kv.Value))).ToList()); + break; + case TargetLanguage.Rust: + yield return new RustAggregateError( + new CodeName(errorSpec.SchemaName), + genNamespace, + errorSpec.InnerErrors.Select(kv => (new CodeName(kv.Key), new CodeName(kv.Value))).ToList(), + srcSubdir); + break; + default: + throw new NotSupportedException($"Target language {targetLanguage} is not supported."); + } + } + + internal IEnumerable GetSerializationTransforms(string serializableType) + { + switch (targetLanguage) + { + case TargetLanguage.CSharp: + break; + case TargetLanguage.Rust: + yield return new RustSerialization( + genNamespace, + SerializationFormat.Json, + new CodeName(serializableType), + srcSubdir); + break; + default: + throw new NotSupportedException($"Target language {targetLanguage} is not supported."); + } + } + + internal IEnumerable GetServiceTransforms(SchemaNamer schemaNamer, CodeName serviceName, List actionSpecs, List propSpecs, List eventSpecs) + { + switch (targetLanguage) + { + case TargetLanguage.CSharp: + + yield return new DotNetService( + schemaNamer.ReadRequesterBinder, + schemaNamer.WriteRequesterBinder, + schemaNamer.ReadResponderBinder, + schemaNamer.WriteResponderBinder, + projectName, + genNamespace, + serviceName, + actionSpecs, + propSpecs, + eventSpecs, + generateClient, + generateServer, + defaultImpl); + + break; + case TargetLanguage.Rust: + yield break; + default: + throw new NotSupportedException($"Target language {targetLanguage} is not supported."); + } + } + + internal IEnumerable GetProjectTransforms(List genFormats, string? sdkPath, List envoyFilenames, bool generateProject) + { + switch (targetLanguage) + { + case TargetLanguage.CSharp: + yield return new DotNetProject(projectName, sdkPath); + break; + case TargetLanguage.Rust: + yield return new RustIndex(genNamespace, envoyFilenames, generateClient, generateServer, srcSubdir); + yield return new RustLib(genNamespace, generateProject, srcSubdir); + yield return new RustCargoToml(projectName, genFormats, sdkPath, generateProject, srcSubdir); + break; + default: + throw new NotSupportedException($"Target language {targetLanguage} is not supported."); + } + } + + internal IEnumerable GetResourceTransforms(List genFormats) + { + foreach (SerializationFormat genFormat in genFormats) + { + string serializerSubNamespace = genFormat.GetSerializerSubNamespace(); + + var (folder, ext) = targetLanguage switch + { + TargetLanguage.CSharp => ("csharp", "cs"), + TargetLanguage.Rust => ("rust", "rs"), + _ => throw GetLanguageNotRecognizedException(targetLanguage) + }; + + foreach (string subNamespace in new List { ResourceTransform.LanguageCommonFolder, serializerSubNamespace }) + { + foreach (string resourceName in Assembly.GetExecutingAssembly().GetManifestResourceNames()) + { + Regex rx = new($"^{Assembly.GetExecutingAssembly().GetName().Name}\\.{ResourceTransform.LanguageResourcesFolder}\\.{folder}\\.({subNamespace})(?:\\.(\\w+(?:\\.\\w+)*))?\\.(\\w+)\\.{ext}$", RegexOptions.IgnoreCase); + Match? match = rx.Match(resourceName); + if (match.Success) + { + string subFolder = match.Groups[1].Captures[0].Value; + string resourcePath = match.Groups[2].Captures.Count > 0 ? match.Groups[2].Captures[0].Value : string.Empty; + string resourceFile = match.Groups[3].Captures[0].Value; + + StreamReader resourceReader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)!); + + yield return new ResourceTransform(targetLanguage, projectName, subFolder, resourcePath, resourceFile, ext, resourceReader.ReadToEnd(), srcSubdir); + } + } + } + } + } + + private static Exception GetLanguageNotRecognizedException(TargetLanguage language) + { + return new Exception($"language '{language}' not recognized"); + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ErrorSpec.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ErrorSpec.cs new file mode 100644 index 0000000000..b4a559db23 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ErrorSpec.cs @@ -0,0 +1,4 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + public record ErrorSpec(string SchemaName, string Description, string? MessageField, bool MessageIsRequired, string? ErrorCodeName = null, string? ErrorCodeSchema = null, string? ErrorInfoName = null, string? ErrorInfoSchema = null); +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EventEnvoyGenerator.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EventEnvoyGenerator.cs new file mode 100644 index 0000000000..54f7bcb554 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EventEnvoyGenerator.cs @@ -0,0 +1,45 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Collections.Generic; + using System.Linq; + using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser.Model; + + internal static class EventEnvoyGenerator + { + internal static List GenerateEventEnvoys(TDThing tdThing, SchemaNamer schemaNamer, CodeName serviceName, EnvoyTransformFactory envoyFactory, Dictionary transforms, HashSet typesToSerialize) + { + List eventSpecs = new(); + + foreach (KeyValuePair eventKvp in tdThing.Events ?? new()) + { + FormInfo? subEventForm = FormInfo.CreateFromForm(eventKvp.Value.Forms?.FirstOrDefault(f => f.Op?.Values.Contains(TDValues.OpSubEvent) ?? false), tdThing.SchemaDefinitions); + subEventForm ??= FormInfo.CreateFromForm(eventKvp.Value.Forms?.FirstOrDefault(f => f.Op == null), tdThing.SchemaDefinitions); + + if (subEventForm != null && subEventForm.Format != SerializationFormat.None && subEventForm.TopicPattern != null) + { + string schemaType = schemaNamer.GetEventSchema(eventKvp.Key); + typesToSerialize.Add(schemaType); + eventSpecs.Add(new EventSpec(schemaNamer, eventKvp.Key, schemaType)); + foreach (IEnvoyTemplateTransform transform in envoyFactory.GetEventTransforms(schemaNamer, tdThing.Id!, serviceName, eventKvp.Key, schemaType, subEventForm.Format, subEventForm.ServiceGroupId, subEventForm.TopicPattern)) + { + transforms[transform.FileName] = transform; + } + } + } + + FormInfo? subAllEventsForm = FormInfo.CreateFromForm(tdThing.Forms?.FirstOrDefault(f => f.Op?.Values.Contains(TDValues.OpSubAllEvents) ?? false), tdThing.SchemaDefinitions); + if (subAllEventsForm != null && subAllEventsForm.Format != SerializationFormat.None && subAllEventsForm.TopicPattern != null) + { + typesToSerialize.Add(schemaNamer.AggregateEventSchema); + eventSpecs.Add(new EventSpec(schemaNamer, schemaNamer.AggregateEventName, schemaNamer.AggregateEventSchema)); + foreach (IEnvoyTemplateTransform transform in envoyFactory.GetEventTransforms(schemaNamer, tdThing.Id!, serviceName, schemaNamer.AggregateEventName, schemaNamer.AggregateEventSchema, subAllEventsForm.Format, subAllEventsForm.ServiceGroupId, subAllEventsForm.TopicPattern)) + { + transforms[transform.FileName] = transform; + } + } + + return eventSpecs; + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EventSpec.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EventSpec.cs new file mode 100644 index 0000000000..0d2edaa369 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EventSpec.cs @@ -0,0 +1,16 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + + public record EventSpec(CodeName Name, CodeName Sender, CodeName Receiver, ITypeName Schema) + { + public EventSpec(SchemaNamer schemaNamer, string eventName, string schemaType) + : this( + new CodeName(eventName), + new CodeName(schemaNamer.GetEventSenderBinder(eventName)), + new CodeName(schemaNamer.GetEventReceiverBinder(eventName)), + new CodeName(schemaType)) + { + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/IEnvoyTemplateTransform.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/IEnvoyTemplateTransform.cs new file mode 100644 index 0000000000..2668cc34b1 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/IEnvoyTemplateTransform.cs @@ -0,0 +1,11 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + internal interface IEnvoyTemplateTransform + { + string FileName { get; } + + string FolderPath { get; } + + string TransformText(); + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/MqttTopicTokens.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/MqttTopicTokens.cs new file mode 100644 index 0000000000..c4f41b2330 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/MqttTopicTokens.cs @@ -0,0 +1,58 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + /// + /// Static class that defines string values of the replaceable components used in topic patterns. + /// + public static class MqttTopicTokens + { + /// + /// Token representing the ID of a service; when generated from a DTDL model, this is the ID of the DTDL Interface. + /// + public const string ModelId = "{modelId}"; + + /// + /// Token representing the name of a Command. + /// + public const string CommandName = "{commandName}"; + + /// + /// Token representing the ID of a Command executor, should be used only in Command topic patterns. + /// + public const string CommandExecutorId = "{executorId}"; + + /// + /// Token representing the MQTT Client ID of a Command invoker, should be used only in Command topic patterns. + /// + public const string CommandInvokerId = "{invokerClientId}"; + + /// + /// Token representing the name of a Telemetry. + /// + public const string TelemetryName = "{telemetryName}"; + + /// + /// Token representing the ID of a Telemetry sender, should be used only in Telemetry topic patterns. + /// + public const string TelemetrySenderId = "{senderId}"; + + /// + /// Token representing the name of a Property. + /// + public const string PropertyName = "{propertyName}"; + + /// + /// Token representing the ID of a Property maintainer, should be used only in Property topic patterns. + /// + public const string PropertyMaintainerId = "{maintainerId}"; + + /// + /// Token representing the MQTT Client ID of a Property consumer, should be used only in Property topic patterns. + /// + public const string PropertyConsumerId = "{consumerClientId}"; + + /// + /// Token representing a Property action, 'read' or 'write'. + /// + public const string PropertyAction = "{action}"; + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/PropertyEnvoyGenerator.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/PropertyEnvoyGenerator.cs new file mode 100644 index 0000000000..189de16840 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/PropertyEnvoyGenerator.cs @@ -0,0 +1,232 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Collections.Generic; + using System.Linq; + using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser.Model; + + internal static class PropertyEnvoyGenerator + { + internal static List GeneratePropertyEnvoys(TDThing tdThing, SchemaNamer schemaNamer, CodeName serviceName, EnvoyTransformFactory envoyFactory, Dictionary transforms, Dictionary errorSpecs, Dictionary aggErrorSpecs, HashSet typesToSerialize) + { + List propertySpecs = new(); + Dictionary readInnerErrors = new(); + Dictionary writeInnerErrors = new(); + + foreach (KeyValuePair propKvp in tdThing.Properties ?? new()) + { + FormInfo? readPropForm = FormInfo.CreateFromForm(propKvp.Value.Forms?.FirstOrDefault(f => f.Op?.Values.Contains(TDValues.OpReadProp) ?? false), tdThing.SchemaDefinitions); + FormInfo? writePropForm = FormInfo.CreateFromForm(propKvp.Value.Forms?.FirstOrDefault(f => f.Op?.Values.Contains(TDValues.OpWriteProp) ?? false), tdThing.SchemaDefinitions); + FormInfo? noOpForm = FormInfo.CreateFromForm(propKvp.Value.Forms?.FirstOrDefault(f => f.Op == null), tdThing.SchemaDefinitions); + readPropForm ??= noOpForm; + writePropForm ??= noOpForm; + + string propSchema = schemaNamer.GetPropSchema(propKvp.Key); + string? readRespSchema = null; + string? readErrorSchema = GetAndRecordError(propKvp.Key, readPropForm, schemaNamer, errorSpecs, typesToSerialize, readInnerErrors); + if (readPropForm?.TopicPattern != null && readPropForm.Format != SerializationFormat.None) + { + readRespSchema = readPropForm.ErrorRespSchema != null ? schemaNamer.GetPropReadRespSchema(propKvp.Key) : propSchema; + typesToSerialize.Add(readRespSchema); + typesToSerialize.Add(propSchema); + } + + string? writeReqSchema = null; + string? writeRespSchema = null; + string? writeErrorSchema = null; + if (!propKvp.Value.ReadOnly) + { + if (writePropForm?.TopicPattern != null && writePropForm.Format != SerializationFormat.None) + { + writeReqSchema = propKvp.Value.Placeholder ? schemaNamer.GetWritablePropSchema(propKvp.Key) : propSchema; + typesToSerialize.Add(writeReqSchema); + + if (writePropForm.HasErrorResponse) + { + writeRespSchema = schemaNamer.GetPropWriteRespSchema(propKvp.Key); + typesToSerialize.Add(writeRespSchema); + } + } + + writeErrorSchema = GetAndRecordError(propKvp.Key, writePropForm, schemaNamer, errorSpecs, typesToSerialize, writeInnerErrors); + } + + if (readRespSchema != null || writeReqSchema != null) + { + SerializationFormat readFormat = readPropForm?.Format ?? SerializationFormat.None; + SerializationFormat writeFormat = writePropForm?.Format ?? SerializationFormat.None; + + string? readErrorName = readErrorSchema != null ? schemaNamer.GetPropReadRespErrorField(propKvp.Key, readErrorSchema) : null; + string? writeErrorName = writeErrorSchema != null ? schemaNamer.GetPropWriteRespErrorField(propKvp.Key, writeErrorSchema) : null; + + string readTopicPattern = readPropForm?.TopicPattern ?? string.Empty; + string writeTopicPattern = writePropForm?.TopicPattern ?? string.Empty; + + bool doesReadTargetMaintainer = DoesTopicReferToMaintainer(readTopicPattern); + bool doesWriteTargetMaintainer = DoesTopicReferToMaintainer(writeTopicPattern); + + propertySpecs.Add(new PropertySpec( + schemaNamer, + propKvp.Key, + propSchema, + readFormat, + writeFormat, + readRespSchema, + writeReqSchema, + writeRespSchema, + propKvp.Key, + readErrorName, + readErrorSchema, + writeErrorName, + writeErrorSchema, + doesReadTargetMaintainer, + doesWriteTargetMaintainer, + isAggregate: false)); + + foreach (IEnvoyTemplateTransform transform in envoyFactory.GetPropertyTransforms( + schemaNamer, + tdThing.Id!, + serviceName, + propKvp.Key, + propSchema, + readRespSchema, + writeReqSchema, + writeRespSchema, + propKvp.Key, + readErrorName, + readErrorSchema, + writeErrorName, + writeErrorSchema, + readFormat, + writeFormat, + readPropForm?.TopicPattern ?? string.Empty, + writePropForm?.TopicPattern ?? string.Empty, + separateProperties: true, + doesReadTargetMaintainer, + doesWriteTargetMaintainer)) + { + transforms[transform.FileName] = transform; + } + } + } + + string? readAllRespSchema = null; + FormInfo? readAllPropsForm = FormInfo.CreateFromForm(tdThing.Forms?.FirstOrDefault(f => f.Op?.Values.Contains(TDValues.OpReadAllProps) ?? false), tdThing.SchemaDefinitions); + if (readAllPropsForm?.TopicPattern != null && readAllPropsForm.Format != SerializationFormat.None) + { + readAllRespSchema = readAllPropsForm.HasErrorResponse ? schemaNamer.AggregatePropReadRespSchema : schemaNamer.AggregatePropSchema; + + typesToSerialize.Add(readAllRespSchema); + + if (readAllPropsForm.HasErrorResponse) + { + typesToSerialize.Add(schemaNamer.AggregatePropSchema); + typesToSerialize.Add(schemaNamer.AggregatePropReadErrSchema); + aggErrorSpecs[schemaNamer.AggregatePropReadErrSchema] = new AggregateErrorSpec(schemaNamer.AggregatePropReadErrSchema, readInnerErrors); + } + } + + string? writeMultiReqSchema = null; + string? writeMultiRespSchema = null; + FormInfo? writeMultPropsForm = FormInfo.CreateFromForm(tdThing.Forms?.FirstOrDefault(f => f.Op?.Values.Contains(TDValues.OpWriteMultProps) ?? false), tdThing.SchemaDefinitions); + if (writeMultPropsForm?.TopicPattern != null && writeMultPropsForm.Format != SerializationFormat.None) + { + writeMultiReqSchema = schemaNamer.AggregatePropWriteSchema; + typesToSerialize.Add(writeMultiReqSchema); + + if (writeMultPropsForm.HasErrorResponse) + { + writeMultiRespSchema = schemaNamer.AggregatePropWriteRespSchema; + typesToSerialize.Add(writeMultiRespSchema); + typesToSerialize.Add(schemaNamer.AggregatePropWriteErrSchema); + aggErrorSpecs[schemaNamer.AggregatePropWriteErrSchema] = new AggregateErrorSpec(schemaNamer.AggregatePropWriteErrSchema, writeInnerErrors); + } + } + + if (readAllRespSchema != null || writeMultiReqSchema != null) + { + SerializationFormat readFormat = readAllPropsForm?.Format ?? SerializationFormat.None; + SerializationFormat writeFormat = writeMultPropsForm?.Format ?? SerializationFormat.None; + + string? readErrorName = readAllPropsForm?.HasErrorResponse ?? false ? schemaNamer.AggregateRespErrorField : null; + string? readErrorSchema = readAllPropsForm?.HasErrorResponse ?? false ? schemaNamer.AggregatePropReadErrSchema : null; + string? writeErrorName = writeMultPropsForm?.HasErrorResponse ?? false ? schemaNamer.AggregateRespErrorField : null; + string? writeErrorSchema = writeMultPropsForm?.HasErrorResponse ?? false ? schemaNamer.AggregatePropWriteErrSchema : null; + + string readTopicPattern = readAllPropsForm?.TopicPattern ?? string.Empty; + string writeTopicPattern = writeMultPropsForm?.TopicPattern ?? string.Empty; + + bool doesReadTargetMaintainer = DoesTopicReferToMaintainer(readTopicPattern); + bool doesWriteTargetMaintainer = DoesTopicReferToMaintainer(writeTopicPattern); + + propertySpecs.Add(new PropertySpec( + schemaNamer, + schemaNamer.AggregatePropName, + schemaNamer.AggregatePropSchema, + readFormat, + writeFormat, + readAllRespSchema, + writeMultiReqSchema, + writeMultiRespSchema, + schemaNamer.AggregateReadRespValueField, + readErrorName, + readErrorSchema, + writeErrorName, + writeErrorSchema, + doesReadTargetMaintainer, + doesWriteTargetMaintainer, + isAggregate: true)); + + foreach (IEnvoyTemplateTransform transform in envoyFactory.GetPropertyTransforms( + schemaNamer, + tdThing.Id!, + serviceName, + schemaNamer.AggregatePropName, + schemaNamer.AggregatePropSchema, + readAllRespSchema, + writeMultiReqSchema, + writeMultiRespSchema, + schemaNamer.AggregateReadRespValueField, + readErrorName, + readErrorSchema, + writeErrorName, + writeErrorSchema, + readAllPropsForm?.Format ?? SerializationFormat.None, + writeMultPropsForm?.Format ?? SerializationFormat.None, + readAllPropsForm?.TopicPattern ?? string.Empty, + writeMultPropsForm?.TopicPattern ?? string.Empty, + separateProperties: false, + doesReadTargetMaintainer, + doesWriteTargetMaintainer)) + { + transforms[transform.FileName] = transform; + } + } + + return propertySpecs; + } + + private static string? GetAndRecordError(string propName, FormInfo? form, SchemaNamer schemaNamer, Dictionary errorSpecs, HashSet typesToSerialize, Dictionary innerErrors) + { + if (form?.ErrorRespSchema == null) + { + return null; + } + + string errSchemaName = schemaNamer.ChooseTitleOrName(form.ErrorRespSchema.Title, form.ErrorRespName)!; + typesToSerialize.Add(errSchemaName); + errorSpecs[errSchemaName] = new ErrorSpec( + errSchemaName, + form.ErrorRespSchema.Description ?? "The action could not be completed", + form.ErrorRespSchema.ErrorMessage, + form.ErrorRespSchema.Required?.Contains(form.ErrorRespSchema.ErrorMessage ?? string.Empty) ?? false); + innerErrors[propName] = errSchemaName; + return errSchemaName; + } + + private static bool DoesTopicReferToMaintainer(string? topic) + { + return topic != null && topic.Contains(MqttTopicTokens.PropertyMaintainerId); + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/PropertySpec.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/PropertySpec.cs new file mode 100644 index 0000000000..0f3da95930 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/PropertySpec.cs @@ -0,0 +1,62 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + + public record PropertySpec( + CodeName Name, + CodeName Consumer, + CodeName Maintainer, + CodeName PropSchema, + EmptyTypeName ReadSerializerEmptyType, + EmptyTypeName WriteSerializerEmptyType, + ITypeName? ReadRespSchema, + ITypeName? WriteReqSchema, + ITypeName? WriteRespSchema, + CodeName? PropValueName, + CodeName? ReadErrorName, + CodeName? ReadErrorSchema, + CodeName? WriteErrorName, + CodeName? WriteErrorSchema, + bool DoesReadTargetMaintainer, + bool DoesWriteTargetMaintainer, + bool IsAggregate) + { + public PropertySpec( + SchemaNamer schemaNamer, + string propertyName, + string propSchema, + SerializationFormat readFormat, + SerializationFormat writeFormat, + string? readRespSchema, + string? writeReqSchema, + string? writeRespSchema, + string? propValueName, + string? readErrorName, + string? readErrorSchema, + string? writeErrorName, + string? writeErrorSchema, + bool doesReadTargetMaintainer, + bool doesWriteTargetMaintainer, + bool isAggregate) + : this( + new CodeName(propertyName), + new CodeName(schemaNamer.GetPropConsumerBinder(propertyName)), + new CodeName(schemaNamer.GetPropMaintainerBinder(propertyName)), + new CodeName(propSchema), + readFormat.GetEmptyTypeName(), + writeFormat.GetEmptyTypeName(), + readRespSchema != null ? new CodeName(readRespSchema) : null, + writeReqSchema != null ? new CodeName(writeReqSchema) : null, + writeRespSchema != null ? new CodeName(writeRespSchema) : null, + propValueName != null ? new CodeName(propValueName) : null, + readErrorName != null ? new CodeName(readErrorName) : null, + readErrorSchema != null ? new CodeName(readErrorSchema) : null, + writeErrorName != null ? new CodeName(writeErrorName) : null, + writeErrorSchema != null ? new CodeName(writeErrorSchema) : null, + doesReadTargetMaintainer, + doesWriteTargetMaintainer, + isAggregate) + { + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ResourceTransform.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ResourceTransform.cs new file mode 100644 index 0000000000..a19307c66c --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ResourceTransform.cs @@ -0,0 +1,42 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Collections.Generic; + using System.IO; + using System.Reflection; + using System.Text.RegularExpressions; + using Azure.Iot.Operations.CodeGeneration; + + internal class ResourceTransform : IEnvoyTemplateTransform + { + public const string LanguageResourcesFolder = "LanguageResources"; + public const string LanguageCommonFolder = "common"; + + private const string SourceComment = "This file will be copied into the folder for generated code."; + + private readonly string destComment = $"Code generated by Azure.Iot.Operations.ProtocolCompilerLib v{Assembly.GetExecutingAssembly().GetName().Version}; DO NOT EDIT."; + + private readonly string resourceText; + + private static readonly Dictionary namespaceReplacementRegexes = new() + { + { TargetLanguage.CSharp, new Regex(@"Azure\.Iot\.Operations\.Protocol\.UnitTests\.(?:Serializers\.\w+|Support)") }, + { TargetLanguage.Rust, new Regex(@"resources") }, + }; + + public ResourceTransform(TargetLanguage language, string projectName, string subFolder, string serializationPath, string serializationFile, string extension, string serializerCode, string srcSubdir) + { + this.FolderPath = Path.Combine(srcSubdir, serializationPath); + this.FileName = $"{serializationFile}.{extension}"; + this.resourceText = namespaceReplacementRegexes[language].Replace(serializerCode, projectName).Replace(SourceComment, destComment); + } + + public string FileName { get; } + + public string FolderPath { get; } + + public string TransformText() + { + return this.resourceText; + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/TypedConstant.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/TypedConstant.cs new file mode 100644 index 0000000000..a255a6e981 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/TypedConstant.cs @@ -0,0 +1,6 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + + public record TypedConstant(CodeName Name, string Type, object Value, string? Description); +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/code/DotNetCommandExecutor.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/code/DotNetCommandExecutor.cs new file mode 100644 index 0000000000..435881d83e --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/code/DotNetCommandExecutor.cs @@ -0,0 +1,55 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + + public partial class DotNetCommandExecutor : IEnvoyTemplateTransform + { + private readonly CodeName commandName; + private readonly CodeName componentName; + private readonly string projectName; + private readonly CodeName genNamespace; + private readonly string modelId; + private readonly CodeName serviceName; + private readonly string serializerClassName; + private readonly EmptyTypeName serializerEmptyType; + private readonly ITypeName? reqSchema; + private readonly ITypeName? respSchema; + private readonly string? serviceGroupId; + private readonly string topicPattern; + private readonly bool isIdempotent; + + public DotNetCommandExecutor( + string commandName, + string componentName, + string projectName, + CodeName genNamespace, + string modelId, + CodeName serviceName, + string serializerClassName, + EmptyTypeName serializerEmptyType, + ITypeName? reqSchema, + ITypeName? respSchema, + string? serviceGroupId, + string topicPattern, + bool isIdempotent) + { + this.commandName = new CodeName(commandName); + this.componentName = new CodeName(componentName); + this.projectName = projectName; + this.genNamespace = genNamespace; + this.modelId = modelId; + this.serviceName = serviceName; + this.serializerClassName = serializerClassName; + this.serializerEmptyType = serializerEmptyType; + this.reqSchema = reqSchema; + this.respSchema = respSchema; + this.serviceGroupId = serviceGroupId; + this.topicPattern = topicPattern; + this.isIdempotent = isIdempotent; + } + + public string FileName { get => $"{this.componentName.GetFileName(TargetLanguage.CSharp)}.g.cs"; } + + public string FolderPath { get => this.genNamespace.GetFolderName(TargetLanguage.CSharp); } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/code/DotNetCommandInvoker.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/code/DotNetCommandInvoker.cs new file mode 100644 index 0000000000..2bf5d4a7fb --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/code/DotNetCommandInvoker.cs @@ -0,0 +1,49 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + + public partial class DotNetCommandInvoker : IEnvoyTemplateTransform + { + private readonly CodeName commandName; + private readonly CodeName componentName; + private readonly string projectName; + private readonly CodeName genNamespace; + private readonly string modelId; + private readonly CodeName serviceName; + private readonly string serializerClassName; + private readonly EmptyTypeName serializerEmptyType; + private readonly ITypeName? reqSchema; + private readonly ITypeName? respSchema; + private readonly string topicPattern; + + public DotNetCommandInvoker( + string commandName, + string componentName, + string projectName, + CodeName genNamespace, + string modelId, + CodeName serviceName, + string serializerClassName, + EmptyTypeName serializerEmptyType, + ITypeName? reqSchema, + ITypeName? respSchema, + string topicPattern) + { + this.commandName = new CodeName(commandName); + this.componentName = new CodeName(componentName); + this.projectName = projectName; + this.genNamespace = genNamespace; + this.modelId = modelId; + this.serviceName = serviceName; + this.serializerClassName = serializerClassName; + this.serializerEmptyType = serializerEmptyType; + this.reqSchema = reqSchema; + this.respSchema = respSchema; + this.topicPattern = topicPattern; + } + + public string FileName { get => $"{this.componentName.GetFileName(TargetLanguage.CSharp)}.g.cs"; } + + public string FolderPath { get => this.genNamespace.GetFolderName(TargetLanguage.CSharp); } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/code/DotNetResponseExtension.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/code/DotNetResponseExtension.cs new file mode 100644 index 0000000000..66b2af6867 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/code/DotNetResponseExtension.cs @@ -0,0 +1,47 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Collections.Generic; + using Azure.Iot.Operations.CodeGeneration; + + public partial class DotNetResponseExtension : IEnvoyTemplateTransform + { + private readonly string projectName; + private readonly CodeName genNamespace; + private readonly ITypeName respSchema; + private readonly CodeName headerCodeName; + private readonly CodeName headerCodeSchema; + private readonly CodeName? headerInfoName; + private readonly CodeName? headerInfoSchema; + private readonly List headerCodeValues; + private readonly bool generateClient; + private readonly bool generateServer; + + public DotNetResponseExtension( + string projectName, + CodeName genNamespace, + ITypeName respSchema, + CodeName headerCodeName, + CodeName headerCodeSchema, + CodeName? headerInfoName, + CodeName? headerInfoSchema, + List headerCodeValues, + bool generateClient, + bool generateServer) + { + this.projectName = projectName; + this.genNamespace = genNamespace; + this.respSchema = respSchema; + this.headerCodeName = headerCodeName; + this.headerCodeSchema = headerCodeSchema; + this.headerInfoName = headerInfoName; + this.headerInfoSchema = headerInfoSchema; + this.headerCodeValues = headerCodeValues; + this.generateClient = generateClient; + this.generateServer = generateServer; + } + + public string FileName { get => $"{this.respSchema.GetFileName(TargetLanguage.CSharp, "extensions")}.g.cs"; } + + public string FolderPath { get => this.genNamespace.GetFolderName(TargetLanguage.CSharp); } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandExecutor.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandExecutor.tt new file mode 100644 index 0000000000..dc1c0c46f8 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandExecutor.tt @@ -0,0 +1,50 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ + +#nullable enable + +namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage.CSharp)#> +{ + using System; + using System.Collections.Generic; + using System.Linq; + using System.Xml; + using Azure.Iot.Operations.Protocol; + using Azure.Iot.Operations.Protocol.RPC; + using Azure.Iot.Operations.Protocol.Models; + using <#=this.projectName#>; + + public static partial class <#=this.serviceName.GetTypeName(TargetLanguage.CSharp)#> + { + /// + /// Specializes a CommandExecutor class for Command '<#=this.commandName.AsGiven#>'. + /// +<# if (this.isIdempotent) { #> + [CommandBehavior(idempotent: true)] +<# } #> +<# if (this.serviceGroupId != null) { #> + [ServiceGroupId("<#=this.serviceGroupId#>")] +<# } #> + [CommandTopic("<#=this.topicPattern#>")] + public class <#=this.componentName.GetTypeName(TargetLanguage.CSharp)#> : CommandExecutor<#=this.TypeParams()#> + { + /// + /// Initializes a new instance of the class. + /// + public <#=this.componentName.GetTypeName(TargetLanguage.CSharp)#>(ApplicationContext applicationContext, IMqttPubSubClient mqttClient) + : base(applicationContext, mqttClient, "<#=this.commandName.AsGiven#>", new <#=string.Format(this.serializerClassName, this.TypeParams())#>()) + { + TopicTokenMap["modelId"] = "<#=this.modelId#>"; + if (mqttClient.ClientId != null) + { + TopicTokenMap["executorId"] = mqttClient.ClientId; + } + TopicTokenMap["commandName"] = "<#=this.commandName.AsGiven#>"; + } + } + } +} +<#+ + private string TypeParams() => $"<{this.reqSchema?.GetTypeName(TargetLanguage.CSharp) ?? serializerEmptyType.GetTypeName(TargetLanguage.CSharp)}, {this.respSchema?.GetTypeName(TargetLanguage.CSharp) ?? serializerEmptyType.GetTypeName(TargetLanguage.CSharp)}>"; +#> diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandInvoker.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandInvoker.tt new file mode 100644 index 0000000000..11b66dd10d --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandInvoker.tt @@ -0,0 +1,44 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ + +#nullable enable + +namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage.CSharp)#> +{ + using System; + using System.Collections.Generic; + using Azure.Iot.Operations.Protocol; + using Azure.Iot.Operations.Protocol.RPC; + using Azure.Iot.Operations.Protocol.Models; + using <#=this.projectName#>; + + public static partial class <#=this.serviceName.GetTypeName(TargetLanguage.CSharp)#> + { + /// + /// Specializes the CommandInvoker class for Command '<#=this.commandName.AsGiven#>'. + /// + [CommandTopic("<#=this.topicPattern#>")] + public class <#=this.componentName.GetTypeName(TargetLanguage.CSharp)#> : CommandInvoker<#=this.TypeParams()#> + { + /// + /// Initializes a new instance of the class. + /// + public <#=this.componentName.GetTypeName(TargetLanguage.CSharp)#>(ApplicationContext applicationContext, IMqttPubSubClient mqttClient) + : base(applicationContext, mqttClient, "<#=this.commandName.AsGiven#>", new <#=string.Format(this.serializerClassName, this.TypeParams())#>()) + { + this.ResponseTopicPrefix = "clients/{invokerClientId}"; // default value, can be overwritten by user code + + TopicTokenMap["modelId"] = "<#=this.modelId#>"; + if (mqttClient.ClientId != null) + { + TopicTokenMap["invokerClientId"] = mqttClient.ClientId; + } + TopicTokenMap["commandName"] = "<#=this.commandName.AsGiven#>"; + } + } + } +} +<#+ + private string TypeParams() => $"<{this.reqSchema?.GetTypeName(TargetLanguage.CSharp) ?? serializerEmptyType.GetTypeName(TargetLanguage.CSharp)}, {this.respSchema?.GetTypeName(TargetLanguage.CSharp) ?? serializerEmptyType.GetTypeName(TargetLanguage.CSharp)}>"; +#> diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetResponseExtension.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetResponseExtension.tt new file mode 100644 index 0000000000..cf734d4308 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetResponseExtension.tt @@ -0,0 +1,67 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="System.Collections.Generic" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ +<# +string codeName = this.headerCodeName.GetVariableName(TargetLanguage.CSharp); +string codeSchema = this.headerCodeSchema.GetTypeName(TargetLanguage.CSharp); +string infoName = this.headerInfoName?.GetVariableName(TargetLanguage.CSharp) ?? "errorPayload"; +string infoSchema = this.headerInfoSchema?.GetTypeName(TargetLanguage.CSharp) ?? "string"; +#> + +#nullable enable + +namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage.CSharp)#> +{ + using System; + using System.Diagnostics.CodeAnalysis; + using System.Text; + using System.Text.Json; + using Azure.Iot.Operations.Protocol.RPC; + + public static class <#=this.respSchema.GetTypeName(TargetLanguage.CSharp, "extensions")#> + { +<# if (this.generateServer) { #> + public static ExtendedResponse<<#=this.respSchema.GetTypeName(TargetLanguage.CSharp)#>> WithApplicationError(this ExtendedResponse<<#=this.respSchema.GetTypeName(TargetLanguage.CSharp)#>> extResp, <#=codeSchema#> <#=codeName#>, <#=infoSchema#>? <#=infoName#> = null) + { + string errorCode = <#=codeName#> switch + { +<# foreach (string codeValue in this.headerCodeValues) { #> + <#=codeSchema#>.<#=codeValue#> => "<#=codeValue#>", +<# } #> + _ => throw new InvalidOperationException($"Unable to map <#=codeSchema#>.{<#=codeName#>} to a valid string value"), + }; + + return extResp.WithApplicationError(errorCode, <#=this.headerInfoSchema != null ? $"{infoName} != null ? Encoding.UTF8.GetString(JsonSerializer.SerializeToUtf8Bytes({infoName})) : null" : infoName#>); + } +<# } #> +<# if (this.generateClient && this.generateServer) { #> + +<# } #> +<# if (this.generateClient) { #> + public static bool TryGetApplicationError(this ExtendedResponse<<#=this.respSchema.GetTypeName(TargetLanguage.CSharp)#>> extResp, [NotNullWhen(true)] out <#=codeSchema#>? <#=codeName#>, out <#=infoSchema#>? <#=infoName#>) + { + if (!extResp.TryGetApplicationError(out string? errorCode, out <#=this.headerInfoSchema != null ? "string? " : ""#>errorPayload)) + { + <#=codeName#> = null; + <#=infoName#> = null; + return false; + } + + <#=codeName#> = errorCode switch + { +<# foreach (string codeValue in this.headerCodeValues) { #> + "<#=codeValue#>" => <#=codeSchema#>.<#=codeValue#>, +<# } #> + _ => throw new InvalidOperationException($"Unable to map string \"{errorCode}\" to <#=codeSchema#> enumeration value") + }; + +<# if (this.headerInfoSchema != null) { #> + <#=infoName#> = errorPayload != null ? JsonSerializer.Deserialize<<#=infoSchema#>>(Encoding.UTF8.GetBytes(errorPayload)) : null; + +<# } #> + return true; + } +<# } #> + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Constants/code/DotNetConstants.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Constants/code/DotNetConstants.cs new file mode 100644 index 0000000000..97c987a8bc --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Constants/code/DotNetConstants.cs @@ -0,0 +1,39 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Collections.Generic; + using System.Linq; + using Azure.Iot.Operations.CodeGeneration; + + public partial class DotNetConstants : IEnvoyTemplateTransform + { + private readonly string projectName; + private readonly CodeName schemaName; + private readonly CodeName genNamespace; + private readonly List constants; + private readonly bool anyDescriptions; + + public DotNetConstants(string projectName, CodeName schemaName, CodeName genNamespace, List constants) + { + this.projectName = projectName; + this.schemaName = schemaName; + this.genNamespace = genNamespace; + this.constants = constants; + this.anyDescriptions = constants.Any(c => c.Description != null); + } + + public string FileName { get => $"{this.schemaName.GetFileName(TargetLanguage.CSharp)}.g.cs"; } + + public string FolderPath { get => this.genNamespace.GetFolderName(TargetLanguage.CSharp); } + + private static string GetDotNetType(string type) + { + return type switch + { + TDValues.TypeString => "string", + TDValues.TypeNumber => "double", + TDValues.TypeInteger => "int", + _ => throw new System.ArgumentException($"Unsupported constant type: {type}"), + }; + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Constants/t4/DotNetConstants.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Constants/t4/DotNetConstants.tt new file mode 100644 index 0000000000..54034a5f8d --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Constants/t4/DotNetConstants.tt @@ -0,0 +1,22 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ + +#nullable enable + +namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage.CSharp)#> +{ + [System.CodeDom.Compiler.GeneratedCode("Azure.Iot.Operations.ProtocolCompilerLib", "<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>")] + public static class <#=this.schemaName.GetTypeName(TargetLanguage.CSharp)#> + { +<# int ix = 1; foreach (TypedConstant constant in this.constants) { #> +<# if (constant.Description != null) { #> + /// <#=constant.Description#> +<# } #> + public const <#=GetDotNetType(constant.Type)#> <#=constant.Name.GetConstantName(TargetLanguage.CSharp)#> = <#=constant.Type == TDValues.TypeString ? $"\"{constant.Value}\"" : $"{constant.Value}"#>; +<# if (this.anyDescriptions && ix < this.constants.Count) { #> + +<# } #> +<# ix++; } #> + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Error/code/DotNetAggregateError.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Error/code/DotNetAggregateError.cs new file mode 100644 index 0000000000..ce1fa829d1 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Error/code/DotNetAggregateError.cs @@ -0,0 +1,25 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Collections.Generic; + using Azure.Iot.Operations.CodeGeneration; + + public partial class DotNetAggregateError : IEnvoyTemplateTransform + { + private readonly string projectName; + private readonly CodeName schemaName; + private readonly CodeName schemaNamespace; + private readonly List<(CodeName, CodeName)> innerNameSchemas; + + public DotNetAggregateError(string projectName, CodeName schemaName, CodeName schemaNamespace, List<(CodeName, CodeName)> innerNameSchemas) + { + this.projectName = projectName; + this.schemaName = schemaName; + this.schemaNamespace = schemaNamespace; + this.innerNameSchemas = innerNameSchemas; + } + + public string FileName { get => $"{this.schemaName.GetFileName(TargetLanguage.CSharp, "exception")}.g.cs"; } + + public string FolderPath { get => this.schemaNamespace.GetFolderName(TargetLanguage.CSharp); } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Error/code/DotNetError.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Error/code/DotNetError.cs new file mode 100644 index 0000000000..fd9e93d63f --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Error/code/DotNetError.cs @@ -0,0 +1,36 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + + public partial class DotNetError : IEnvoyTemplateTransform + { + private readonly string projectName; + private readonly CodeName schemaName; + private readonly CodeName genNamespace; + private readonly CodeName? errorCodeName; + private readonly CodeName? errorCodeSchema; + private readonly CodeName? errorInfoName; + private readonly CodeName? errorInfoSchema; + private readonly string description; + private readonly CodeName? messageField; + private readonly bool messageIsRequired; + + public DotNetError(string projectName, CodeName schemaName, CodeName genNamespace, CodeName? errorCodeName, CodeName? errorCodeSchema, CodeName? errorInfoName, CodeName? errorInfoSchema, string description, CodeName? messageField, bool messageIsRequired) + { + this.projectName = projectName; + this.schemaName = schemaName; + this.genNamespace = genNamespace; + this.errorCodeName = errorCodeName; + this.errorCodeSchema = errorCodeSchema; + this.errorInfoName = errorInfoName; + this.errorInfoSchema = errorInfoSchema; + this.description = description; + this.messageField = messageField; + this.messageIsRequired = messageIsRequired; + } + + public string FileName { get => $"{this.schemaName.GetFileName(TargetLanguage.CSharp, "exception")}.g.cs"; } + + public string FolderPath { get => this.genNamespace.GetFolderName(TargetLanguage.CSharp); } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Error/t4/DotNetAggregateError.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Error/t4/DotNetAggregateError.tt new file mode 100644 index 0000000000..2b3ba255f7 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Error/t4/DotNetAggregateError.tt @@ -0,0 +1,38 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ + +#nullable enable + +namespace <#=this.projectName#>.<#=this.schemaNamespace.GetTypeName(TargetLanguage.CSharp)#> +{ + using System; + using System.Collections.Generic; + using <#=this.projectName#>; + + [System.CodeDom.Compiler.GeneratedCode("Azure.Iot.Operations.ProtocolCompilerLib", "<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>")] + public partial class <#=this.schemaName.GetTypeName(TargetLanguage.CSharp, "exception")#> : AggregateException + { + public <#=this.schemaName.GetTypeName(TargetLanguage.CSharp, "exception")#>(<#=this.schemaName.GetTypeName(TargetLanguage.CSharp)#> <#=this.schemaName.GetVariableName(TargetLanguage.CSharp)#>) + : base(GetInnerExceptions(<#=this.schemaName.GetVariableName(TargetLanguage.CSharp)#>)) + { + <#=this.schemaName.GetFieldName(TargetLanguage.CSharp)#> = <#=this.schemaName.GetVariableName(TargetLanguage.CSharp)#>; + } + + public <#=this.schemaName.GetTypeName(TargetLanguage.CSharp)#> <#=this.schemaName.GetFieldName(TargetLanguage.CSharp)#> { get; } + + private static IEnumerable GetInnerExceptions(<#=this.schemaName.GetTypeName(TargetLanguage.CSharp)#> <#=this.schemaName.GetVariableName(TargetLanguage.CSharp)#>) + { + List innerExceptions = new(); +<# foreach (var innerNameSchema in this.innerNameSchemas) { #> + + if (<#=this.schemaName.GetVariableName(TargetLanguage.CSharp)#>.<#=innerNameSchema.Item1.GetFieldName(TargetLanguage.CSharp)#> != null) + { + innerExceptions.Add(new <#=innerNameSchema.Item2.GetTypeName(TargetLanguage.CSharp, "exception")#>(<#=this.schemaName.GetVariableName(TargetLanguage.CSharp)#>.<#=innerNameSchema.Item1.GetFieldName(TargetLanguage.CSharp)#>)); + } +<# } #> + + return innerExceptions; + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Error/t4/DotNetError.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Error/t4/DotNetError.tt new file mode 100644 index 0000000000..518ee08980 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Error/t4/DotNetError.tt @@ -0,0 +1,59 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ +<# +string codeName = this.errorCodeName?.GetVariableName(TargetLanguage.CSharp); +string codeSchema = this.errorCodeSchema?.GetTypeName(TargetLanguage.CSharp); +string infoName = this.errorInfoName?.GetVariableName(TargetLanguage.CSharp) ?? "errorPayload"; +string infoSchema = this.errorInfoSchema?.GetTypeName(TargetLanguage.CSharp) ?? "string"; +#> + +#nullable enable + +namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage.CSharp)#> +{ + using System; +<# if (codeName != null) { #> + using System.Diagnostics.CodeAnalysis; +<# } #> + using <#=this.projectName#>; + + [System.CodeDom.Compiler.GeneratedCode("Azure.Iot.Operations.ProtocolCompilerLib", "<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>")] + public partial class <#=this.schemaName.GetTypeName(TargetLanguage.CSharp, "exception")#> : Exception + { +<# if (codeName != null) { #> + private <#=codeSchema#>? <#=codeName#> = default; + private <#=infoSchema#>? <#=infoName#> = default; + +<# } #> + public <#=this.schemaName.GetTypeName(TargetLanguage.CSharp, "exception")#>(<#=this.schemaName.GetTypeName(TargetLanguage.CSharp)#> <#=this.schemaName.GetVariableName(TargetLanguage.CSharp)#>) +<# if (this.messageField != null) { #> + : base(<#=this.schemaName.GetVariableName(TargetLanguage.CSharp)#>.<#=this.messageField.GetFieldName(TargetLanguage.CSharp)#><#=this.messageIsRequired ? "" : $" ?? \"{this.description}\""#>) +<# } else { #> + : base("<#=this.description#>") +<# } #> + { + <#=this.schemaName.GetFieldName(TargetLanguage.CSharp)#> = <#=this.schemaName.GetVariableName(TargetLanguage.CSharp)#>; + } + + public <#=this.schemaName.GetTypeName(TargetLanguage.CSharp)#> <#=this.schemaName.GetFieldName(TargetLanguage.CSharp)#> { get; } +<# if (codeName != null) { #> + + public <#=this.schemaName.GetTypeName(TargetLanguage.CSharp, "exception")#> WithApplicationError(<#=codeSchema#> <#=codeName#>, <#=infoSchema#>? <#=infoName#> = null) + { + this.<#=codeName#> = <#=codeName#>; + this.<#=infoName#> = <#=infoName#>; + + return this; + } + + public bool TryGetApplicationError([NotNullWhen(true)] out <#=codeSchema#>? <#=codeName#>, out <#=infoSchema#>? <#=infoName#>) + { + <#=codeName#> = this.<#=codeName#>; + <#=infoName#> = this.<#=infoName#>; + + return <#=codeName#> != null; + } +<# } #> + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/code/DotNetTelemetryReceiver.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/code/DotNetTelemetryReceiver.cs new file mode 100644 index 0000000000..9aa64f53a4 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/code/DotNetTelemetryReceiver.cs @@ -0,0 +1,47 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + + public partial class DotNetTelemetryReceiver : IEnvoyTemplateTransform + { + private readonly CodeName telemetryName; + private readonly CodeName componentName; + private readonly string projectName; + private readonly CodeName genNamespace; + private readonly string modelId; + private readonly CodeName serviceName; + private readonly string serializerClassName; + private readonly ITypeName schemaType; + private readonly string? serviceGroupId; + private readonly string topicPattern; + + public DotNetTelemetryReceiver( + string telemetryName, + string componentName, + string projectName, + CodeName genNamespace, + string modelId, + CodeName serviceName, + string serializerClassName, + EmptyTypeName serializerEmptyType, + ITypeName schemaType, + string? serviceGroupId, + string topicPattern) + { + this.telemetryName = new CodeName(telemetryName); + this.componentName = new CodeName(componentName); + this.projectName = projectName; + this.genNamespace = genNamespace; + this.modelId = modelId; + this.serviceName = serviceName; + this.serializerClassName = string.Format(serializerClassName, $"<{schemaType.GetTypeName(TargetLanguage.CSharp)}, {serializerEmptyType.GetTypeName(TargetLanguage.CSharp)}>"); + this.schemaType = schemaType; + this.serviceGroupId = serviceGroupId; + this.topicPattern = topicPattern; + } + + public string FileName { get => $"{this.componentName.GetFileName(TargetLanguage.CSharp)}.g.cs"; } + + public string FolderPath { get => this.genNamespace.GetFolderName(TargetLanguage.CSharp); } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/code/DotNetTelemetrySender.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/code/DotNetTelemetrySender.cs new file mode 100644 index 0000000000..d3e50e2df7 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/code/DotNetTelemetrySender.cs @@ -0,0 +1,44 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + + public partial class DotNetTelemetrySender : IEnvoyTemplateTransform + { + private readonly CodeName telemetryName; + private readonly CodeName componentName; + private readonly string projectName; + private readonly CodeName genNamespace; + private readonly string modelId; + private readonly CodeName serviceName; + private readonly string serializerClassName; + private readonly ITypeName schemaType; + private readonly string topicPattern; + + public DotNetTelemetrySender( + string telemetryName, + string componentName, + string projectName, + CodeName genNamespace, + string modelId, + CodeName serviceName, + string serializerClassName, + EmptyTypeName serializerEmptyType, + ITypeName schemaType, + string topicPattern) + { + this.telemetryName = new CodeName(telemetryName); + this.componentName = new CodeName(componentName); + this.projectName = projectName; + this.genNamespace = genNamespace; + this.modelId = modelId; + this.serviceName = serviceName; + this.serializerClassName = string.Format(serializerClassName, $"<{schemaType.GetTypeName(TargetLanguage.CSharp)}, {serializerEmptyType.GetTypeName(TargetLanguage.CSharp)}>"); + this.schemaType = schemaType; + this.topicPattern = topicPattern; + } + + public string FileName { get => $"{this.componentName.GetFileName(TargetLanguage.CSharp)}.g.cs"; } + + public string FolderPath { get => this.genNamespace.GetFolderName(TargetLanguage.CSharp); } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetryReceiver.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetryReceiver.tt new file mode 100644 index 0000000000..9485812f9f --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetryReceiver.tt @@ -0,0 +1,40 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ + +#nullable enable + +namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage.CSharp)#> +{ + using System; + using System.Collections.Generic; + using Azure.Iot.Operations.Protocol; + using Azure.Iot.Operations.Protocol.Telemetry; + using Azure.Iot.Operations.Protocol.Models; + using <#=this.projectName#>; + + public static partial class <#=this.serviceName.GetTypeName(TargetLanguage.CSharp)#> + { + /// + /// Specializes the TelemetryReceiver class for type <#=this.schemaType.GetTypeName(TargetLanguage.CSharp)#>. + /// +<# if (this.serviceGroupId != null) { #> + [ServiceGroupId("<#=this.serviceGroupId#>")] +<# } #> + [TelemetryTopic("<#=this.topicPattern#>")] + public class <#=this.componentName.GetTypeName(TargetLanguage.CSharp)#> : TelemetryReceiver<<#=this.schemaType.GetTypeName(TargetLanguage.CSharp)#>> + { + /// + /// Initializes a new instance of the class. + /// + public <#=this.componentName.GetTypeName(TargetLanguage.CSharp)#>(ApplicationContext applicationContext, IMqttPubSubClient mqttClient) + : base(applicationContext, mqttClient, new <#=this.serializerClassName#>()) + { + TopicTokenMap["modelId"] = "<#=this.modelId#>"; +<# if (!this.telemetryName.IsEmpty) { #> + TopicTokenMap["telemetryName"] = "<#=this.telemetryName.AsGiven#>"; +<# } #> + } + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetrySender.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetrySender.tt new file mode 100644 index 0000000000..f1ccb61cc1 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetrySender.tt @@ -0,0 +1,40 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ + +#nullable enable + +namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage.CSharp)#> +{ + using System.Collections.Generic; + using Azure.Iot.Operations.Protocol; + using Azure.Iot.Operations.Protocol.Telemetry; + using Azure.Iot.Operations.Protocol.Models; + using <#=this.projectName#>; + + public static partial class <#=this.serviceName.GetTypeName(TargetLanguage.CSharp)#> + { + /// + /// Specializes the TelemetrySender class for type <#=this.schemaType.GetTypeName(TargetLanguage.CSharp)#>. + /// + [TelemetryTopic("<#=this.topicPattern#>")] + public class <#=this.componentName.GetTypeName(TargetLanguage.CSharp)#> : TelemetrySender<<#=this.schemaType.GetTypeName(TargetLanguage.CSharp)#>> + { + /// + /// Initializes a new instance of the class. + /// + public <#=this.componentName.GetTypeName(TargetLanguage.CSharp)#>(ApplicationContext applicationContext, IMqttPubSubClient mqttClient) + : base(applicationContext, mqttClient, new <#=this.serializerClassName#>()) + { + TopicTokenMap["modelId"] = "<#=this.modelId#>"; + if (mqttClient.ClientId != null) + { + TopicTokenMap["senderId"] = mqttClient.ClientId; + } +<# if (!this.telemetryName.IsEmpty) { #> + TopicTokenMap["telemetryName"] = "<#=this.telemetryName.AsGiven#>"; +<# } #> + } + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Project/code/DotNetProject.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Project/code/DotNetProject.cs new file mode 100644 index 0000000000..223189d4ec --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Project/code/DotNetProject.cs @@ -0,0 +1,36 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System; + using System.Reflection; + using System.Runtime.Versioning; + using System.Text.RegularExpressions; + + public partial class DotNetProject : IEnvoyTemplateTransform + { + internal const string SdkPackageName = "Azure.Iot.Operations.Protocol"; + internal const string SdkProjectName = $"{SdkPackageName}.csproj"; + + private static readonly Regex MajorMinorRegex = new("^(\\d+\\.\\d+).", RegexOptions.Compiled); + + private readonly string projectName; + private readonly string? sdkProjPath; + private readonly string? sdkVersion; + private readonly string? targetFramework; + + public DotNetProject(string projectName, string? sdkPath) + { + this.projectName = projectName; + this.sdkProjPath = sdkPath != null ? $"{sdkPath.Replace('/', '\\')}\\{SdkProjectName}" : null; + + Match? majorMinorMatch = MajorMinorRegex.Match(Assembly.GetExecutingAssembly().GetName().Version!.ToString()); + sdkVersion = majorMinorMatch.Success ? $"{majorMinorMatch.Groups[1].Captures[0].Value}.*-*" : null; + + Version frameworkVersion = new FrameworkName(Assembly.GetExecutingAssembly().GetCustomAttribute()?.FrameworkName!).Version; + this.targetFramework = $"net{frameworkVersion}"; + } + + public string FileName { get => $"{this.projectName}.csproj"; } + + public string FolderPath { get => string.Empty; } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Project/t4/DotNetProject.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Project/t4/DotNetProject.tt new file mode 100644 index 0000000000..b2ddb5291e --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Project/t4/DotNetProject.tt @@ -0,0 +1,19 @@ +<#@ template language="C#" linePragmas="false" #> + + + + <#=this.targetFramework#> + latest-recommended + enable + SA0001,SA1101,SA1633 + + + +<# if (this.sdkProjPath != null) { #> + +<# } else { #> + /> +<# } #> + + + diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/code/DotNetPropertyConsumer.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/code/DotNetPropertyConsumer.cs new file mode 100644 index 0000000000..55a080ad0c --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/code/DotNetPropertyConsumer.cs @@ -0,0 +1,73 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + + public partial class DotNetPropertyConsumer : IEnvoyTemplateTransform + { + private readonly CodeName propertyName; + private readonly CodeName componentName; + private readonly CodeName readerName; + private readonly CodeName writerName; + private readonly string readCommandName; + private readonly string writeCommandName; + private readonly string projectName; + private readonly CodeName genNamespace; + private readonly string modelId; + private readonly CodeName serviceName; + private readonly string readSerializerClassName; + private readonly EmptyTypeName readSerializerEmptyType; + private readonly string writeSerializerClassName; + private readonly EmptyTypeName writeSerializerEmptyType; + private readonly CodeName? readRespSchema; + private readonly CodeName? writeReqSchema; + private readonly CodeName? writeRespSchema; + private readonly string readTopicPattern; + private readonly string writeTopicPattern; + + public DotNetPropertyConsumer( + string propertyName, + string componentName, + string readerName, + string writerName, + string readCommandName, + string writeCommandName, + string projectName, + CodeName genNamespace, + string modelId, + CodeName serviceName, + string readSerializerClassName, + EmptyTypeName readSerializerEmptyType, + string writeSerializerClassName, + EmptyTypeName writeSerializerEmptyType, + string? readRespSchema, + string? writeReqSchema, + string? writeRespSchema, + string readTopicPattern, + string writeTopicPattern) + { + this.propertyName = new CodeName(propertyName); + this.componentName = new CodeName(componentName); + this.readerName = new CodeName(readerName); + this.writerName = new CodeName(writerName); + this.readCommandName = readCommandName; + this.writeCommandName = writeCommandName; + this.projectName = projectName; + this.genNamespace = genNamespace; + this.modelId = modelId; + this.serviceName = serviceName; + this.readSerializerClassName = readSerializerClassName; + this.readSerializerEmptyType = readSerializerEmptyType; + this.writeSerializerClassName = writeSerializerClassName; + this.writeSerializerEmptyType = writeSerializerEmptyType; + this.readRespSchema = readRespSchema != null ? new CodeName(readRespSchema) : null; + this.writeReqSchema = writeReqSchema != null ? new CodeName(writeReqSchema) : null; + this.writeRespSchema = writeRespSchema != null ? new CodeName(writeRespSchema) : null; + this.readTopicPattern = readTopicPattern; + this.writeTopicPattern = writeTopicPattern; + } + + public string FileName { get => $"{this.componentName.GetFileName(TargetLanguage.CSharp)}.g.cs"; } + + public string FolderPath { get => this.genNamespace.GetFolderName(TargetLanguage.CSharp); } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/code/DotNetPropertyMaintainer.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/code/DotNetPropertyMaintainer.cs new file mode 100644 index 0000000000..0326891538 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/code/DotNetPropertyMaintainer.cs @@ -0,0 +1,73 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + + public partial class DotNetPropertyMaintainer : IEnvoyTemplateTransform + { + private readonly CodeName propertyName; + private readonly CodeName componentName; + private readonly CodeName readerName; + private readonly CodeName writerName; + private readonly string readCommandName; + private readonly string writeCommandName; + private readonly string projectName; + private readonly CodeName genNamespace; + private readonly string modelId; + private readonly CodeName serviceName; + private readonly string readSerializerClassName; + private readonly EmptyTypeName readSerializerEmptyType; + private readonly string writeSerializerClassName; + private readonly EmptyTypeName writeSerializerEmptyType; + private readonly CodeName? readRespSchema; + private readonly CodeName? writeReqSchema; + private readonly CodeName? writeRespSchema; + private readonly string readTopicPattern; + private readonly string writeTopicPattern; + + public DotNetPropertyMaintainer( + string propertyName, + string componentName, + string readerName, + string writerName, + string readCommandName, + string writeCommandName, + string projectName, + CodeName genNamespace, + string modelId, + CodeName serviceName, + string readSerializerClassName, + EmptyTypeName readSerializerEmptyType, + string writeSerializerClassName, + EmptyTypeName writeSerializerEmptyType, + string? readRespSchema, + string? writeReqSchema, + string? writeRespSchema, + string readTopicPattern, + string writeTopicPattern) + { + this.propertyName = new CodeName(propertyName); + this.componentName = new CodeName(componentName); + this.readerName = new CodeName(readerName); + this.writerName = new CodeName(writerName); + this.readCommandName = readCommandName; + this.writeCommandName = writeCommandName; + this.projectName = projectName; + this.genNamespace = genNamespace; + this.modelId = modelId; + this.serviceName = serviceName; + this.readSerializerClassName = readSerializerClassName; + this.readSerializerEmptyType = readSerializerEmptyType; + this.writeSerializerClassName = writeSerializerClassName; + this.writeSerializerEmptyType = writeSerializerEmptyType; + this.readRespSchema = readRespSchema != null ? new CodeName(readRespSchema) : null; + this.writeReqSchema = writeReqSchema != null ? new CodeName(writeReqSchema) : null; + this.writeRespSchema = writeRespSchema != null ? new CodeName(writeRespSchema) : null; + this.readTopicPattern = readTopicPattern; + this.writeTopicPattern = writeTopicPattern; + } + + public string FileName { get => $"{this.componentName.GetFileName(TargetLanguage.CSharp)}.g.cs"; } + + public string FolderPath { get => this.genNamespace.GetFolderName(TargetLanguage.CSharp); } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyConsumer.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyConsumer.tt new file mode 100644 index 0000000000..8f4741a322 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyConsumer.tt @@ -0,0 +1,101 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ + +#nullable enable + +namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage.CSharp)#> +{ + using System; + using System.Collections.Generic; + using System.Linq; + using System.Xml; + using Azure.Iot.Operations.Protocol; + using Azure.Iot.Operations.Protocol.RPC; + using Azure.Iot.Operations.Protocol.Models; + using <#=this.projectName#>; + + public static partial class <#=this.serviceName.GetTypeName(TargetLanguage.CSharp)#> + { + /// +<# if (!this.propertyName.IsEmpty) { #> + /// Specializes CommandInvoker classes for reading<#=this.writeReqSchema != null ? " and writing" : ""#> Property '<#=this.propertyName.AsGiven#>'. +<# } else { #> + /// Specializes CommandInvoker classes for reading<#=this.writeReqSchema != null ? " and writing" : ""#> a Property collection. +<# } #> + /// + public static class <#=this.componentName.GetTypeName(TargetLanguage.CSharp)#> + { +<# if (this.readRespSchema != null) { #> + /// +<# if (!this.propertyName.IsEmpty) { #> + /// Specializes a CommandInvoker class for requesting to read Property '<#=this.propertyName.AsGiven#>'. +<# } else { #> + /// Specializes a CommandInvoker class for requesting to read a Property collection. +<# } #> + /// + [PropertyTopic("<#=this.readTopicPattern#>")] + public class <#=this.readerName.GetTypeName(TargetLanguage.CSharp)#> : CommandInvoker<#=this.ReadTypeParams()#> + { + /// + /// Initializes a new instance of the class. + /// + public <#=this.readerName.GetTypeName(TargetLanguage.CSharp)#>(ApplicationContext applicationContext, IMqttPubSubClient mqttClient) + : base(applicationContext, mqttClient, "<#=this.readCommandName#>", new <#=string.Format(this.readSerializerClassName, this.ReadTypeParams())#>()) + { + RequestTopicPattern = AttributeRetriever.GetAttribute(this)?.Topic ?? string.Empty; + + TopicTokenMap["action"] = "read"; + TopicTokenMap["modelId"] = "<#=this.modelId#>"; + if (mqttClient.ClientId != null) + { + TopicTokenMap["consumerClientId"] = mqttClient.ClientId; + } +<# if (!this.propertyName.IsEmpty) { #> + TopicTokenMap["propertyName"] = "<#=this.propertyName.AsGiven#>"; +<# } #> + } + } +<# } #> +<# if (this.readRespSchema != null && this.writeReqSchema != null) { #> + +<# } #> +<# if (this.writeReqSchema != null) { #> + /// +<# if (!this.propertyName.IsEmpty) { #> + /// Specializes a CommandInvoker class for requesting to write Property '<#=this.propertyName.AsGiven#>'. +<# } else { #> + /// Specializes a CommandInvoker class for requesting to write a Property collection. +<# } #> + /// + [PropertyTopic("<#=this.writeTopicPattern#>")] + public class <#=this.writerName.GetTypeName(TargetLanguage.CSharp)#> : CommandInvoker<#=this.WriteTypeParams()#> + { + /// + /// Initializes a new instance of the class. + /// + public <#=this.writerName.GetTypeName(TargetLanguage.CSharp)#>(ApplicationContext applicationContext, IMqttPubSubClient mqttClient) + : base(applicationContext, mqttClient, "<#=this.writeCommandName#>", new <#=string.Format(this.writeSerializerClassName, this.WriteTypeParams())#>()) + { + RequestTopicPattern = AttributeRetriever.GetAttribute(this)?.Topic ?? string.Empty; + + TopicTokenMap["action"] = "write"; + TopicTokenMap["modelId"] = "<#=this.modelId#>"; + if (mqttClient.ClientId != null) + { + TopicTokenMap["consumerClientId"] = mqttClient.ClientId; + } +<# if (!this.propertyName.IsEmpty) { #> + TopicTokenMap["propertyName"] = "<#=this.propertyName.AsGiven#>"; +<# } #> + } + } +<# } #> + } + } +} +<#+ + private string ReadTypeParams() => $"<{readSerializerEmptyType.GetTypeName(TargetLanguage.CSharp)}, {this.readRespSchema.GetTypeName(TargetLanguage.CSharp)}>"; + + private string WriteTypeParams() => $"<{this.writeReqSchema!.GetTypeName(TargetLanguage.CSharp)}, {this.writeRespSchema?.GetTypeName(TargetLanguage.CSharp) ?? writeSerializerEmptyType.GetTypeName(TargetLanguage.CSharp)}>"; +#> diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyMaintainer.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyMaintainer.tt new file mode 100644 index 0000000000..e9327156f9 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyMaintainer.tt @@ -0,0 +1,104 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ + +#nullable enable + +namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage.CSharp)#> +{ + using System; + using System.Collections.Generic; + using System.Linq; + using System.Xml; + using Azure.Iot.Operations.Protocol; + using Azure.Iot.Operations.Protocol.RPC; + using Azure.Iot.Operations.Protocol.Models; + using <#=this.projectName#>; + + public static partial class <#=this.serviceName.GetTypeName(TargetLanguage.CSharp)#> + { + /// +<# if (!this.propertyName.IsEmpty) { #> + /// Specializes CommandExecutor classes for reading<#=this.writeReqSchema != null ? " and writing" : ""#> Property '<#=this.propertyName.AsGiven#>'. +<# } else { #> + /// Specializes CommandExecutor classes for reading<#=this.writeReqSchema != null ? " and writing" : ""#> a Property collection. +<# } #> + /// + public static class <#=this.componentName.GetTypeName(TargetLanguage.CSharp)#> + { +<# if (this.readRespSchema != null) { #> + /// +<# if (!this.propertyName.IsEmpty) { #> + /// Specializes a CommandExecutor class for responding to read requests for Property '<#=this.propertyName.AsGiven#>'. +<# } else { #> + /// Specializes a CommandExecutor class for responding to read requests for Property collection. +<# } #> + /// + [CommandBehavior(idempotent: true)] + [PropertyTopic("<#=this.readTopicPattern#>")] + public class <#=this.readerName.GetTypeName(TargetLanguage.CSharp)#> : CommandExecutor<#=this.ReadTypeParams()#> + { + /// + /// Initializes a new instance of the class. + /// + public <#=this.readerName.GetTypeName(TargetLanguage.CSharp)#>(ApplicationContext applicationContext, IMqttPubSubClient mqttClient) + : base(applicationContext, mqttClient, "<#=this.readCommandName#>", new <#=string.Format(this.readSerializerClassName, this.ReadTypeParams())#>()) + { + ServiceGroupId = string.Empty; + RequestTopicPattern = AttributeRetriever.GetAttribute(this)?.Topic ?? string.Empty; + + TopicTokenMap["action"] = "read"; + TopicTokenMap["modelId"] = "<#=this.modelId#>"; + if (mqttClient.ClientId != null) + { + TopicTokenMap["maintainerId"] = mqttClient.ClientId; + } +<# if (!this.propertyName.IsEmpty) { #> + TopicTokenMap["propertyName"] = "<#=this.propertyName.AsGiven#>"; +<# } #> + } + } +<# } #> +<# if (this.readRespSchema != null && this.writeReqSchema != null) { #> + +<# } #> +<# if (this.writeReqSchema != null) { #> + /// +<# if (!this.propertyName.IsEmpty) { #> + /// Specializes a CommandExecutor class for responding to write requests for Property '<#=this.propertyName.AsGiven#>'. +<# } else { #> + /// Specializes a CommandExecutor class for responding to write requests for Property collection. +<# } #> + /// + [CommandBehavior(idempotent: false)] + [PropertyTopic("<#=this.writeTopicPattern#>")] + public class <#=this.writerName.GetTypeName(TargetLanguage.CSharp)#> : CommandExecutor<#=this.WriteTypeParams()#> + { + /// + /// Initializes a new instance of the class. + /// + public <#=this.writerName.GetTypeName(TargetLanguage.CSharp)#>(ApplicationContext applicationContext, IMqttPubSubClient mqttClient) + : base(applicationContext, mqttClient, "<#=this.writeCommandName#>", new <#=string.Format(this.writeSerializerClassName, this.WriteTypeParams())#>()) + { + RequestTopicPattern = AttributeRetriever.GetAttribute(this)?.Topic ?? string.Empty; + + TopicTokenMap["action"] = "write"; + TopicTokenMap["modelId"] = "<#=this.modelId#>"; + if (mqttClient.ClientId != null) + { + TopicTokenMap["maintainerId"] = mqttClient.ClientId; + } +<# if (!this.propertyName.IsEmpty) { #> + TopicTokenMap["propertyName"] = "<#=this.propertyName.AsGiven#>"; +<# } #> + } + } +<# } #> + } + } +} +<#+ + private string ReadTypeParams() => $"<{readSerializerEmptyType.GetTypeName(TargetLanguage.CSharp)}, {this.readRespSchema.GetTypeName(TargetLanguage.CSharp)}>"; + + private string WriteTypeParams() => $"<{this.writeReqSchema!.GetTypeName(TargetLanguage.CSharp)}, {this.writeRespSchema?.GetTypeName(TargetLanguage.CSharp) ?? writeSerializerEmptyType.GetTypeName(TargetLanguage.CSharp)}>"; +#> diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Service/code/DotNetService.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Service/code/DotNetService.cs new file mode 100644 index 0000000000..9feaa3b328 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Service/code/DotNetService.cs @@ -0,0 +1,56 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Collections.Generic; + using Azure.Iot.Operations.CodeGeneration; + + public partial class DotNetService : IEnvoyTemplateTransform + { + private readonly CodeName readRequesterName; + private readonly CodeName writeRequesterName; + private readonly CodeName readResponderName; + private readonly CodeName writeResponderName; + private readonly string projectName; + private readonly CodeName genNamespace; + private readonly CodeName serviceName; + private readonly List actionSpecs; + private readonly List propSpecs; + private readonly List eventSpec; + private readonly bool generateClient; + private readonly bool generateServer; + private readonly bool defaultImpl; + + public DotNetService( + string readRequesterName, + string writeRequesterName, + string readResponderName, + string writeResponderName, + string projectName, + CodeName genNamespace, + CodeName serviceName, + List actionSpecs, + List propSpecs, + List eventSpec, + bool generateClient, + bool generateServer, + bool defaultImpl) + { + this.readRequesterName = new CodeName(readRequesterName); + this.writeRequesterName = new CodeName(writeRequesterName); + this.readResponderName = new CodeName(readResponderName); + this.writeResponderName = new CodeName(writeResponderName); + this.projectName = projectName; + this.genNamespace = genNamespace; + this.serviceName = serviceName; + this.actionSpecs = actionSpecs; + this.propSpecs = propSpecs; + this.eventSpec = eventSpec; + this.generateClient = generateClient; + this.generateServer = generateServer; + this.defaultImpl = defaultImpl; + } + + public string FileName { get => $"{this.serviceName.GetFileName(TargetLanguage.CSharp)}.g.cs"; } + + public string FolderPath { get => this.genNamespace.GetFolderName(TargetLanguage.CSharp); } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Service/t4/DotNetService.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Service/t4/DotNetService.tt new file mode 100644 index 0000000000..9d45303f12 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Service/t4/DotNetService.tt @@ -0,0 +1,732 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="System.Linq" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ + +#nullable enable + +namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage.CSharp)#> +{ + using System; + using System.Collections.Generic; + using System.Linq; +<# if (this.actionSpecs.Any() || this.propSpecs.Any() || this.eventSpec.Any()) { #> + using System.Threading; +<# } #> + using System.Threading.Tasks; + using Azure.Iot.Operations.Protocol.Models; + using Azure.Iot.Operations.Protocol; + using Azure.Iot.Operations.Protocol.RPC; + using Azure.Iot.Operations.Protocol.Telemetry; + using <#=this.projectName#>; + + [System.CodeDom.Compiler.GeneratedCode("Azure.Iot.Operations.ProtocolCompilerLib", "<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>")] + public static partial class <#=this.serviceName.GetTypeName(TargetLanguage.CSharp)#> + { +<# if (this.generateServer) { #> + public abstract partial class Service : IAsyncDisposable + { + private ApplicationContext applicationContext; + private IMqttPubSubClient mqttClient; +<# foreach (var actionSpec in this.actionSpecs) { #> + private readonly <#=actionSpec.Executor.GetTypeName(TargetLanguage.CSharp)#> <#=actionSpec.Executor.GetVariableName(TargetLanguage.CSharp)#>; +<# } #> +<# foreach (var propSpec in this.propSpecs) { #> + private readonly <#=propSpec.Maintainer.GetTypeName(TargetLanguage.CSharp)#>.<#=this.readResponderName.GetTypeName(TargetLanguage.CSharp)#> <#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "responder")#>; +<# if (propSpec.WriteReqSchema != null) { #> + private readonly <#=propSpec.Maintainer.GetTypeName(TargetLanguage.CSharp)#>.<#=this.writeResponderName.GetTypeName(TargetLanguage.CSharp)#> <#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "responder")#>; +<# } #> +<# } #> +<# foreach (var telemEnvoyInfo in this.eventSpec) { #> + private readonly <#=telemEnvoyInfo.Sender.GetTypeName(TargetLanguage.CSharp)#> <#=telemEnvoyInfo.Sender.GetVariableName(TargetLanguage.CSharp)#>; +<# } #> + + /// + /// Construct a new instance of this service. + /// + /// The shared context for your application. + /// The MQTT client to use. + /// + /// The topic token replacement map to use for all operations by default. Generally, this will include the token values + /// for topic tokens such as "modelId" which should be the same for the duration of this service's lifetime. Note that + /// additional topic tokens can be specified per-telemetry message. + /// + public Service(ApplicationContext applicationContext, IMqttPubSubClient mqttClient, Dictionary? topicTokenMap = null) + { + this.applicationContext = applicationContext; + this.mqttClient = mqttClient; + + string? clientId = this.mqttClient.ClientId; + if (string.IsNullOrEmpty(clientId)) + { + throw new InvalidOperationException("No MQTT client Id configured. Must connect to MQTT broker before invoking command."); + } + +<# foreach (var actionSpec in this.actionSpecs) { #> + this.<#=actionSpec.Executor.GetVariableName(TargetLanguage.CSharp)#> = new <#=actionSpec.Executor.GetTypeName(TargetLanguage.CSharp)#>(applicationContext, mqttClient) { OnCommandReceived = <#=actionSpec.Name.GetMethodName(TargetLanguage.CSharp, "int")#> }; +<# } #> +<# foreach (var propSpec in this.propSpecs) { #> + this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "responder")#> = new <#=propSpec.Maintainer.GetTypeName(TargetLanguage.CSharp)#>.<#=this.readResponderName.GetTypeName(TargetLanguage.CSharp)#>(applicationContext, mqttClient) { OnCommandReceived = <#=propSpec.Name.GetMethodName(TargetLanguage.CSharp, "int", prefix: "read")#> }; +<# if (propSpec.WriteReqSchema != null) { #> + this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "responder")#> = new <#=propSpec.Maintainer.GetTypeName(TargetLanguage.CSharp)#>.<#=this.writeResponderName.GetTypeName(TargetLanguage.CSharp)#>(applicationContext, mqttClient) { OnCommandReceived = <#=propSpec.Name.GetMethodName(TargetLanguage.CSharp, "int", prefix: "write")#> }; +<# } #> +<# } #> +<# foreach (var telemEnvoyInfo in this.eventSpec) { #> + this.<#=telemEnvoyInfo.Sender.GetVariableName(TargetLanguage.CSharp)#> = new <#=telemEnvoyInfo.Sender.GetTypeName(TargetLanguage.CSharp)#>(applicationContext, mqttClient); +<# } #> + + if (topicTokenMap != null) + { + foreach (string topicTokenKey in topicTokenMap.Keys) + { +<# foreach (var actionSpec in this.actionSpecs) { #> + this.<#=actionSpec.Executor.GetVariableName(TargetLanguage.CSharp)#>.TopicTokenMap.TryAdd("ex:" + topicTokenKey, topicTokenMap[topicTokenKey]); +<# } #> +<# foreach (var propSpec in this.propSpecs) { #> + this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "responder")#>.TopicTokenMap.TryAdd("ex:" + topicTokenKey, topicTokenMap[topicTokenKey]); +<# if (propSpec.WriteReqSchema != null) { #> + this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "responder")#>.TopicTokenMap.TryAdd("ex:" + topicTokenKey, topicTokenMap[topicTokenKey]); +<# } #> +<# } #> +<# foreach (var telemEnvoyInfo in this.eventSpec) { #> + this.<#=telemEnvoyInfo.Sender.GetVariableName(TargetLanguage.CSharp)#>.TopicTokenMap.TryAdd("ex:" + topicTokenKey, topicTokenMap[topicTokenKey]); +<# } #> + } + } + +<# foreach (var actionSpec in this.actionSpecs) { #> + this.<#=actionSpec.Executor.GetVariableName(TargetLanguage.CSharp)#>.TopicTokenMap.TryAdd("executorId", clientId); +<# } #> +<# foreach (var propSpec in this.propSpecs) { #> + this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "responder")#>.TopicTokenMap.TryAdd("maintainerId", clientId); +<# if (propSpec.WriteReqSchema != null) { #> + this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "responder")#>.TopicTokenMap.TryAdd("maintainerId", clientId); +<# } #> +<# } #> + } +<# foreach (var actionSpec in this.actionSpecs) { #> + + public <#=actionSpec.Executor.GetTypeName(TargetLanguage.CSharp)#> <#=actionSpec.Executor.GetTypeName(TargetLanguage.CSharp)#> { get => this.<#=actionSpec.Executor.GetVariableName(TargetLanguage.CSharp)#>; } +<# } #> +<# foreach (var propSpec in this.propSpecs) { #> + + public <#=propSpec.Maintainer.GetTypeName(TargetLanguage.CSharp)#>.<#=this.readResponderName.GetTypeName(TargetLanguage.CSharp)#> <#=propSpec.Name.GetTypeName(TargetLanguage.CSharp, "read", "responder")#> { get => this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "responder")#>; } +<# if (propSpec.WriteReqSchema != null) { #> + + public <#=propSpec.Maintainer.GetTypeName(TargetLanguage.CSharp)#>.<#=this.writeResponderName.GetTypeName(TargetLanguage.CSharp)#> <#=propSpec.Name.GetTypeName(TargetLanguage.CSharp, "write", "responder")#> { get => this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "responder")#>; } +<# } #> +<# } #> +<# foreach (var telemEnvoyInfo in this.eventSpec) { #> + + public <#=telemEnvoyInfo.Sender.GetTypeName(TargetLanguage.CSharp)#> <#=telemEnvoyInfo.Sender.GetTypeName(TargetLanguage.CSharp)#> { get => this.<#=telemEnvoyInfo.Sender.GetVariableName(TargetLanguage.CSharp)#>; } +<# } #> +<# foreach (var actionSpec in this.actionSpecs) { #> + + public <#=this.defaultImpl ? "virtual" : "abstract"#> <#=this.ExtRespType(actionSpec)#> <#=actionSpec.Name.GetMethodName(TargetLanguage.CSharp, "async")#>(<#=this.ReqParam(actionSpec)#>CommandRequestMetadata requestMetadata, CancellationToken cancellationToken)<#=this.defaultImpl ? "" : ";"#> +<# if (this.defaultImpl) { #> + { + return <#=this.EmptyResp(actionSpec)#>; + } +<# } #> +<# } #> +<# foreach (var propSpec in this.propSpecs) { #> + + public abstract Task>> <#=propSpec.Name.GetMethodName(TargetLanguage.CSharp, "async", prefix: "read")#>(CommandRequestMetadata requestMetadata, CancellationToken cancellationToken); +<# if (propSpec.WriteReqSchema != null) { #> + + public abstract Task <#=propSpec.Name.GetMethodName(TargetLanguage.CSharp, "async", prefix: "write")#>(<#=propSpec.WriteReqSchema.GetTypeName(TargetLanguage.CSharp)#> <#=propSpec.Name.GetVariableName(TargetLanguage.CSharp)#>, CommandRequestMetadata requestMetadata, CancellationToken cancellationToken); +<# } #> +<# } #> +<# foreach (var telemEnvoyInfo in this.eventSpec) { #> + + /// + /// Send telemetry. + /// + /// The payload of the telemetry. + /// The metadata of the telemetry. + /// + /// The topic token replacement map to use in addition to the topic token map provided in the constructor. If this map + /// contains any keys that topic token map provided in the constructor also has, then values specified in this map will take precedence. + /// + /// The quality of service to send the telemetry with. + /// How long the telemetry message will be available on the broker for a receiver to receive. + /// Cancellation token. + public async Task <#=this.TelemMethodName(telemEnvoyInfo, "send", "async")#>(<#=telemEnvoyInfo.Schema.GetTypeName(TargetLanguage.CSharp)#> telemetry, OutgoingTelemetryMetadata metadata, Dictionary? additionalTopicTokenMap = null, MqttQualityOfServiceLevel qos = MqttQualityOfServiceLevel.AtLeastOnce, TimeSpan? telemetryTimeout = null, CancellationToken cancellationToken = default) + { + additionalTopicTokenMap ??= new(); + + Dictionary prefixedAdditionalTopicTokenMap = new(); + foreach (string key in additionalTopicTokenMap.Keys) + { + prefixedAdditionalTopicTokenMap["ex:" + key] = additionalTopicTokenMap[key]; + } + await this.<#=telemEnvoyInfo.Sender.GetVariableName(TargetLanguage.CSharp)#>.SendTelemetryAsync(telemetry, metadata, prefixedAdditionalTopicTokenMap, qos, telemetryTimeout, cancellationToken); + } +<# } #> +<# if (this.actionSpecs.Any() || this.propSpecs.Any()) { #> + + /// + /// Begin accepting command invocations for all command executors. + /// + /// The dispatch concurrency count for the command response cache to use. + /// Cancellation token. + public async Task StartAsync(int? preferredDispatchConcurrency = null, CancellationToken cancellationToken = default) + { + string? clientId = this.mqttClient.ClientId; + if (string.IsNullOrEmpty(clientId)) + { + throw new InvalidOperationException("No MQTT client Id configured. Must connect to MQTT broker before starting service."); + } + + await Task.WhenAll( +<# foreach (var actionSpec in this.actionSpecs) { #> + this.<#=actionSpec.Executor.GetVariableName(TargetLanguage.CSharp)#>.StartAsync(preferredDispatchConcurrency, cancellationToken)<#=this.IsLast(actionSpec) ? ").ConfigureAwait(false);" : ","#> +<# } #> +<# foreach (var propSpec in this.propSpecs) { #> + this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "responder")#>.StartAsync(preferredDispatchConcurrency, cancellationToken)<#=this.IsLast(propSpec) && propSpec.WriteReqSchema == null ? ").ConfigureAwait(false);" : ","#> +<# if (propSpec.WriteReqSchema != null) { #> + this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "responder")#>.StartAsync(preferredDispatchConcurrency, cancellationToken)<#=this.IsLast(propSpec) ? ").ConfigureAwait(false);" : ","#> +<# } #> +<# } #> + } + + public async Task StopAsync(CancellationToken cancellationToken = default) + { + await Task.WhenAll( +<# foreach (var actionSpec in this.actionSpecs) { #> + this.<#=actionSpec.Executor.GetVariableName(TargetLanguage.CSharp)#>.StopAsync(cancellationToken)<#=this.IsLast(actionSpec) ? ").ConfigureAwait(false);" : ","#> +<# } #> +<# foreach (var propSpec in this.propSpecs) { #> + this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "responder")#>.StopAsync(cancellationToken)<#=this.IsLast(propSpec) && propSpec.WriteReqSchema == null ? ").ConfigureAwait(false);" : ","#> +<# if (propSpec.WriteReqSchema != null) { #> + this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "responder")#>.StopAsync(cancellationToken)<#=this.IsLast(propSpec) ? ").ConfigureAwait(false);" : ","#> +<# } #> +<# } #> + } +<# } #> +<# foreach (var actionSpec in this.actionSpecs) { #> + + private async Task>> <#=actionSpec.Name.GetMethodName(TargetLanguage.CSharp, "int")#>(ExtendedRequest<<#=this.SchemaType(actionSpec.RequestSchema, actionSpec.SerializerEmptyType)#>> req, CancellationToken cancellationToken) + { +<# if (actionSpec.ErrorResultName != null) { #> + try + { + <#=this.IntLValue(actionSpec)#>await this.<#=actionSpec.Name.GetMethodName(TargetLanguage.CSharp, "async")#>(<#=this.ReqArgs(actionSpec, "req")#>, cancellationToken); + + return new ExtendedResponse<<#=this.SchemaType(actionSpec.ResponseSchema, actionSpec.SerializerEmptyType)#>> + { + + Response = new <#=this.SchemaType(actionSpec.ResponseSchema, actionSpec.SerializerEmptyType)#> + { +<# foreach (CodeName normalResultName in actionSpec.NormalResultNames) { #> + <#=normalResultName.GetFieldName(TargetLanguage.CSharp)#> = extended.Response.<#=normalResultName.GetFieldName(TargetLanguage.CSharp)#>, +<# } #> + }, + ResponseMetadata = extended.ResponseMetadata, + }; + } + catch (<#=actionSpec.ErrorResultSchema.GetTypeName(TargetLanguage.CSharp, "exception")#> intEx) + { + ExtendedResponse<<#=this.SchemaType(actionSpec.ResponseSchema, actionSpec.SerializerEmptyType)#>> extendedResponse = ExtendedResponse<<#=this.SchemaType(actionSpec.ResponseSchema, actionSpec.SerializerEmptyType)#>>.CreateFromResponse(new <#=this.SchemaType(actionSpec.ResponseSchema, actionSpec.SerializerEmptyType)#> { <#=actionSpec.ErrorResultName.GetFieldName(TargetLanguage.CSharp)#> = intEx.<#=actionSpec.ErrorResultSchema.GetFieldName(TargetLanguage.CSharp)#> }); +<# if (actionSpec.ErrorCodeName != null) { #> + + if (intEx.TryGetApplicationError(out <#=actionSpec.ErrorCodeSchema.GetTypeName(TargetLanguage.CSharp)#>? <#=actionSpec.ErrorCodeName.GetVariableName(TargetLanguage.CSharp)#>, out <#=this.GetInfoSchema(actionSpec.ErrorInfoSchema)#>? <#=this.GetInfoName(actionSpec.ErrorInfoName)#>)) + { + extendedResponse = extendedResponse.WithApplicationError((<#=actionSpec.ErrorCodeSchema.GetTypeName(TargetLanguage.CSharp)#>)<#=actionSpec.ErrorCodeName.GetVariableName(TargetLanguage.CSharp)#>, <#=this.GetInfoName(actionSpec.ErrorInfoName)#>); + } + +<# } #> + return extendedResponse; + } +<# } else { #> + <#=this.IntLValue(actionSpec)#>await this.<#=actionSpec.Name.GetMethodName(TargetLanguage.CSharp, "async")#>(<#=this.ReqArgs(actionSpec, "req")#>, cancellationToken); + return new ExtendedResponse<<#=this.SchemaType(actionSpec.ResponseSchema, actionSpec.SerializerEmptyType)#>> { <#=this.IntRValue(actionSpec)#>}; +<# } #> + } +<# } #> +<# foreach (var propSpec in this.propSpecs) { #> + + private async Task>> <#=propSpec.Name.GetMethodName(TargetLanguage.CSharp, "int", prefix: "read")#>(ExtendedRequest<<#=propSpec.ReadSerializerEmptyType.GetTypeName(TargetLanguage.CSharp)#>> req, CancellationToken cancellationToken) + { +<# if (propSpec.ReadErrorName != null) { #> + try + { + ExtendedResponse<<#=propSpec.PropSchema.GetTypeName(TargetLanguage.CSharp)#>> extended = await this.<#=propSpec.Name.GetMethodName(TargetLanguage.CSharp, "async", prefix: "read")#>(req.RequestMetadata!, cancellationToken); + + return new ExtendedResponse<<#=propSpec.ReadRespSchema.GetTypeName(TargetLanguage.CSharp)#>> + { + Response = new <#=propSpec.ReadRespSchema.GetTypeName(TargetLanguage.CSharp)#> { <#=propSpec.PropValueName.GetFieldName(TargetLanguage.CSharp)#> = extended.Response<#=propSpec.IsAggregate ? "" : $".{propSpec.PropValueName.GetFieldName(TargetLanguage.CSharp)}"#> }, + ResponseMetadata = extended.ResponseMetadata, + }; + } + catch (<#=propSpec.ReadErrorSchema.GetTypeName(TargetLanguage.CSharp, "exception")#> intEx) + { + ExtendedResponse<<#=this.SchemaType(propSpec.ReadRespSchema, propSpec.ReadSerializerEmptyType)#>> extendedResponse = ExtendedResponse<<#=this.SchemaType(propSpec.ReadRespSchema, propSpec.ReadSerializerEmptyType)#>>.CreateFromResponse(new <#=this.SchemaType(propSpec.ReadRespSchema, propSpec.ReadSerializerEmptyType)#> { <#=propSpec.ReadErrorName.GetFieldName(TargetLanguage.CSharp)#> = intEx.<#=propSpec.ReadErrorSchema.GetFieldName(TargetLanguage.CSharp)#> }); + return extendedResponse; + } +<# } else { #> + return await this.<#=propSpec.Name.GetMethodName(TargetLanguage.CSharp, "async", prefix: "read")#>(req.RequestMetadata!, cancellationToken); +<# } #> + } +<# if (propSpec.WriteReqSchema != null) { #> + + private async Task>> <#=propSpec.Name.GetMethodName(TargetLanguage.CSharp, "int", prefix: "write")#>(ExtendedRequest<<#=propSpec.WriteReqSchema.GetTypeName(TargetLanguage.CSharp)#>> req, CancellationToken cancellationToken) + { +<# if (propSpec.WriteRespSchema != null) { #> + try + { + CommandResponseMetadata? respMetadata = await this.<#=propSpec.Name.GetMethodName(TargetLanguage.CSharp, "async", prefix: "write")#>(req.Request!, req.RequestMetadata!, cancellationToken); + + return new ExtendedResponse<<#=propSpec.WriteRespSchema.GetTypeName(TargetLanguage.CSharp)#>> + { + Response = new <#=propSpec.WriteRespSchema.GetTypeName(TargetLanguage.CSharp)#> + { + <#=propSpec.WriteErrorName.GetFieldName(TargetLanguage.CSharp)#> = null, + }, + ResponseMetadata = respMetadata, + }; + } + catch (<#=propSpec.WriteErrorSchema.GetTypeName(TargetLanguage.CSharp, "exception")#> intEx) + { + ExtendedResponse<<#=this.SchemaType(propSpec.WriteRespSchema, propSpec.WriteSerializerEmptyType)#>> extendedResponse = ExtendedResponse<<#=this.SchemaType(propSpec.WriteRespSchema, propSpec.WriteSerializerEmptyType)#>>.CreateFromResponse(new <#=this.SchemaType(propSpec.WriteRespSchema, propSpec.WriteSerializerEmptyType)#> { <#=propSpec.WriteErrorName.GetFieldName(TargetLanguage.CSharp)#> = intEx.<#=propSpec.WriteErrorSchema.GetFieldName(TargetLanguage.CSharp)#> }); + return extendedResponse; + } +<# } else { #> + CommandResponseMetadata? respMetadata = await this.<#=propSpec.Name.GetMethodName(TargetLanguage.CSharp, "async", prefix: "write")#>(req.Request!, req.RequestMetadata!, cancellationToken); + return new ExtendedResponse<<#=propSpec.WriteSerializerEmptyType.GetTypeName(TargetLanguage.CSharp)#>> + { + Response = new <#=propSpec.WriteSerializerEmptyType.GetTypeName(TargetLanguage.CSharp)#>(), + ResponseMetadata = respMetadata, + }; +<# } #> + } +<# } #> +<# } #> + + public async ValueTask DisposeAsync() + { +<# foreach (var actionSpec in this.actionSpecs) { #> + await this.<#=actionSpec.Executor.GetVariableName(TargetLanguage.CSharp)#>.DisposeAsync().ConfigureAwait(false); +<# } #> +<# foreach (var propSpec in this.propSpecs) { #> + await this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "responder")#>.DisposeAsync().ConfigureAwait(false); +<# if (propSpec.WriteReqSchema != null) { #> + await this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "responder")#>.DisposeAsync().ConfigureAwait(false); +<# } #> +<# } #> +<# foreach (var telemEnvoyInfo in this.eventSpec) { #> + await this.<#=telemEnvoyInfo.Sender.GetVariableName(TargetLanguage.CSharp)#>.DisposeAsync().ConfigureAwait(false); +<# } #> + } + + public async ValueTask DisposeAsync(bool disposing) + { +<# foreach (var actionSpec in this.actionSpecs) { #> + await this.<#=actionSpec.Executor.GetVariableName(TargetLanguage.CSharp)#>.DisposeAsync(disposing).ConfigureAwait(false); +<# } #> +<# foreach (var propSpec in this.propSpecs) { #> + await this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "responder")#>.DisposeAsync(disposing).ConfigureAwait(false); +<# if (propSpec.WriteReqSchema != null) { #> + await this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "responder")#>.DisposeAsync(disposing).ConfigureAwait(false); +<# } #> +<# } #> +<# foreach (var telemEnvoyInfo in this.eventSpec) { #> + await this.<#=telemEnvoyInfo.Sender.GetVariableName(TargetLanguage.CSharp)#>.DisposeAsync(disposing).ConfigureAwait(false); +<# } #> + } + } +<# } #> +<# if (this.generateServer && this.generateClient) { #> + +<# } #> +<# if (this.generateClient) { #> + public abstract partial class Client<#=this.actionSpecs.Any() || this.propSpecs.Any() ? " : IAsyncDisposable" : ""#> + { + private ApplicationContext applicationContext; + private IMqttPubSubClient mqttClient; +<# foreach (var actionSpec in this.actionSpecs) { #> + private readonly <#=actionSpec.Invoker.GetTypeName(TargetLanguage.CSharp)#> <#=actionSpec.Invoker.GetVariableName(TargetLanguage.CSharp)#>; +<# } #> +<# foreach (var propSpec in this.propSpecs) { #> + private readonly <#=propSpec.Consumer.GetTypeName(TargetLanguage.CSharp)#>.<#=this.readRequesterName.GetTypeName(TargetLanguage.CSharp)#> <#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "requester")#>; +<# if (propSpec.WriteReqSchema != null) { #> + private readonly <#=propSpec.Consumer.GetTypeName(TargetLanguage.CSharp)#>.<#=this.writeRequesterName.GetTypeName(TargetLanguage.CSharp)#> <#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "requester")#>; +<# } #> +<# } #> +<# foreach (var telemEnvoyInfo in this.eventSpec) { #> + private readonly <#=telemEnvoyInfo.Receiver.GetTypeName(TargetLanguage.CSharp)#> <#=telemEnvoyInfo.Receiver.GetVariableName(TargetLanguage.CSharp)#>; +<# } #> + + /// + /// Construct a new instance of this client. + /// + /// The shared context for your application. + /// The MQTT client to use. + /// + /// The topic token replacement map to use for all operations by default. Generally, this will include the token values + /// for topic tokens such as "modelId" which should be the same for the duration of this client's lifetime. + /// + public Client(ApplicationContext applicationContext, IMqttPubSubClient mqttClient, Dictionary? topicTokenMap = null) + { + this.applicationContext = applicationContext; + this.mqttClient = mqttClient; + +<# foreach (var actionSpec in this.actionSpecs) { #> + this.<#=actionSpec.Invoker.GetVariableName(TargetLanguage.CSharp)#> = new <#=actionSpec.Invoker.GetTypeName(TargetLanguage.CSharp)#>(applicationContext, mqttClient); +<# } #> +<# foreach (var propSpec in this.propSpecs) { #> + this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "requester")#> = new <#=propSpec.Consumer.GetTypeName(TargetLanguage.CSharp)#>.<#=this.readRequesterName.GetTypeName(TargetLanguage.CSharp)#>(applicationContext, mqttClient); +<# if (propSpec.WriteReqSchema != null) { #> + this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "requester")#> = new <#=propSpec.Consumer.GetTypeName(TargetLanguage.CSharp)#>.<#=this.writeRequesterName.GetTypeName(TargetLanguage.CSharp)#>(applicationContext, mqttClient); +<# } #> +<# } #> +<# foreach (var telemEnvoyInfo in this.eventSpec) { #> + this.<#=telemEnvoyInfo.Receiver.GetVariableName(TargetLanguage.CSharp)#> = new <#=telemEnvoyInfo.Receiver.GetTypeName(TargetLanguage.CSharp)#>(applicationContext, mqttClient) { OnTelemetryReceived = this.<#=this.TelemMethodName(telemEnvoyInfo, "receive")#> }; +<# } #> + + if (topicTokenMap != null) + { + foreach (string topicTokenKey in topicTokenMap.Keys) + { +<# foreach (var actionSpec in this.actionSpecs) { #> + this.<#=actionSpec.Invoker.GetVariableName(TargetLanguage.CSharp)#>.TopicTokenMap.TryAdd("ex:" + topicTokenKey, topicTokenMap[topicTokenKey]); +<# } #> +<# foreach (var propSpec in this.propSpecs) { #> + this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "requester")#>.TopicTokenMap.TryAdd("ex:" + topicTokenKey, topicTokenMap[topicTokenKey]); +<# if (propSpec.WriteReqSchema != null) { #> + this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "requester")#>.TopicTokenMap.TryAdd("ex:" + topicTokenKey, topicTokenMap[topicTokenKey]); +<# } #> +<# } #> +<# foreach (var telemEnvoyInfo in this.eventSpec) { #> + this.<#=telemEnvoyInfo.Receiver.GetVariableName(TargetLanguage.CSharp)#>.TopicTokenMap.TryAdd("ex:" + topicTokenKey, topicTokenMap[topicTokenKey]); +<# } #> + } + } + } +<# foreach (var actionSpec in this.actionSpecs) { #> + + public <#=actionSpec.Invoker.GetTypeName(TargetLanguage.CSharp)#> <#=actionSpec.Invoker.GetTypeName(TargetLanguage.CSharp)#> { get => this.<#=actionSpec.Invoker.GetVariableName(TargetLanguage.CSharp)#>; } +<# } #> +<# foreach (var propSpec in this.propSpecs) { #> + + public <#=propSpec.Consumer.GetTypeName(TargetLanguage.CSharp)#>.<#=this.readRequesterName.GetTypeName(TargetLanguage.CSharp)#> <#=propSpec.Name.GetTypeName(TargetLanguage.CSharp, "read", "requester")#> { get => this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "requester")#>; } +<# if (propSpec.WriteReqSchema != null) { #> + + public <#=propSpec.Consumer.GetTypeName(TargetLanguage.CSharp)#>.<#=this.writeRequesterName.GetTypeName(TargetLanguage.CSharp)#> <#=propSpec.Name.GetTypeName(TargetLanguage.CSharp, "write", "requester")#> { get => this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "requester")#>; } +<# } #> +<# } #> +<# foreach (var telemEnvoyInfo in this.eventSpec) { #> + + public <#=telemEnvoyInfo.Receiver.GetTypeName(TargetLanguage.CSharp)#> <#=telemEnvoyInfo.Receiver.GetTypeName(TargetLanguage.CSharp)#> { get => this.<#=telemEnvoyInfo.Receiver.GetVariableName(TargetLanguage.CSharp)#>; } +<# } #> +<# foreach (var telemEnvoyInfo in this.eventSpec) { #> + + public <#=this.defaultImpl ? "virtual" : "abstract"#> Task <#=this.TelemMethodName(telemEnvoyInfo, "receive")#>(string senderId, <#=telemEnvoyInfo.Schema.GetTypeName(TargetLanguage.CSharp)#> telemetry, IncomingTelemetryMetadata metadata)<#=this.defaultImpl ? "" : ";"#> +<# if (this.defaultImpl) { #> + { + return Task.CompletedTask; + } +<# } #> +<# } #> +<# foreach (var actionSpec in this.actionSpecs) { #> + + /// + /// Invoke a command. + /// +<# if (actionSpec.DoesTargetExecutor) { #> + /// The identifier of the executor targeted by this command request. +<# } #> +<# if (actionSpec.RequestSchema != null) { #> + /// The data for this command request. +<# } #> + /// The metadata for this command request. + /// + /// The topic token replacement map to use in addition to the topic tokens specified in the constructor. If this map + /// contains any keys that the topic tokens specified in the constructor also has, then values specified in this map will take precedence. + /// + /// How long the command will be available on the broker for an executor to receive. + /// Cancellation token. + /// The command response. + public <#=this.CallAsyncType(actionSpec)#> <#=actionSpec.Name.GetMethodName(TargetLanguage.CSharp, "async")#>(<#=this.ExecParam(actionSpec)#><#=this.ReqParam(actionSpec)#>CommandRequestMetadata? requestMetadata = null, Dictionary? additionalTopicTokenMap = null, TimeSpan? commandTimeout = default, CancellationToken cancellationToken = default) + { + string? clientId = this.mqttClient.ClientId; + if (string.IsNullOrEmpty(clientId)) + { + throw new InvalidOperationException("No MQTT client Id configured. Must connect to MQTT broker before invoking command."); + } + + CommandRequestMetadata metadata = requestMetadata ?? new CommandRequestMetadata(); + additionalTopicTokenMap ??= new(); + + Dictionary prefixedAdditionalTopicTokenMap = new(); + foreach (string key in additionalTopicTokenMap.Keys) + { + prefixedAdditionalTopicTokenMap["ex:" + key] = additionalTopicTokenMap[key]; + } + + prefixedAdditionalTopicTokenMap["invokerClientId"] = clientId; +<# if (actionSpec.DoesTargetExecutor) { #> + prefixedAdditionalTopicTokenMap["executorId"] = executorId; +<# } #> + + return new <#=this.CallAsyncType(actionSpec)#>(this.<#=this.IntMethod(actionSpec)#>(<#=actionSpec.RequestSchema != null ? $"request" : actionSpec.SerializerEmptyType.GetAllocator(TargetLanguage.CSharp)#>, metadata, prefixedAdditionalTopicTokenMap, commandTimeout, cancellationToken), metadata.CorrelationId); + } +<# } #> +<# foreach (var propSpec in this.propSpecs) { #> + + public <#=this.CallAsyncType(propSpec)#> <#=propSpec.Name.GetMethodName(TargetLanguage.CSharp, "async", prefix: "read")#>(<#=this.ReadMaintParam(propSpec)#>CommandRequestMetadata? requestMetadata = null, Dictionary? additionalTopicTokenMap = null, TimeSpan? commandTimeout = default, CancellationToken cancellationToken = default) + { + string? clientId = this.mqttClient.ClientId; + if (string.IsNullOrEmpty(clientId)) + { + throw new InvalidOperationException("No MQTT client Id configured. Must connect to MQTT broker before requesting to read property."); + } + + CommandRequestMetadata metadata = requestMetadata ?? new CommandRequestMetadata(); + additionalTopicTokenMap ??= new(); + + Dictionary prefixedAdditionalTopicTokenMap = new(); + foreach (string key in additionalTopicTokenMap.Keys) + { + prefixedAdditionalTopicTokenMap["ex:" + key] = additionalTopicTokenMap[key]; + } + + prefixedAdditionalTopicTokenMap["consumerClientId"] = clientId; +<# if (propSpec.DoesReadTargetMaintainer) { #> + prefixedAdditionalTopicTokenMap["maintainerId"] = maintainerId; +<# } #> + + return new <#=this.CallAsyncType(propSpec)#>(this.<#=this.IntReadMethod(propSpec)#>(<#=propSpec.ReadSerializerEmptyType.GetAllocator(TargetLanguage.CSharp)#>, metadata, prefixedAdditionalTopicTokenMap, commandTimeout, cancellationToken), metadata.CorrelationId); + } +<# if (propSpec.WriteReqSchema != null) { #> + + public RpcCallAsync<<#=propSpec.ReadSerializerEmptyType.GetTypeName(TargetLanguage.CSharp)#>> <#=propSpec.Name.GetMethodName(TargetLanguage.CSharp, "async", prefix: "write")#>(<#=this.WriteMaintParam(propSpec)#><#=propSpec.WriteReqSchema.GetTypeName(TargetLanguage.CSharp)#> request, CommandRequestMetadata? requestMetadata = null, Dictionary? additionalTopicTokenMap = null, TimeSpan? commandTimeout = default, CancellationToken cancellationToken = default) + { + string? clientId = this.mqttClient.ClientId; + if (string.IsNullOrEmpty(clientId)) + { + throw new InvalidOperationException("No MQTT client Id configured. Must connect to MQTT broker before requesting to write property."); + } + + CommandRequestMetadata metadata = requestMetadata ?? new CommandRequestMetadata(); + additionalTopicTokenMap ??= new(); + + Dictionary prefixedAdditionalTopicTokenMap = new(); + foreach (string key in additionalTopicTokenMap.Keys) + { + prefixedAdditionalTopicTokenMap["ex:" + key] = additionalTopicTokenMap[key]; + } + + prefixedAdditionalTopicTokenMap["consumerClientId"] = clientId; +<# if (propSpec.DoesWriteTargetMaintainer) { #> + prefixedAdditionalTopicTokenMap["maintainerId"] = maintainerId; +<# } #> + + return new RpcCallAsync<<#=propSpec.WriteSerializerEmptyType.GetTypeName(TargetLanguage.CSharp)#>>(this.<#=this.IntWriteMethod(propSpec)#>(request, metadata, prefixedAdditionalTopicTokenMap, commandTimeout, cancellationToken), metadata.CorrelationId); + } +<# } #> +<# } #> +<# if (this.eventSpec.Any()) { #> + + /// + /// Begin accepting telemetry for all telemetry receivers. + /// + /// Cancellation token. + public async Task StartAsync(CancellationToken cancellationToken = default) + { + await Task.WhenAll( +<# foreach (var telemEnvoyInfo in this.eventSpec) { #> + this.<#=telemEnvoyInfo.Receiver.GetVariableName(TargetLanguage.CSharp)#>.StartAsync(cancellationToken)<#=this.IsLast(telemEnvoyInfo) ? ").ConfigureAwait(false);" : ","#> +<# } #> + } +<# } #> +<# if (this.eventSpec.Any()) { #> + + /// + /// Stop accepting telemetry for all telemetry receivers. + /// + /// Cancellation token. + public async Task StopAsync(CancellationToken cancellationToken = default) + { + await Task.WhenAll( +<# foreach (var telemEnvoyInfo in this.eventSpec) { #> + this.<#=telemEnvoyInfo.Receiver.GetVariableName(TargetLanguage.CSharp)#>.StopAsync(cancellationToken)<#=this.IsLast(telemEnvoyInfo) ? ").ConfigureAwait(false);" : ","#> +<# } #> + } +<# } #> +<# foreach (var actionSpec in this.actionSpecs) { #> +<# if (actionSpec.ErrorResultName != null) { #> + + private async Task>> <#=actionSpec.Name.GetMethodName(TargetLanguage.CSharp, "int")#>(<#=this.SchemaType(actionSpec.RequestSchema, actionSpec.SerializerEmptyType)#> request, CommandRequestMetadata? requestMetadata, Dictionary? prefixedAdditionalTopicTokenMap, TimeSpan? commandTimeout, CancellationToken cancellationToken) + { + ExtendedResponse<<#=this.SchemaType(actionSpec.ResponseSchema, actionSpec.SerializerEmptyType)#>> extended = await this.<#=actionSpec.Invoker.GetVariableName(TargetLanguage.CSharp)#>.InvokeCommandAsync(request, requestMetadata, prefixedAdditionalTopicTokenMap, commandTimeout, cancellationToken); + + if (extended.Response.<#=actionSpec.ErrorResultName.GetFieldName(TargetLanguage.CSharp)#> != null) + { + <#=actionSpec.ErrorResultSchema.GetTypeName(TargetLanguage.CSharp, "exception")#> <#=actionSpec.ErrorResultSchema.GetVariableName(TargetLanguage.CSharp, "exception")#> = new <#=actionSpec.ErrorResultSchema.GetTypeName(TargetLanguage.CSharp, "exception")#>(extended.Response.<#=actionSpec.ErrorResultName.GetFieldName(TargetLanguage.CSharp)#>); +<# if (actionSpec.ErrorCodeName != null) { #> + + if (extended.TryGetApplicationError(out <#=actionSpec.ErrorCodeSchema.GetTypeName(TargetLanguage.CSharp)#>? <#=actionSpec.ErrorCodeName.GetVariableName(TargetLanguage.CSharp)#>, out <#=this.GetInfoSchema(actionSpec.ErrorInfoSchema)#>? <#=this.GetInfoName(actionSpec.ErrorInfoName)#>)) + { + <#=actionSpec.ErrorResultSchema.GetVariableName(TargetLanguage.CSharp, "exception")#> = <#=actionSpec.ErrorResultSchema.GetVariableName(TargetLanguage.CSharp, "exception")#>.WithApplicationError((<#=actionSpec.ErrorCodeSchema.GetTypeName(TargetLanguage.CSharp)#>)<#=actionSpec.ErrorCodeName.GetVariableName(TargetLanguage.CSharp)#>, <#=this.GetInfoName(actionSpec.ErrorInfoName)#>); + } + +<# } #> + throw <#=actionSpec.ErrorResultSchema.GetVariableName(TargetLanguage.CSharp, "exception")#>; + } + else + { + return new ExtendedResponse<<#=this.SchemaType(actionSpec.NormalResultSchema ?? actionSpec.ResponseSchema, actionSpec.SerializerEmptyType)#>> + { + Response = new <#=this.SchemaType(actionSpec.NormalResultSchema ?? actionSpec.ResponseSchema, actionSpec.SerializerEmptyType)#> + { +<# foreach (CodeName normalResultName in actionSpec.NormalResultNames) { #> + <#=normalResultName.GetFieldName(TargetLanguage.CSharp)#> = extended.Response.<#=normalResultName.GetFieldName(TargetLanguage.CSharp)#><#=actionSpec.NormalRequiredNames.Contains(normalResultName) ? ".Value()" : ""#>, +<# } #> + }, + ResponseMetadata = extended.ResponseMetadata, + }; + } + } +<# } #> +<# } #> +<# foreach (var propSpec in this.propSpecs) { #> +<# if (propSpec.ReadErrorName != null) { #> + + private async Task>> <#=propSpec.Name.GetMethodName(TargetLanguage.CSharp, "int", prefix: "read")#>(<#=propSpec.ReadSerializerEmptyType.GetTypeName(TargetLanguage.CSharp)#> request, CommandRequestMetadata? requestMetadata, Dictionary? prefixedAdditionalTopicTokenMap, TimeSpan? commandTimeout, CancellationToken cancellationToken) + { + ExtendedResponse<<#=this.SchemaType(propSpec.ReadRespSchema, propSpec.ReadSerializerEmptyType)#>> extended = await this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "requester")#>.InvokeCommandAsync(request, requestMetadata, prefixedAdditionalTopicTokenMap, commandTimeout, cancellationToken); + + if (extended.Response.<#=propSpec.ReadErrorName.GetFieldName(TargetLanguage.CSharp)#> != null) + { + <#=propSpec.ReadErrorSchema.GetTypeName(TargetLanguage.CSharp, "exception")#> <#=propSpec.ReadErrorSchema.GetVariableName(TargetLanguage.CSharp, "exception")#> = new <#=propSpec.ReadErrorSchema.GetTypeName(TargetLanguage.CSharp, "exception")#>(extended.Response.<#=propSpec.ReadErrorName.GetFieldName(TargetLanguage.CSharp)#>); + throw <#=propSpec.ReadErrorSchema.GetVariableName(TargetLanguage.CSharp, "exception")#>; + } + else if (extended.Response.<#=propSpec.PropValueName.GetFieldName(TargetLanguage.CSharp)#> == null) + { + throw new AkriMqttException("Property read response has neither normal nor error payload content") + { + Kind = AkriMqttErrorKind.PayloadInvalid, + IsShallow = false, + IsRemote = false, + }; + } + else + { + return new ExtendedResponse<<#=this.SchemaType(propSpec.PropSchema, propSpec.ReadSerializerEmptyType)#>> + { +<# if (propSpec.IsAggregate) { #> + Response = extended.Response.<#=propSpec.PropValueName.GetFieldName(TargetLanguage.CSharp)#>, +<# } else { #> + Response = new <#=this.SchemaType(propSpec.PropSchema, propSpec.ReadSerializerEmptyType)#> { <#=propSpec.PropValueName.GetFieldName(TargetLanguage.CSharp)#> = extended.Response.<#=propSpec.PropValueName.GetFieldName(TargetLanguage.CSharp)#>.Value() }, +<# } #> + ResponseMetadata = extended.ResponseMetadata, + }; + } + } +<# } #> +<# if (propSpec.WriteErrorName != null) { #> + + private async Task>> <#=propSpec.Name.GetMethodName(TargetLanguage.CSharp, "int", prefix: "write")#>(<#=propSpec.WriteReqSchema.GetTypeName(TargetLanguage.CSharp)#> request, CommandRequestMetadata? requestMetadata, Dictionary? prefixedAdditionalTopicTokenMap, TimeSpan? commandTimeout, CancellationToken cancellationToken) + { + ExtendedResponse<<#=this.SchemaType(propSpec.WriteRespSchema, propSpec.WriteSerializerEmptyType)#>> extended = await this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "requester")#>.InvokeCommandAsync(request, requestMetadata, prefixedAdditionalTopicTokenMap, commandTimeout, cancellationToken); + + if (extended.Response.<#=propSpec.WriteErrorName.GetFieldName(TargetLanguage.CSharp)#> != null) + { + <#=propSpec.WriteErrorSchema.GetTypeName(TargetLanguage.CSharp, "exception")#> <#=propSpec.WriteErrorSchema.GetVariableName(TargetLanguage.CSharp, "exception")#> = new <#=propSpec.WriteErrorSchema.GetTypeName(TargetLanguage.CSharp, "exception")#>(extended.Response.<#=propSpec.WriteErrorName.GetFieldName(TargetLanguage.CSharp)#>); + throw <#=propSpec.WriteErrorSchema.GetVariableName(TargetLanguage.CSharp, "exception")#>; + } + else + { + return new ExtendedResponse<<#=propSpec.WriteSerializerEmptyType.GetTypeName(TargetLanguage.CSharp)#>> + { + Response = <#=propSpec.WriteSerializerEmptyType.GetAllocator(TargetLanguage.CSharp)#>, + ResponseMetadata = extended.ResponseMetadata, + }; + } + } +<# } #> +<# } #> + + public async ValueTask DisposeAsync() + { +<# foreach (var actionSpec in this.actionSpecs) { #> + await this.<#=actionSpec.Invoker.GetVariableName(TargetLanguage.CSharp)#>.DisposeAsync().ConfigureAwait(false); +<# } #> +<# foreach (var propSpec in this.propSpecs) { #> + await this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "requester")#>.DisposeAsync().ConfigureAwait(false); +<# if (propSpec.WriteReqSchema != null) { #> + await this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "requester")#>.DisposeAsync().ConfigureAwait(false); +<# } #> +<# } #> +<# foreach (var telemEnvoyInfo in this.eventSpec) { #> + await this.<#=telemEnvoyInfo.Receiver.GetVariableName(TargetLanguage.CSharp)#>.DisposeAsync().ConfigureAwait(false); +<# } #> + } + + public async ValueTask DisposeAsync(bool disposing) + { +<# foreach (var actionSpec in this.actionSpecs) { #> + await this.<#=actionSpec.Invoker.GetVariableName(TargetLanguage.CSharp)#>.DisposeAsync(disposing).ConfigureAwait(false); +<# } #> +<# foreach (var propSpec in this.propSpecs) { #> + await this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "requester")#>.DisposeAsync(disposing).ConfigureAwait(false); +<# if (propSpec.WriteReqSchema != null) { #> + await this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "requester")#>.DisposeAsync(disposing).ConfigureAwait(false); +<# } #> +<# } #> +<# foreach (var telemEnvoyInfo in this.eventSpec) { #> + await this.<#=telemEnvoyInfo.Receiver.GetVariableName(TargetLanguage.CSharp)#>.DisposeAsync(disposing).ConfigureAwait(false); +<# } #> + } + } +<# } #> + } +} +<#+ + private string IntLValue(ActionSpec actionSpec) => (actionSpec.ResponseSchema != null ? $"ExtendedResponse<{this.SchemaType(actionSpec.NormalResultSchema ?? actionSpec.ResponseSchema, actionSpec.SerializerEmptyType)}> extended = " : $"CommandResponseMetadata? responseMetadata = "); + + private string IntRValue(ActionSpec actionSpec) => (actionSpec.ResponseSchema != null ? "Response = extended.Response, ResponseMetadata = extended.ResponseMetadata " : "ResponseMetadata = responseMetadata "); + + private string ExtRespType(ActionSpec actionSpec) => this.CondWrap(actionSpec.ResponseSchema != null ? $"ExtendedResponse<{this.SchemaType(actionSpec.NormalResultSchema ?? actionSpec.ResponseSchema, actionSpec.SerializerEmptyType)}>" : "CommandResponseMetadata?"); + + private string EmptyResp(ActionSpec actionSpec) => this.CondFrom(actionSpec.ResponseSchema != null ? $"new ExtendedResponse<{this.SchemaType(actionSpec.NormalResultSchema ?? actionSpec.ResponseSchema, actionSpec.SerializerEmptyType)}> {{ Response = new {this.SchemaType(actionSpec.NormalResultSchema ?? actionSpec.ResponseSchema, actionSpec.SerializerEmptyType)}() }}" : "(CommandResponseMetadata?)new CommandResponseMetadata()"); + + private string CondWrap(string type) => $"Task<{type}>"; + + private string CondFrom(string res) => $"Task.FromResult({res})"; + + private string ReqParam(ActionSpec actionSpec) => actionSpec.RequestSchema != null ? $"{this.SchemaType(actionSpec.RequestSchema, actionSpec.SerializerEmptyType)} request, " : ""; + + private string ReqArgs(ActionSpec actionSpec, string reqVar) => actionSpec.RequestSchema != null ? $"{reqVar}.Request!, {reqVar}.RequestMetadata!" : $"{reqVar}.RequestMetadata!"; + + private string CallAsyncType(ActionSpec actionSpec) => $"RpcCallAsync<{this.SchemaType(actionSpec.NormalResultSchema ?? actionSpec.ResponseSchema, actionSpec.SerializerEmptyType)}>"; + + private string CallAsyncType(PropertySpec propSpec) => $"RpcCallAsync<{this.SchemaType(propSpec.PropSchema, propSpec.ReadSerializerEmptyType)}>"; + + private string IntMethod(ActionSpec actionSpec) => actionSpec.ErrorResultName != null ? actionSpec.Name.GetMethodName(TargetLanguage.CSharp, "int") : $"{actionSpec.Invoker.GetVariableName(TargetLanguage.CSharp)}.InvokeCommandAsync"; + + private string IntReadMethod(PropertySpec propSpec) => propSpec.ReadErrorName != null ? propSpec.Name.GetMethodName(TargetLanguage.CSharp, "int", prefix: "read") : $"{propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "requester")}.InvokeCommandAsync"; + + private string IntWriteMethod(PropertySpec propSpec) => propSpec.WriteErrorName != null ? propSpec.Name.GetMethodName(TargetLanguage.CSharp, "int", prefix: "write") : $"{propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "requester")}.InvokeCommandAsync"; + + private string SchemaType(ITypeName schema, EmptyTypeName emptyType) => schema?.GetTypeName(TargetLanguage.CSharp) ?? emptyType.GetTypeName(TargetLanguage.CSharp); + + private string ExecParam(ActionSpec actionSpec) => actionSpec.DoesTargetExecutor ? "string executorId, " : ""; + + private string ReadMaintParam(PropertySpec propSpec) => propSpec.DoesReadTargetMaintainer ? "string maintainerId, " : ""; + + private string WriteMaintParam(PropertySpec propSpec) => propSpec.DoesWriteTargetMaintainer ? "string maintainerId, " : ""; + + private bool IsLast(ActionSpec actionSpec) => actionSpec.Name.AsGiven == this.actionSpecs.Last().Name.AsGiven && !this.propSpecs.Any(); + + private bool IsLast(PropertySpec propSpec) => propSpec.Name == null || propSpec.Name.AsGiven == this.propSpecs.Last().Name.AsGiven; + + private bool IsLast(EventSpec telemEnvoyInfo) => telemEnvoyInfo.Name.AsGiven == this.eventSpec.Last().Name.AsGiven; + + private string TelemMethodName(EventSpec telemEnvoyInfo, string prefix, string suffix = null) => (new CodeName()).GetMethodName(TargetLanguage.CSharp, "telemetry", suffix, prefix: prefix); + + private string GetInfoName(CodeName infoName) => infoName?.GetVariableName(TargetLanguage.CSharp) ?? "errorPayload"; + + private string GetInfoSchema(CodeName infoSchema) => infoSchema?.GetTypeName(TargetLanguage.CSharp) ?? "string"; +#> diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandExecutor.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandExecutor.cs new file mode 100644 index 0000000000..c20012f845 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandExecutor.cs @@ -0,0 +1,66 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Collections.Generic; + using System.IO; + using Azure.Iot.Operations.CodeGeneration; + + public partial class RustCommandExecutor : IEnvoyTemplateTransform + { + private readonly CodeName commandName; + private readonly CodeName componentName; + private readonly CodeName genNamespace; + private readonly string modelId; + private readonly EmptyTypeName serializerEmptyType; + private readonly ITypeName? reqSchema; + private readonly ITypeName? respSchema; + private readonly List normalResultFields; + private readonly List normalRequiredFields; + private readonly CodeName? normalResultSchema; + private readonly CodeName? errorResultName; + private readonly CodeName? errorResultSchema; + private readonly bool isIdempotent; + private readonly string? serviceGroupId; + private readonly string topicPattern; + private readonly string srcSubdir; + + public RustCommandExecutor( + string commandName, + string componentName, + CodeName genNamespace, + string modelId, + EmptyTypeName serializerEmptyType, + ITypeName? reqSchema, + ITypeName? respSchema, + List normalResultFields, + List normalRequiredFields, + CodeName? normalResultSchema, + CodeName? errorResultName, + CodeName? errorResultSchema, + bool isIdempotent, + string? serviceGroupId, + string topicPattern, + string srcSubdir) + { + this.commandName = new CodeName(commandName); + this.componentName = new CodeName(componentName); + this.genNamespace = genNamespace; + this.modelId = modelId; + this.serializerEmptyType = serializerEmptyType; + this.reqSchema = reqSchema; + this.respSchema = respSchema; + this.normalResultFields = normalResultFields; + this.normalRequiredFields = normalRequiredFields; + this.normalResultSchema = normalResultSchema; + this.errorResultName = errorResultName; + this.errorResultSchema = errorResultSchema; + this.isIdempotent = isIdempotent; + this.serviceGroupId = serviceGroupId; + this.topicPattern = topicPattern; + this.srcSubdir = srcSubdir; + } + + public string FileName { get => $"{this.componentName.GetFileName(TargetLanguage.Rust)}.rs"; } + + public string FolderPath { get => Path.Combine(this.srcSubdir, this.genNamespace.GetFolderName(TargetLanguage.Rust)); } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandExecutorHeaders.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandExecutorHeaders.cs new file mode 100644 index 0000000000..c48e1f52ef --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandExecutorHeaders.cs @@ -0,0 +1,45 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Collections.Generic; + using System.IO; + using Azure.Iot.Operations.CodeGeneration; + + public partial class RustCommandExecutorHeaders : IEnvoyTemplateTransform + { + private readonly CodeName commandName; + private readonly CodeName componentName; + private readonly CodeName genNamespace; + private readonly CodeName errorCodeName; + private readonly CodeName errorCodeSchema; + private readonly CodeName? errorInfoName; + private readonly CodeName? errorInfoSchema; + List errorCodeValues; + private readonly string srcSubdir; + + public RustCommandExecutorHeaders( + string commandName, + string componentName, + CodeName genNamespace, + CodeName errorCodeName, + CodeName errorCodeSchema, + CodeName? errorInfoName, + CodeName? errorInfoSchema, + List errorCodeValues, + string srcSubdir) + { + this.commandName = new CodeName(commandName); + this.componentName = new CodeName(componentName); + this.genNamespace = genNamespace; + this.errorCodeName = errorCodeName; + this.errorCodeSchema = errorCodeSchema; + this.errorInfoName = errorInfoName; + this.errorInfoSchema = errorInfoSchema; + this.errorCodeValues = errorCodeValues; + this.srcSubdir = srcSubdir; + } + + public string FileName { get => $"{this.componentName.GetFileName(TargetLanguage.Rust, "headers")}.rs"; } + + public string FolderPath { get => Path.Combine(this.srcSubdir, this.genNamespace.GetFolderName(TargetLanguage.Rust)); } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandInvoker.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandInvoker.cs new file mode 100644 index 0000000000..81df49d410 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandInvoker.cs @@ -0,0 +1,63 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Collections.Generic; + using System.IO; + using Azure.Iot.Operations.CodeGeneration; + + public partial class RustCommandInvoker : IEnvoyTemplateTransform + { + private readonly CodeName commandName; + private readonly CodeName componentName; + private readonly CodeName genNamespace; + private readonly string modelId; + private readonly EmptyTypeName serializerEmptyType; + private readonly ITypeName? reqSchema; + private readonly ITypeName? respSchema; + private readonly List normalResultFields; + private readonly List normalRequiredFields; + private readonly CodeName? normalResultSchema; + private readonly CodeName? errorResultName; + private readonly CodeName? errorResultSchema; + private readonly string topicPattern; + private readonly bool doesCommandTargetExecutor; + private readonly string srcSubdir; + + public RustCommandInvoker( + string commandName, + string componentName, + CodeName genNamespace, + string modelId, + EmptyTypeName serializerEmptyType, + ITypeName? reqSchema, + ITypeName? respSchema, + List normalResultFields, + List normalRequiredFields, + CodeName? normalResultSchema, + CodeName? errorResultName, + CodeName? errorResultSchema, + string topicPattern, + bool doesCommandTargetExecutor, + string srcSubdir) + { + this.commandName = new CodeName(commandName); + this.componentName = new CodeName(componentName); + this.genNamespace = genNamespace; + this.modelId = modelId; + this.serializerEmptyType = serializerEmptyType; + this.reqSchema = reqSchema; + this.respSchema = respSchema; + this.normalResultFields = normalResultFields; + this.normalRequiredFields = normalRequiredFields; + this.normalResultSchema = normalResultSchema; + this.errorResultName = errorResultName; + this.errorResultSchema = errorResultSchema; + this.topicPattern = topicPattern; + this.doesCommandTargetExecutor = doesCommandTargetExecutor; + this.srcSubdir = srcSubdir; + } + + public string FileName { get => $"{this.componentName.GetFileName(TargetLanguage.Rust)}.rs"; } + + public string FolderPath { get => Path.Combine(this.srcSubdir, this.genNamespace.GetFolderName(TargetLanguage.Rust)); } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandInvokerHeaders.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandInvokerHeaders.cs new file mode 100644 index 0000000000..4c6ad4c9bf --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandInvokerHeaders.cs @@ -0,0 +1,45 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Collections.Generic; + using System.IO; + using Azure.Iot.Operations.CodeGeneration; + + public partial class RustCommandInvokerHeaders : IEnvoyTemplateTransform + { + private readonly CodeName commandName; + private readonly CodeName componentName; + private readonly CodeName genNamespace; + private readonly CodeName errorCodeName; + private readonly CodeName errorCodeSchema; + private readonly CodeName? errorInfoName; + private readonly CodeName? errorInfoSchema; + List errorCodeValues; + private readonly string srcSubdir; + + public RustCommandInvokerHeaders( + string commandName, + string componentName, + CodeName genNamespace, + CodeName errorCodeName, + CodeName errorCodeSchema, + CodeName? errorInfoName, + CodeName? errorInfoSchema, + List errorCodeValues, + string srcSubdir) + { + this.commandName = new CodeName(commandName); + this.componentName = new CodeName(componentName); + this.genNamespace = genNamespace; + this.errorCodeName = errorCodeName; + this.errorCodeSchema = errorCodeSchema; + this.errorInfoName = errorInfoName; + this.errorInfoSchema = errorInfoSchema; + this.errorCodeValues = errorCodeValues; + this.srcSubdir = srcSubdir; + } + + public string FileName { get => $"{this.componentName.GetFileName(TargetLanguage.Rust, "headers")}.rs"; } + + public string FolderPath { get => Path.Combine(this.srcSubdir, this.genNamespace.GetFolderName(TargetLanguage.Rust)); } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutor.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutor.tt new file mode 100644 index 0000000000..4c1056fb22 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutor.tt @@ -0,0 +1,174 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ + +use std::collections::HashMap; + +use azure_iot_operations_mqtt::interface::ManagedClient; +use azure_iot_operations_protocol::application::ApplicationContext; +use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; +<# if (this.respSchema != null) { #> +use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; +<# } #> +use azure_iot_operations_protocol::rpc_command; + +<# if (this.reqSchema is CustomTypeName || this.respSchema is CustomTypeName) { #> +use super::super::common_types::custom_payload::CustomPayload; +<# } #> +<# if (this.reqSchema == null || this.respSchema == null) { #> +use super::super::common_types::<#=this.serializerEmptyType.GetFileName(TargetLanguage.Rust)#>::<#=this.serializerEmptyType.GetTypeName(TargetLanguage.Rust)#>; +<# } #> +use super::super::common_types::options::CommandExecutorOptions; +<# if (this.reqSchema is CodeName) { #> +use super::<#=this.reqSchema.GetFileName(TargetLanguage.Rust)#>::<#=this.reqSchema.GetTypeName(TargetLanguage.Rust)#>; +<# } #> +<# if (this.respSchema is CodeName) { #> +use super::<#=this.respSchema.GetFileName(TargetLanguage.Rust)#>::<#=this.respSchema.GetTypeName(TargetLanguage.Rust)#>; +<# } #> +<# if (this.errorResultName != null) { #> +use super::<#=this.normalResultSchema.GetFileName(TargetLanguage.Rust)#>::<#=this.normalResultSchema.GetTypeName(TargetLanguage.Rust)#>; +use super::<#=this.errorResultSchema.GetFileName(TargetLanguage.Rust)#>::<#=this.errorResultSchema.GetTypeName(TargetLanguage.Rust)#>; +<# } #> + +pub type <#=this.commandName.GetTypeName(TargetLanguage.Rust, "request")#> = + rpc_command::executor::Request<<#=this.RequestType()#>, <#=this.ResponseType()#>>; +pub type <#=this.commandName.GetTypeName(TargetLanguage.Rust, "response")#> = rpc_command::executor::Response<<#=this.ResponseType()#>>; +pub type <#=this.commandName.GetTypeName(TargetLanguage.Rust, "response", "builder", "error")#> = rpc_command::executor::ResponseBuilderError; + +/// Builder for [`<#=this.commandName.GetTypeName(TargetLanguage.Rust, "response")#>`] +#[derive(Default)] +pub struct <#=this.commandName.GetTypeName(TargetLanguage.Rust, "response", "builder")#> { + inner_builder: rpc_command::executor::ResponseBuilder<<#=this.ResponseType()#>>, +} + +impl <#=this.commandName.GetTypeName(TargetLanguage.Rust, "response", "builder")#> { + /// Custom user data to set on the response + pub fn custom_user_data(&mut self, custom_user_data: Vec<(String, String)>) -> &mut Self { + self.inner_builder.custom_user_data(custom_user_data); + self + } + +<# if (this.respSchema != null) { #> + /// Payload of the response + /// + /// # Errors + /// If the payload cannot be serialized + pub fn payload( + &mut self, + payload: <#=(this.normalResultSchema ?? this.respSchema).GetTypeName(TargetLanguage.Rust)#>, + ) -> Result<&mut Self, AIOProtocolError> { +<# if (this.errorResultName != null) { #> + self.inner_builder.payload(<#=this.respSchema.GetTypeName(TargetLanguage.Rust)#> { +<# foreach (CodeName normalResultField in this.normalResultFields) { #> + <#=normalResultField.GetFieldName(TargetLanguage.Rust)#>: <#=this.CondSome($"payload.{normalResultField.GetFieldName(TargetLanguage.Rust)}", this.normalRequiredFields.Contains(normalResultField))#>, +<# } #> + <#=this.errorResultName.GetFieldName(TargetLanguage.Rust)#>: None, + })?; +<# } else { #> + self.inner_builder.payload(payload)?; +<# } #> + Ok(self) + } + +<# if (this.errorResultName != null) { #> + pub fn error(&mut self, error: <#=this.errorResultSchema.GetTypeName(TargetLanguage.Rust)#>) -> Result<&mut Self, AIOProtocolError> { + self.inner_builder.payload(<#=this.respSchema.GetTypeName(TargetLanguage.Rust)#> { +<# foreach (CodeName normalResultField in this.normalResultFields) { #> + <#=normalResultField.GetFieldName(TargetLanguage.Rust)#>: None, +<# } #> + <#=this.errorResultName.GetFieldName(TargetLanguage.Rust)#>: Some(error), + })?; + Ok(self) + } + +<# } #> +<# } #> + /// Builds a new `<#=this.commandName.GetTypeName(TargetLanguage.Rust, "response")#>` + /// + /// # Errors + /// If a required field has not been initialized + #[allow(clippy::missing_panics_doc)] // The panic is not possible + pub fn build(&mut self) -> Result<<#=this.commandName.GetTypeName(TargetLanguage.Rust, "response")#>, <#=this.commandName.GetTypeName(TargetLanguage.Rust, "response", "builder", "error")#>> { +<# if (this.respSchema == null) { #> + self.inner_builder.payload(<#=this.serializerEmptyType.GetAllocator(TargetLanguage.Rust)#>).unwrap(); + +<# } #> + self.inner_builder.build() + } +} + +/// Command Executor for `<#=this.commandName.AsGiven#>` +pub struct <#=this.componentName.GetTypeName(TargetLanguage.Rust)#>( + rpc_command::Executor<<#=this.RequestType()#>, <#=this.ResponseType()#>, C>, +) +where + C: ManagedClient + Clone + Send + Sync + 'static, + C::PubReceiver: Send + Sync + 'static; + +impl <#=this.componentName.GetTypeName(TargetLanguage.Rust)#> +where + C: ManagedClient + Clone + Send + Sync + 'static, + C::PubReceiver: Send + Sync + 'static, +{ + /// Creates a new [`<#=this.componentName.GetTypeName(TargetLanguage.Rust)#>`] + /// + /// # Panics + /// If the DTDL that generated this code was invalid + pub fn new(application_context: ApplicationContext, client: C, options: &CommandExecutorOptions) -> Self { + let mut executor_options_builder = rpc_command::executor::OptionsBuilder::default(); + if let Some(topic_namespace) = &options.topic_namespace { + executor_options_builder.topic_namespace(topic_namespace.clone()); + } + + let mut topic_token_map: HashMap = options + .topic_token_map + .clone() + .into_iter() + .map(|(k, v)| (format!("ex:{k}"), v)) + .collect(); + + topic_token_map.insert("modelId".to_string(), "<#=this.modelId#>".to_string()); + topic_token_map.insert("executorId".to_string(), client.client_id().to_string()); + topic_token_map.insert("commandName".to_string(), "<#=this.commandName.AsGiven#>".to_string()); + + let executor_options = executor_options_builder + .request_topic_pattern("<#=this.topicPattern#>") + .command_name("<#=this.commandName.AsGiven#>") + .is_idempotent(<#=this.isIdempotent ? "true" : "false"#>) + .topic_token_map(topic_token_map) +<# if (this.serviceGroupId != null) { #> + .service_group_id("<#=this.serviceGroupId#>".to_string()) +<# } #> + .build() + .expect("DTDL schema generated invalid arguments"); + + Self( + rpc_command::Executor::new(application_context, client, executor_options) + .expect("DTDL schema generated invalid arguments"), + ) + } + + /// Receive the next [`<#=this.commandName.GetTypeName(TargetLanguage.Rust, "request")#>`] or [`None`] if there will be no more requests + /// + /// # Errors + /// [`AIOProtocolError`] if there is a failure receiving a request + pub async fn recv(&mut self) -> Option, AIOProtocolError>> { + self.0.recv().await + } + + /// Shutdown the [`<#=this.componentName.GetTypeName(TargetLanguage.Rust)#>`]. Unsubscribes from the request topic. + /// + /// Returns Ok(()) on success, otherwise returns [`AIOProtocolError`]. + /// # Errors + /// [`AIOProtocolError`] of kind [`ClientError`](azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolErrorKind::ClientError) if the unsubscribe fails or if the unsuback reason code doesn't indicate success. + pub async fn shutdown(&mut self) -> Result<(), AIOProtocolError> { + self.0.shutdown().await + } +} +<#+ + private string RequestType() => this.reqSchema?.GetTypeName(TargetLanguage.Rust) ?? this.serializerEmptyType.GetTypeName(TargetLanguage.Rust); + + private string ResponseType() => this.respSchema?.GetTypeName(TargetLanguage.Rust) ?? this.serializerEmptyType.GetTypeName(TargetLanguage.Rust); + + private string CondSome(string expr, bool doWrap) => doWrap ? $"Some({expr})" : expr; +#> diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutorHeaders.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutorHeaders.tt new file mode 100644 index 0000000000..b091b416d3 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutorHeaders.tt @@ -0,0 +1,39 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="System.Collections.Generic" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ + +use azure_iot_operations_mqtt::interface::ManagedClient; +use serde_json; + +use super::<#=this.errorCodeSchema.GetFileName(TargetLanguage.Rust)#>::<#=this.errorCodeSchema.GetTypeName(TargetLanguage.Rust)#>; +<# if (this.errorInfoSchema != null) { #> +use super::<#=this.errorInfoSchema.GetFileName(TargetLanguage.Rust)#>::<#=this.errorInfoSchema.GetTypeName(TargetLanguage.Rust)#>; +<# } #> +pub use super::<#=this.componentName.GetFileName(TargetLanguage.Rust)#>::<#=this.componentName.GetTypeName(TargetLanguage.Rust)#>; + +use azure_iot_operations_protocol::rpc_command::executor; + +impl <#=this.componentName.GetTypeName(TargetLanguage.Rust)#> +where + C: ManagedClient + Clone + Send + Sync + 'static, + C::PubReceiver: Send + Sync + 'static, +{ + pub fn application_error_headers( + custom_user_data: &mut Vec<(String, String)>, + <#=this.errorCodeName.GetVariableName(TargetLanguage.Rust)#>: <#=this.errorCodeSchema.GetTypeName(TargetLanguage.Rust)#>, + <#=this.errorInfoName?.GetVariableName(TargetLanguage.Rust) ?? "error_payload"#>: <#=this.errorInfoSchema?.GetTypeName(TargetLanguage.Rust) ?? "String"#>, + ) -> Result<(), String> { + let error_code = match <#=this.errorCodeName.GetVariableName(TargetLanguage.Rust)#> { +<# foreach (string codeValue in this.errorCodeValues) { #> + <#=this.errorCodeSchema.GetTypeName(TargetLanguage.Rust)#>::<#=codeValue#> => "<#=codeValue#>".to_string(), +<# } #> + }; + +<# if (this.errorInfoSchema != null) { #> + let error_payload = serde_json::to_string(&<#=this.errorInfoName.GetVariableName(TargetLanguage.Rust)#>).unwrap_or_default(); + +<# } #> + executor::application_error_headers(custom_user_data, error_code, error_payload) + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.tt new file mode 100644 index 0000000000..b62fc8880f --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.tt @@ -0,0 +1,264 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="System.Linq" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ + +use std::collections::HashMap; +<# if (this.errorResultName != null) { #> +use std::error::Error; +<# } #> +use std::time::Duration; + +use azure_iot_operations_mqtt::interface::ManagedClient; +use azure_iot_operations_protocol::application::ApplicationContext; +use azure_iot_operations_protocol::common::aio_protocol_error::{ + AIOProtocolError, +<# if (this.errorResultName != null) { #> + AIOProtocolErrorKind, +<# } #> +}; +<# if (this.reqSchema != null) { #> +use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; +<# } #> +use azure_iot_operations_protocol::rpc_command; + +<# if (this.reqSchema is CustomTypeName || this.respSchema is CustomTypeName) { #> +use super::super::common_types::custom_payload::CustomPayload; +<# } #> +<# if (this.reqSchema == null || this.respSchema == null) { #> +use super::super::common_types::<#=this.serializerEmptyType.GetFileName(TargetLanguage.Rust)#>::<#=this.serializerEmptyType.GetTypeName(TargetLanguage.Rust)#>; +<# } #> +use super::super::common_types::options::CommandInvokerOptions; +<# if (this.reqSchema is CodeName) { #> +use super::<#=this.reqSchema.GetFileName(TargetLanguage.Rust)#>::<#=this.reqSchema.GetTypeName(TargetLanguage.Rust)#>; +<# } #> +<# if (this.respSchema is CodeName) { #> +use super::<#=this.respSchema.GetFileName(TargetLanguage.Rust)#>::<#=this.respSchema.GetTypeName(TargetLanguage.Rust)#>; +<# } #> +<# if (this.errorResultName != null) { #> +use super::<#=this.normalResultSchema.GetFileName(TargetLanguage.Rust)#>::<#=this.normalResultSchema.GetTypeName(TargetLanguage.Rust)#>; +use super::<#=this.errorResultSchema.GetFileName(TargetLanguage.Rust)#>::<#=this.errorResultSchema.GetTypeName(TargetLanguage.Rust)#>; +<# } #> + +pub type <#=this.commandName.GetTypeName(TargetLanguage.Rust, "request")#> = rpc_command::invoker::Request<<#=this.RequestType()#>>; +pub type <#=this.commandName.GetTypeName(TargetLanguage.Rust, "response")#> = rpc_command::invoker::Response<<#=this.InternalResponseType()#>>; +<# if (this.errorResultSchema != null) { #> +pub type <#=this.commandName.GetTypeName(TargetLanguage.Rust, "response", "error")#> = rpc_command::invoker::Response<<#=this.errorResultSchema.GetTypeName(TargetLanguage.Rust)#>>; +<# } #> +pub type <#=this.commandName.GetTypeName(TargetLanguage.Rust, "request", "builder", "error")#> = rpc_command::invoker::RequestBuilderError; + +#[derive(Default)] +/// Builder for [`<#=this.commandName.GetTypeName(TargetLanguage.Rust, "request")#>`] +pub struct <#=this.commandName.GetTypeName(TargetLanguage.Rust, "request", "builder")#> { + inner_builder: rpc_command::invoker::RequestBuilder<<#=this.RequestType()#>>, +<# if (this.doesCommandTargetExecutor) { #> + set_executor_id: bool, +<# } #> + topic_tokens: HashMap, +} + +impl <#=this.commandName.GetTypeName(TargetLanguage.Rust, "request", "builder")#> { + /// Custom user data to set on the request + pub fn custom_user_data(&mut self, custom_user_data: Vec<(String, String)>) -> &mut Self { + self.inner_builder.custom_user_data(custom_user_data); + self + } + + /// Topic token keys/values to be replaced into the publish topic of the request message. + /// A prefix of "ex:" will be prepended to each key before scanning the topic pattern. + /// Thus, only tokens of the form `{ex:SOMEKEY}` will be replaced. + pub fn topic_tokens(&mut self, topic_tokens: HashMap) -> &mut Self { + for (k, v) in topic_tokens { + self.topic_tokens.insert(format!("ex:{k}"), v); + } + self + } + + /// Timeout for the request + pub fn timeout(&mut self, timeout: Duration) -> &mut Self { + self.inner_builder.timeout(timeout); + self + } + +<# if (this.doesCommandTargetExecutor) { #> + /// Target executor ID + pub fn executor_id(&mut self, executor_id: &str) -> &mut Self { + self.topic_tokens + .insert("executorId".to_string(), executor_id.to_string()); + self.set_executor_id = true; + self + } + +<# } #> +<# if (this.reqSchema != null) { #> + /// Payload of the request + /// + /// # Errors + /// If the payload cannot be serialized + pub fn payload( + &mut self, + payload: <#=this.reqSchema.GetTypeName(TargetLanguage.Rust)#>, + ) -> Result<&mut Self, AIOProtocolError> { + self.inner_builder.payload(payload)?; + Ok(self) + } + +<# } #> + /// Builds a new `<#=this.commandName.GetTypeName(TargetLanguage.Rust, "request")#>` + /// + /// # Errors + /// If a required field has not been initialized + #[allow(clippy::missing_panics_doc)] // The panic is not possible + pub fn build(&mut self) -> Result<<#=this.commandName.GetTypeName(TargetLanguage.Rust, "request")#>, <#=this.commandName.GetTypeName(TargetLanguage.Rust, "request", "builder", "error")#>> { +<# if (this.doesCommandTargetExecutor) { #> + if !self.set_executor_id { + return Err(<#=this.commandName.GetTypeName(TargetLanguage.Rust, "request", "builder", "error")#>::UninitializedField( + "executor_id", + )); + } + +<# } #> +<# if (this.reqSchema == null) { #> + self.inner_builder.payload(<#=this.serializerEmptyType.GetAllocator(TargetLanguage.Rust)#>).unwrap(); + +<# } #> + self.inner_builder.topic_tokens(self.topic_tokens.clone()); + + self.inner_builder.build() + } +} + +/// Command Invoker for `<#=this.commandName.AsGiven#>` +pub struct <#=this.componentName.GetTypeName(TargetLanguage.Rust)#>( + rpc_command::Invoker<<#=this.RequestType()#>, <#=this.ExternalResponseType()#>, C>, +) +where + C: ManagedClient + Clone + Send + Sync + 'static, + C::PubReceiver: Send + Sync + 'static; + +impl <#=this.componentName.GetTypeName(TargetLanguage.Rust)#> +where + C: ManagedClient + Clone + Send + Sync + 'static, + C::PubReceiver: Send + Sync + 'static, +{ + /// Creates a new [`<#=this.componentName.GetTypeName(TargetLanguage.Rust)#>`] + /// + /// # Panics + /// If the DTDL that generated this code was invalid + pub fn new(application_context: ApplicationContext, client: C, options: &CommandInvokerOptions) -> Self { + let mut invoker_options_builder = rpc_command::invoker::OptionsBuilder::default(); + if let Some(topic_namespace) = &options.topic_namespace { + invoker_options_builder.topic_namespace(topic_namespace.clone()); + } + + let mut topic_token_map: HashMap = options + .topic_token_map + .clone() + .into_iter() + .map(|(k, v)| (format!("ex:{k}"), v)) + .collect(); + + topic_token_map.insert("modelId".to_string(), "<#=this.modelId#>".to_string()); + topic_token_map.insert("invokerClientId".to_string(), client.client_id().to_string()); + topic_token_map.insert("commandName".to_string(), "<#=this.commandName.AsGiven#>".to_string()); + + let invoker_options = invoker_options_builder + .request_topic_pattern("<#=this.topicPattern#>") + .command_name("<#=this.commandName.AsGiven#>") + .topic_token_map(topic_token_map) + .response_topic_prefix(options.response_topic_prefix.clone()) + .response_topic_suffix(options.response_topic_suffix.clone()) + .build() + .expect("DTDL schema generated invalid arguments"); + + Self( + rpc_command::Invoker::new(application_context, client, invoker_options) + .expect("DTDL schema generated invalid arguments"), + ) + } + + /// Invokes the [`<#=this.commandName.GetTypeName(TargetLanguage.Rust, "request")#>`] + /// + /// # Errors + /// [`AIOProtocolError`] if there is a failure invoking the request + pub async fn invoke( + &self, + request: <#=this.commandName.GetTypeName(TargetLanguage.Rust, "request")#>, +<# if (this.errorResultName != null) { #> + ) -> Result, <#=this.commandName.GetTypeName(TargetLanguage.Rust, "response", "error")#>>, AIOProtocolError> { + let response = self.0.invoke(request).await; + match response { + Ok(response) => { + if let Some(<#=this.errorResultName.GetVariableName(TargetLanguage.Rust)#>) = response.payload.<#=this.errorResultName.GetFieldName(TargetLanguage.Rust)#> { + Ok(Err(<#=this.commandName.GetTypeName(TargetLanguage.Rust, "response", "error")#> { + payload: <#=this.errorResultName.GetVariableName(TargetLanguage.Rust)#>, + content_type: response.content_type, + format_indicator: response.format_indicator, + custom_user_data: response.custom_user_data, + timestamp: response.timestamp, + executor_id: response.executor_id, + })) + } else { + Ok(Ok(<#=this.commandName.GetTypeName(TargetLanguage.Rust, "response")#> { + payload: <#=this.normalResultSchema.GetTypeName(TargetLanguage.Rust)#> { +<# foreach (CodeName normalResultField in this.normalResultFields) { #> +<# if (this.normalRequiredFields.Contains(normalResultField)) { #> + <#=normalResultField.GetFieldName(TargetLanguage.Rust)#>: response.payload.<#=normalResultField.GetFieldName(TargetLanguage.Rust)#>.ok_or(<#=this.componentName.GetTypeName(TargetLanguage.Rust)#>::::get_err("<#=normalResultField.AsGiven#>"))?, +<# } else { #> + <#=normalResultField.GetFieldName(TargetLanguage.Rust)#>: response.payload.<#=normalResultField.GetFieldName(TargetLanguage.Rust)#>, +<# } #> +<# } #> + }, + content_type: response.content_type, + format_indicator: response.format_indicator, + custom_user_data: response.custom_user_data, + timestamp: response.timestamp, + executor_id: response.executor_id, + })) + } + } + Err(err) => Err(err), + } +<# } else { #> + ) -> Result<<#=this.commandName.GetTypeName(TargetLanguage.Rust, "response")#>, AIOProtocolError> { + self.0.invoke(request).await +<# } #> + } + + /// Shutdown the [`<#=this.componentName.GetTypeName(TargetLanguage.Rust)#>`]. Unsubscribes from the response topic and cancels the receiver loop to drop the receiver and to prevent the task from looping indefinitely. + /// + /// Returns Ok(()) on success, otherwise returns [`AIOProtocolError`]. + /// # Errors + /// [`AIOProtocolError`] of kind [`ClientError`](azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolErrorKind::ClientError) if the unsubscribe fails or if the unsuback reason code doesn't indicate success. + pub async fn shutdown(&self) -> Result<(), AIOProtocolError> { + self.0.shutdown().await + } +<# if (this.errorResultName != null && this.normalRequiredFields.Any()) { #> + + fn get_err(field_name: &str) -> AIOProtocolError { + AIOProtocolError { + message: Some(format!("Command response missing field {field_name}")), + kind: AIOProtocolErrorKind::PayloadInvalid, + is_shallow: false, + is_remote: false, + nested_error: None, + header_name: None, + header_value: None, + timeout_name: None, + timeout_value: None, + property_name: None, + property_value: None, + command_name: Some("<#=this.commandName.AsGiven#>".to_string()), + protocol_version: None, + supported_protocol_major_versions: None, + } + } +<# } #> +} +<#+ + private string RequestType() => this.reqSchema?.GetTypeName(TargetLanguage.Rust) ?? this.serializerEmptyType.GetTypeName(TargetLanguage.Rust); + + private string ExternalResponseType() => this.respSchema?.GetTypeName(TargetLanguage.Rust) ?? this.serializerEmptyType.GetTypeName(TargetLanguage.Rust); + + private string InternalResponseType() => (this.normalResultSchema ?? this.respSchema)?.GetTypeName(TargetLanguage.Rust) ?? this.serializerEmptyType.GetTypeName(TargetLanguage.Rust); +#> diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvokerHeaders.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvokerHeaders.tt new file mode 100644 index 0000000000..12bedb4f27 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvokerHeaders.tt @@ -0,0 +1,46 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="System.Collections.Generic" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ + +use azure_iot_operations_mqtt::interface::ManagedClient; +use serde_json; + +<# if (this.errorInfoSchema != null) { #> +use super::<#=this.errorInfoSchema.GetFileName(TargetLanguage.Rust)#>::<#=this.errorInfoSchema.GetTypeName(TargetLanguage.Rust)#>; +<# } #> +use super::<#=this.errorCodeSchema.GetFileName(TargetLanguage.Rust)#>::<#=this.errorCodeSchema.GetTypeName(TargetLanguage.Rust)#>; +pub use super::<#=this.componentName.GetFileName(TargetLanguage.Rust)#>::<#=this.componentName.GetTypeName(TargetLanguage.Rust)#>; + +use azure_iot_operations_protocol::rpc_command::invoker; + +impl <#=this.componentName.GetTypeName(TargetLanguage.Rust)#> +where + C: ManagedClient + Clone + Send + Sync + 'static, + C::PubReceiver: Send + Sync + 'static, +{ + pub fn application_error_headers( + custom_user_data: &Vec<(String, String)>, + ) -> (Option<<#=this.errorCodeSchema.GetTypeName(TargetLanguage.Rust)#>>, Option<<#=this.errorInfoSchema?.GetTypeName(TargetLanguage.Rust) ?? "String"#>>) { + let (error_code, error_payload) = invoker::application_error_headers(custom_user_data); + + let <#=this.errorCodeName.GetVariableName(TargetLanguage.Rust)#> = match error_code.as_deref() { +<# foreach (string codeValue in this.errorCodeValues) { #> + Some("<#=codeValue#>") => Some(<#=this.errorCodeSchema.GetTypeName(TargetLanguage.Rust)#>::<#=codeValue#>), +<# } #> + Some(_) => None, + None => None, + }; + +<# if (this.errorInfoSchema != null) { #> + let <#=this.errorInfoName.GetVariableName(TargetLanguage.Rust)#> = if let Some(error_payload) = error_payload { + serde_json::from_str::<<#=this.errorInfoSchema.GetTypeName(TargetLanguage.Rust)#>>(&error_payload).ok() + } else { + None + }; + +<# } #> + (<#=this.errorCodeName.GetVariableName(TargetLanguage.Rust)#>, <#=this.errorInfoName?.GetVariableName(TargetLanguage.Rust) ?? "error_payload"#>) + } +} + diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Constants/code/RustConstants.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Constants/code/RustConstants.cs new file mode 100644 index 0000000000..bf7d48cc35 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Constants/code/RustConstants.cs @@ -0,0 +1,38 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Collections.Generic; + using System.Globalization; + using System.IO; + using Azure.Iot.Operations.CodeGeneration; + + public partial class RustConstants : IEnvoyTemplateTransform + { + private readonly CodeName schemaName; + private readonly CodeName genNamespace; + private readonly List constants; + private readonly string srcSubdir; + + public RustConstants(CodeName schemaName, CodeName genNamespace, List constants, string srcSubdir) + { + this.schemaName = schemaName; + this.genNamespace = genNamespace; + this.constants = constants; + this.srcSubdir = srcSubdir; + } + + public string FileName { get => $"{this.schemaName.GetFileName(TargetLanguage.Rust)}.rs"; } + + public string FolderPath { get => Path.Combine(this.srcSubdir, this.genNamespace.GetFolderName(TargetLanguage.Rust)); } + + private static string GetRustType(string type) + { + return type switch + { + TDValues.TypeString => "&str", + TDValues.TypeNumber => "f64", + TDValues.TypeInteger => "i32", + _ => throw new System.ArgumentException($"Unsupported constant type: {type}"), + }; + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Constants/t4/RustConstants.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Constants/t4/RustConstants.tt new file mode 100644 index 0000000000..900d69a7a6 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Constants/t4/RustConstants.tt @@ -0,0 +1,10 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ +<# foreach (TypedConstant constant in this.constants) { #> + +<# if (constant.Description != null) { #> +/// <#=constant.Description#> +<# } #> +pub const <#=constant.Name.GetConstantName(TargetLanguage.Rust)#>: <#=GetRustType(constant.Type)#> = <#=constant.Type == TDValues.TypeString ? $"\"{constant.Value}\"" : $"{constant.Value}"#>; +<# } #> diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Error/code/RustAggregateError.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Error/code/RustAggregateError.cs new file mode 100644 index 0000000000..bff71f6c90 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Error/code/RustAggregateError.cs @@ -0,0 +1,26 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Collections.Generic; + using System.IO; + using Azure.Iot.Operations.CodeGeneration; + + public partial class RustAggregateError : IEnvoyTemplateTransform + { + private readonly CodeName schemaName; + private readonly CodeName genNamespace; + private readonly List<(CodeName, CodeName)> innerNameSchemas; + private readonly string srcSubdir; + + public RustAggregateError(CodeName schemaName, CodeName genNamespace, List<(CodeName, CodeName)> innerNameSchemas, string srcSubdir) + { + this.schemaName = schemaName; + this.genNamespace = genNamespace; + this.innerNameSchemas = innerNameSchemas; + this.srcSubdir = srcSubdir; + } + + public string FileName { get => $"{this.schemaName.GetFileName(TargetLanguage.Rust, "error")}.rs"; } + + public string FolderPath { get => Path.Combine(this.srcSubdir, this.genNamespace.GetFolderName(TargetLanguage.Rust)); } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Error/code/RustError.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Error/code/RustError.cs new file mode 100644 index 0000000000..3a69b7edeb --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Error/code/RustError.cs @@ -0,0 +1,29 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.IO; + using Azure.Iot.Operations.CodeGeneration; + + public partial class RustError : IEnvoyTemplateTransform + { + private readonly CodeName schemaName; + private readonly CodeName genNamespace; + private readonly string description; + private readonly CodeName? messageField; + private readonly bool messageIsRequired; + private readonly string srcSubdir; + + public RustError(CodeName schemaName, CodeName genNamespace, string description, CodeName? messageField, bool messageIsRequired, string srcSubdir) + { + this.schemaName = schemaName; + this.genNamespace = genNamespace; + this.description = description; + this.messageField = messageField; + this.messageIsRequired = messageIsRequired; + this.srcSubdir = srcSubdir; + } + + public string FileName { get => $"{this.schemaName.GetFileName(TargetLanguage.Rust, "error")}.rs"; } + + public string FolderPath { get => Path.Combine(this.srcSubdir, this.genNamespace.GetFolderName(TargetLanguage.Rust)); } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Error/t4/RustAggregateError.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Error/t4/RustAggregateError.tt new file mode 100644 index 0000000000..f7212e7d72 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Error/t4/RustAggregateError.tt @@ -0,0 +1,41 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ + +use std::error::Error; +use std::fmt; + +use super::<#=this.schemaName.GetFileName(TargetLanguage.Rust)#>::<#=this.schemaName.GetTypeName(TargetLanguage.Rust)#>; + +impl fmt::Display for <#=this.schemaName.GetTypeName(TargetLanguage.Rust)#> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let mut err_count = 0; + +<# foreach (var innerNameSchema in this.innerNameSchemas) { #> + + if let Some(<#=innerNameSchema.Item1.GetFieldName(TargetLanguage.Rust)#>) = &self.<#=innerNameSchema.Item1.GetFieldName(TargetLanguage.Rust)#> { + if err_count == 0 { + return write!(f, "{<#=innerNameSchema.Item1.GetFieldName(TargetLanguage.Rust)#>}"); + } + err_count += 1; + } +<# } #> + + // Error display message depends on how many specific errors are reported within the aggregate error. + // If there are none, the aggregate error must have been caused by one or more non-reportable errors. + // If there is exactly one, it has already been displayed. + // If there are two or more, only the first reported error has been displayed, so indicate how many more there are. + match err_count{ + 0 => write!(f, "No reportable property errors."), + 1 => Ok(()), + 2 => write!(f, "(And 1 more reported error.)"), + _ => write!(f, "(And {} more reported errors.)", err_count - 1), + } + } +} + +impl Error for <#=this.schemaName.GetTypeName(TargetLanguage.Rust)#> { + fn source(&self) -> Option<&(dyn Error + 'static)> { + None + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Error/t4/RustError.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Error/t4/RustError.tt new file mode 100644 index 0000000000..ed685fb405 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Error/t4/RustError.tt @@ -0,0 +1,32 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ + +use std::error::Error; +use std::fmt; + +use super::<#=this.schemaName.GetFileName(TargetLanguage.Rust)#>::<#=this.schemaName.GetTypeName(TargetLanguage.Rust)#>; + +impl fmt::Display for <#=this.schemaName.GetTypeName(TargetLanguage.Rust)#> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { +<# if (this.messageField != null) { #> +<# if (this.messageIsRequired) { #> + write!(f, "{}", self.<#=this.messageField.GetFieldName(TargetLanguage.Rust)#>) +<# } else { #> + if let Some(message) = &self.<#=this.messageField.GetFieldName(TargetLanguage.Rust)#> { + write!(f, "{message}") + } else { + write!(f, "<#=this.description#>") + } +<# } #> +<# } else { #> + write!(f, "<#=this.description#>") +<# } #> + } +} + +impl Error for <#=this.schemaName.GetTypeName(TargetLanguage.Rust)#> { + fn source(&self) -> Option<&(dyn Error + 'static)> { + None + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/code/RustTelemetryReceiver.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/code/RustTelemetryReceiver.cs new file mode 100644 index 0000000000..b0a42c6c69 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/code/RustTelemetryReceiver.cs @@ -0,0 +1,35 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.IO; + using Azure.Iot.Operations.CodeGeneration; + + public partial class RustTelemetryReceiver : IEnvoyTemplateTransform + { + private readonly CodeName telemetryName; + private readonly CodeName componentName; + private readonly CodeName genNamespace; + private readonly string modelId; + private readonly ITypeName schemaType; + private readonly CodeName messageName; + private readonly string? serviceGroupId; + private readonly string topicPattern; + private readonly string srcSubdir; + + public RustTelemetryReceiver(string telemetryName, string componentName, CodeName genNamespace, string modelId, ITypeName schemaType, string? serviceGroupId, string topicPattern, string srcSubdir) + { + this.telemetryName = new CodeName(telemetryName); + this.componentName = new CodeName(componentName); + this.genNamespace = genNamespace; + this.modelId = modelId; + this.schemaType = schemaType; + this.messageName = new CodeName(this.telemetryName, "message"); + this.serviceGroupId = serviceGroupId; + this.topicPattern = topicPattern; + this.srcSubdir = srcSubdir; + } + + public string FileName { get => $"{this.componentName.GetFileName(TargetLanguage.Rust)}.rs"; } + + public string FolderPath { get => Path.Combine(this.srcSubdir, this.genNamespace.GetFolderName(TargetLanguage.Rust)); } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/code/RustTelemetrySender.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/code/RustTelemetrySender.cs new file mode 100644 index 0000000000..5184f66ec4 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/code/RustTelemetrySender.cs @@ -0,0 +1,33 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.IO; + using Azure.Iot.Operations.CodeGeneration; + + public partial class RustTelemetrySender : IEnvoyTemplateTransform + { + private readonly CodeName telemetryName; + private readonly CodeName componentName; + private readonly CodeName genNamespace; + private readonly string modelId; + private readonly ITypeName schemaType; + private readonly string topicPattern; + private readonly CodeName messageName; + private readonly string srcSubdir; + + public RustTelemetrySender(string telemetryName, string componentName, CodeName genNamespace, string modelId, ITypeName schemaType, string topicPattern, string srcSubdir) + { + this.telemetryName = new CodeName(telemetryName); + this.componentName = new CodeName(componentName); + this.genNamespace = genNamespace; + this.modelId = modelId; + this.schemaType = schemaType; + this.topicPattern = topicPattern; + this.messageName = new CodeName(this.telemetryName, "message"); + this.srcSubdir = srcSubdir; + } + + public string FileName { get => $"{this.componentName.GetFileName(TargetLanguage.Rust)}.rs"; } + + public string FolderPath { get => Path.Combine(this.srcSubdir, this.genNamespace.GetFolderName(TargetLanguage.Rust)); } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.tt new file mode 100644 index 0000000000..03ca52a400 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.tt @@ -0,0 +1,90 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ + +use std::collections::HashMap; + +use azure_iot_operations_mqtt::interface::{AckToken, ManagedClient}; +use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; +use azure_iot_operations_protocol::telemetry; +use azure_iot_operations_protocol::application::ApplicationContext; + +<# if (this.schemaType is CodeName) { #> +use super::<#=this.schemaType.GetFileName(TargetLanguage.Rust)#>::<#=this.schemaType.GetTypeName(TargetLanguage.Rust)#>; +<# } #> +<# if (this.schemaType is CustomTypeName) { #> +use super::super::common_types::custom_payload::CustomPayload; +<# } #> +use super::super::common_types::options::TelemetryReceiverOptions; + +pub type <#=this.messageName.GetTypeName(TargetLanguage.Rust)#> = telemetry::receiver::Message<<#=this.schemaType.GetTypeName(TargetLanguage.Rust)#>>; + +/// Telemetry Receiver for `<#=this.schemaType.GetTypeName(TargetLanguage.Rust)#>` +pub struct <#=this.componentName.GetTypeName(TargetLanguage.Rust)#>( + telemetry::Receiver<<#=this.schemaType.GetTypeName(TargetLanguage.Rust)#>, C>, +) +where + C: ManagedClient + Clone + Send + Sync + 'static, + C::PubReceiver: Send + Sync + 'static; + +impl <#=this.componentName.GetTypeName(TargetLanguage.Rust)#> +where + C: ManagedClient + Clone + Send + Sync + 'static, + C::PubReceiver: Send + Sync + 'static, +{ + /// Creates a new [`<#=this.componentName.GetTypeName(TargetLanguage.Rust)#>`] + /// + /// # Panics + /// If the DTDL that generated this code was invalid + pub fn new(application_context: ApplicationContext, client: C, options: &TelemetryReceiverOptions) -> Self { + let mut receiver_options_builder = telemetry::receiver::OptionsBuilder::default(); + if let Some(topic_namespace) = &options.topic_namespace { + receiver_options_builder.topic_namespace(topic_namespace.clone()); + } + + let mut topic_token_map: HashMap = options + .topic_token_map + .clone() + .into_iter() + .map(|(k, v)| (format!("ex:{k}"), v)) + .collect(); + + topic_token_map.insert("modelId".to_string(), "<#=this.modelId#>".to_string()); +<# if (!this.telemetryName.IsEmpty) { #> + topic_token_map.insert("telemetryName".to_string(), "<#=this.telemetryName.AsGiven#>".to_string()); +<# } #> + + let receiver_options = receiver_options_builder + .topic_pattern("<#=this.topicPattern#>") + .topic_token_map(topic_token_map) + .auto_ack(options.auto_ack) +<# if (this.serviceGroupId != null) { #> + .service_group_id("<#=this.serviceGroupId#>".to_string()) +<# } #> + .build() + .expect("DTDL schema generated invalid arguments"); + + Self( + telemetry::Receiver::new(application_context, client, receiver_options) + .expect("DTDL schema generated invalid arguments"), + ) + } + + /// Shut down the [`<#=this.componentName.GetTypeName(TargetLanguage.Rust)#>`] + /// + /// # Errors + /// [`AIOProtocolError`] if there is a failure in graceful shutdown + pub async fn shutdown(&mut self) -> Result<(), AIOProtocolError> { + self.0.shutdown().await + } + + /// Receive the next [`<#=this.messageName.GetTypeName(TargetLanguage.Rust)#>`] + /// + /// # Errors + /// [`AIOProtocolError`] if there is a failure receiving a message + pub async fn recv( + &mut self, + ) -> Option, Option), AIOProtocolError>> { + self.0.recv().await + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.tt new file mode 100644 index 0000000000..58e6ecb476 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.tt @@ -0,0 +1,145 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ + +use std::collections::HashMap; +use std::time::Duration; + +use azure_iot_operations_mqtt::control_packet::QoS; +use azure_iot_operations_mqtt::interface::ManagedClient; +use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; +use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; +use azure_iot_operations_protocol::telemetry; +use azure_iot_operations_protocol::application::ApplicationContext; + +<# if (this.schemaType is CodeName) { #> +use super::<#=this.schemaType.GetFileName(TargetLanguage.Rust)#>::<#=this.schemaType.GetTypeName(TargetLanguage.Rust)#>; +<# } #> +<# if (this.schemaType is CustomTypeName) { #> +use super::super::common_types::custom_payload::CustomPayload; +<# } #> +use super::super::common_types::options::TelemetrySenderOptions; + +pub type <#=this.messageName.GetTypeName(TargetLanguage.Rust)#> = telemetry::sender::Message<<#=this.schemaType.GetTypeName(TargetLanguage.Rust)#>>; +pub type <#=this.messageName.GetTypeName(TargetLanguage.Rust)#>BuilderError = telemetry::sender::MessageBuilderError; + +/// Builder for [`<#=this.messageName.GetTypeName(TargetLanguage.Rust)#>`] +#[derive(Default)] +pub struct <#=this.messageName.GetTypeName(TargetLanguage.Rust)#>Builder { + inner_builder: telemetry::sender::MessageBuilder<<#=this.schemaType.GetTypeName(TargetLanguage.Rust)#>>, + topic_tokens: HashMap, +} + +impl <#=this.messageName.GetTypeName(TargetLanguage.Rust)#>Builder { + /// Quality of Service of the telemetry message. Can only be `AtMostOnce` or `AtLeastOnce`. + pub fn qos(&mut self, qos: QoS) -> &mut Self { + self.inner_builder.qos(qos); + self + } + + /// Custom user data to set on the message + pub fn custom_user_data(&mut self, custom_user_data: Vec<(String, String)>) -> &mut Self { + self.inner_builder.custom_user_data(custom_user_data); + self + } + + /// Topic token keys/values to be replaced into the publish topic of the telemetry message. + /// A prefix of "ex:" will be prepended to each key before scanning the topic pattern. + /// Thus, only tokens of the form `{ex:SOMEKEY}` will be replaced. + pub fn topic_tokens(&mut self, topic_tokens: HashMap) -> &mut Self { + for (k, v) in topic_tokens { + self.topic_tokens.insert(format!("ex:{k}"), v); + } + self + } + + /// Time before message expires + pub fn message_expiry(&mut self, message_expiry: Duration) -> &mut Self { + self.inner_builder.message_expiry(message_expiry); + self + } + + /// Cloud event for the message + pub fn cloud_event(&mut self, cloud_event: Option) -> &mut Self { + self.inner_builder.cloud_event(cloud_event); + self + } + + /// Payload of the message + /// + /// # Errors + /// If the payload cannot be serialized + pub fn payload( + &mut self, + payload: <#=this.schemaType.GetTypeName(TargetLanguage.Rust)#>, + ) -> Result<&mut Self, AIOProtocolError> { + self.inner_builder.payload(payload)?; + Ok(self) + } + + /// Builds a new `<#=this.messageName.GetTypeName(TargetLanguage.Rust)#>` + /// + /// # Errors + /// If a required field has not been initialized + pub fn build(&mut self) -> Result<<#=this.messageName.GetTypeName(TargetLanguage.Rust)#>, <#=this.messageName.GetTypeName(TargetLanguage.Rust)#>BuilderError> { + self.inner_builder.topic_tokens(self.topic_tokens.clone()); + + self.inner_builder.build() + } +} + +/// Telemetry Sender for `<#=this.schemaType.GetTypeName(TargetLanguage.Rust)#>` +pub struct <#=this.componentName.GetTypeName(TargetLanguage.Rust)#>( + telemetry::Sender<<#=this.schemaType.GetTypeName(TargetLanguage.Rust)#>, C>, +) +where + C: ManagedClient + Send + Sync + 'static; + +impl <#=this.componentName.GetTypeName(TargetLanguage.Rust)#> +where + C: ManagedClient + Send + Sync + 'static, +{ + /// Creates a new [`<#=this.componentName.GetTypeName(TargetLanguage.Rust)#>`] + /// + /// # Panics + /// If the DTDL that generated this code was invalid + pub fn new(application_context: ApplicationContext, client: C, options: &TelemetrySenderOptions) -> Self { + let mut sender_options_builder = telemetry::sender::OptionsBuilder::default(); + if let Some(topic_namespace) = &options.topic_namespace { + sender_options_builder.topic_namespace(topic_namespace.clone()); + } + + let mut topic_token_map: HashMap = options + .topic_token_map + .clone() + .into_iter() + .map(|(k, v)| (format!("ex:{k}"), v)) + .collect(); + + topic_token_map.insert("modelId".to_string(), "<#=this.modelId#>".to_string()); + topic_token_map.insert("senderId".to_string(), client.client_id().to_string()); + +<# if (!this.telemetryName.IsEmpty) { #> + topic_token_map.insert("telemetryName".to_string(), "<#=this.telemetryName.AsGiven#>".to_string()); +<# } #> + + let sender_options = sender_options_builder + .topic_pattern("<#=this.topicPattern#>") + .topic_token_map(topic_token_map) + .build() + .expect("DTDL schema generated invalid arguments"); + + Self( + telemetry::Sender::new(application_context, client, sender_options) + .expect("DTDL schema generated invalid arguments"), + ) + } + + /// Sends a [`<#=this.messageName.GetTypeName(TargetLanguage.Rust)#>`] + /// + /// # Error + /// [`AIOProtocolError`] if there is a failure sending the message + pub async fn send(&self, message: <#=this.messageName.GetTypeName(TargetLanguage.Rust)#>) -> Result<(), AIOProtocolError> { + self.0.send(message).await + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/code/RustCargoToml.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/code/RustCargoToml.cs new file mode 100644 index 0000000000..539051e047 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/code/RustCargoToml.cs @@ -0,0 +1,33 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Collections.Generic; + using System.Linq; + using Azure.Iot.Operations.CodeGeneration; + + public partial class RustCargoToml : IEnvoyTemplateTransform + { + internal static readonly Dictionary> serializerPackageVersions = new() + { + { SerializationFormat.Json, new List<(string, string)> { ("serde_json", "1.0.105") } }, + }; + + private readonly bool generateProject; + private readonly string projectName; + private readonly string? sdkPath; + private readonly List<(string, string)> packageVersions; + private readonly string srcSubdir; + + public RustCargoToml(string projectName, List genFormats, string? sdkPath, bool generateProject, string srcSubdir) + { + this.generateProject = generateProject; + this.projectName = projectName; + this.sdkPath = sdkPath?.Replace('\\', '/'); + this.srcSubdir = srcSubdir; + packageVersions = genFormats.Select(f => serializerPackageVersions[f]).SelectMany(pv => pv).Distinct().ToList(); + } + + public string FileName { get => generateProject ? "Cargo.toml" : "dependencies.md"; } + + public string FolderPath { get => this.generateProject ? string.Empty : this.srcSubdir; } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/code/RustIndex.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/code/RustIndex.cs new file mode 100644 index 0000000000..104589a669 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/code/RustIndex.cs @@ -0,0 +1,34 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Collections.Generic; + using System.IO; + using System.Linq; + using Azure.Iot.Operations.CodeGeneration; + + public partial class RustIndex : IEnvoyTemplateTransform + { + private readonly CodeName genNamespace; + private readonly bool generateClient; + private readonly bool generateServer; + private readonly List modules; + private readonly string srcSubdir; + + public RustIndex( + CodeName genNamespace, + List envoyFilenames, + bool generateClient, + bool generateServer, + string srcSubdir) + { + this.genNamespace = genNamespace; + this.generateClient = generateClient; + this.generateServer = generateServer; + this.srcSubdir = srcSubdir; + this.modules = envoyFilenames.Select(f => Path.GetFileNameWithoutExtension(f)).Order().ToList(); + } + + public string FileName { get => $"{this.genNamespace.GetFolderName(TargetLanguage.Rust)}.rs"; } + + public string FolderPath { get => this.srcSubdir; } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/code/RustLib.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/code/RustLib.cs new file mode 100644 index 0000000000..571e31dabc --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/code/RustLib.cs @@ -0,0 +1,25 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Collections.Generic; + using System.IO; + using Azure.Iot.Operations.CodeGeneration; + + public partial class RustLib : IEnvoyTemplateTransform + { + private readonly bool generateProject; + private readonly List modules; + private readonly string srcSubdir; + + public RustLib(CodeName genNamespace, bool generateProject, string srcSubdir) + { + this.generateProject = generateProject; + this.srcSubdir = srcSubdir; + this.modules = new List { "common_types", genNamespace.GetFolderName(TargetLanguage.Rust) }; + this.modules.Sort(); + } + + public string FileName { get => this.generateProject ? "lib.rs" : "mod.rs"; } + + public string FolderPath { get => this.srcSubdir; } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustCargoToml.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustCargoToml.tt new file mode 100644 index 0000000000..a2f53295f6 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustCargoToml.tt @@ -0,0 +1,43 @@ +<#@ template language="C#" linePragmas="false" #> +<# if (this.generateProject) { #> +# Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. + +[package] +name = "<#=this.projectName#>" +version = "0.1.0" +edition = "2024" + +<# } else { #> +# Dependencies for the Generated Libraries + +Add these dependencies to your project's `Cargo.toml` file: + +``` toml +<# } #> +[dependencies] +serde = { version = "1.0", features = ["derive"] } +serde_bytes = "0.11.15" +serde_repr = "0.1" +<# foreach (var packageVersion in this.packageVersions) { #> +<#=packageVersion.Item1#> = "<#=packageVersion.Item2#>" +<# } #> +chrono = { version = "0.4.31", features = ["serde", "alloc"] } +iso8601-duration = { version = "0.2", features = ["serde", "chrono"] } +base64 = "0.22.1" +bigdecimal = "0.4.5" +time = { version = "0.3", features = ["serde", "formatting", "parsing"] } +uuid = { version = "1.8.0", features = ["serde", "v4"] } +derive_builder = "0.20" +<# if (this.sdkPath != null) { #> +azure_iot_operations_mqtt = { <#=this.IfLocal("path", "git")#> = "<#=this.sdkPath#><#=this.IfLocal("/azure_iot_operations_mqtt")#>" } +azure_iot_operations_protocol = { <#=this.IfLocal("path", "git")#> = "<#=this.sdkPath#><#=this.IfLocal("/azure_iot_operations_protocol")#>" } +<# } else { #> +azure_iot_operations_mqtt = { version = "0.11.0", registry = "aio-sdks" } +azure_iot_operations_protocol = { version = "0.12.0", registry = "aio-sdks" } +<# } #> +<# if (!this.generateProject) { #> +``` +<# } #> +<#+ +string IfLocal(string ifText, string elseText = "") => !this.sdkPath.StartsWith("http://") && !this.sdkPath.StartsWith("https://") ? ifText : elseText; +#> diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustIndex.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustIndex.tt new file mode 100644 index 0000000000..de3c8f848f --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustIndex.tt @@ -0,0 +1,33 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="System.IO" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ + +<# foreach (string module in this.modules) { #> +mod <#=Path.GetFileNameWithoutExtension(module)#>; +<# } #> + +pub use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; + +<# if (this.generateServer) { #> +pub use super::common_types::options::{CommandExecutorOptions, TelemetrySenderOptions}; +<# } #> +<# if (this.generateClient) { #> +pub use super::common_types::options::{CommandInvokerOptions, TelemetryReceiverOptions}; +<# } #> +<# if (this.generateClient) { #> + +pub mod client { +<# foreach (string module in this.modules) { if (!module.EndsWith("_executor") && !module.EndsWith("_maintainer") && !module.EndsWith("_sender") && !module.EndsWith("_serialization") && !module.EndsWith("_headers")) { #> + pub use super::<#=module#>::*; +<# } } #> +} +<# } #> +<# if (this.generateServer) { #> + +pub mod service { +<# foreach (string module in this.modules) { if (!module.EndsWith("_invoker") && !module.EndsWith("_consumer") && !module.EndsWith("_receiver") && !module.EndsWith("_serialization") && !module.EndsWith("_headers")) { #> + pub use super::<#=module#>::*; +<# } } #> +} +<# } #> diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustLib.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustLib.tt new file mode 100644 index 0000000000..832b1749a8 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustLib.tt @@ -0,0 +1,11 @@ +<#@ template language="C#" linePragmas="false" #> +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ + +#![allow(missing_docs)] +#![allow(unused_imports)] +#![allow(dead_code)] +#![allow(clippy::result_large_err)] +#![allow(clippy::struct_field_names)] +<# foreach (string module in this.modules) { #> +pub mod <#=module#>; +<# } #> diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/code/RustPropertyConsumer.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/code/RustPropertyConsumer.cs new file mode 100644 index 0000000000..faf8c79bfa --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/code/RustPropertyConsumer.cs @@ -0,0 +1,86 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.IO; + using Azure.Iot.Operations.CodeGeneration; + + public partial class RustPropertyConsumer : IEnvoyTemplateTransform + { + private readonly CodeName? propertyName; + private readonly CodeName propSchema; + private readonly CodeName componentName; + private readonly string readCommandName; + private readonly string writeCommandName; + private readonly CodeName genNamespace; + private readonly string modelId; + private readonly EmptyTypeName readSerializerEmptyType; + private readonly EmptyTypeName writeSerializerEmptyType; + private readonly CodeName? readRespSchema; + private readonly CodeName? writeReqSchema; + private readonly CodeName? writeRespSchema; + private readonly CodeName? propValueName; + private readonly CodeName? readErrorName; + private readonly CodeName? readErrorSchema; + private readonly CodeName? writeErrorName; + private readonly CodeName? writeErrorSchema; + private readonly string readTopicPattern; + private readonly string writeTopicPattern; + private readonly string srcSubdir; + private readonly bool doesPropertyTargetReadMaintainer; + private readonly bool doesPropertyTargetWriteMaintainer; + private readonly bool separateProperties; + + public RustPropertyConsumer( + string propertyName, + CodeName propSchema, + string compnentName, + string readCommandName, + string writeCommandName, + CodeName genNamespace, + string modelId, + EmptyTypeName readSerializerEmptyType, + EmptyTypeName writeSerializerEmptyType, + string? readRespSchema, + string? writeReqSchema, + string? writeRespSchema, + string? propValueName, + string? readErrorName, + string? readErrorSchema, + string? writeErrorName, + string? writeErrorSchema, + string readTopicPattern, + string writeTopicPattern, + string srcSubdir, + bool doesPropertyTargetReadMaintainer, + bool doesPropertyTargetWriteMaintainer, + bool separateProperties) + { + this.propertyName = new CodeName(propertyName); + this.propSchema = propSchema; + this.componentName = new CodeName(compnentName); + this.readCommandName = readCommandName; + this.writeCommandName = writeCommandName; + this.genNamespace = genNamespace; + this.modelId = modelId; + this.readSerializerEmptyType = readSerializerEmptyType; + this.writeSerializerEmptyType = writeSerializerEmptyType; + this.readRespSchema = readRespSchema != null ? new CodeName(readRespSchema) : null; + this.writeReqSchema = writeReqSchema != null ? new CodeName(writeReqSchema) : null; + this.writeRespSchema = writeRespSchema != null ? new CodeName(writeRespSchema) : null; + this.propValueName = propValueName != null ? new CodeName(propValueName) : null; + this.readErrorName = readErrorName != null ? new CodeName(readErrorName) : null; + this.readErrorSchema = readErrorSchema != null ? new CodeName(readErrorSchema) : null; + this.writeErrorName = writeErrorName != null ? new CodeName(writeErrorName) : null; + this.writeErrorSchema = writeErrorSchema != null ? new CodeName(writeErrorSchema) : null; + this.readTopicPattern = readTopicPattern; + this.writeTopicPattern = writeTopicPattern; + this.srcSubdir = srcSubdir; + this.doesPropertyTargetReadMaintainer = doesPropertyTargetReadMaintainer; + this.doesPropertyTargetWriteMaintainer = doesPropertyTargetWriteMaintainer; + this.separateProperties = separateProperties; + } + + public string FileName { get => $"{this.componentName.GetFileName(TargetLanguage.Rust)}.rs"; } + + public string FolderPath { get => Path.Combine(this.srcSubdir, this.genNamespace.GetFolderName(TargetLanguage.Rust)); } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/code/RustPropertyMaintainer.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/code/RustPropertyMaintainer.cs new file mode 100644 index 0000000000..15c5ae3ac1 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/code/RustPropertyMaintainer.cs @@ -0,0 +1,80 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.IO; + using Azure.Iot.Operations.CodeGeneration; + + public partial class RustPropertyMaintainer : IEnvoyTemplateTransform + { + private readonly CodeName? propertyName; + private readonly CodeName propSchema; + private readonly CodeName componentName; + private readonly string readCommandName; + private readonly string writeCommandName; + private readonly CodeName genNamespace; + private readonly string modelId; + private readonly EmptyTypeName readSerializerEmptyType; + private readonly EmptyTypeName writeSerializerEmptyType; + private readonly CodeName? readRespSchema; + private readonly CodeName? writeReqSchema; + private readonly CodeName? writeRespSchema; + private readonly CodeName? propValueName; + private readonly CodeName? readErrorName; + private readonly CodeName? readErrorSchema; + private readonly CodeName? writeErrorName; + private readonly CodeName? writeErrorSchema; + private readonly string readTopicPattern; + private readonly string writeTopicPattern; + private readonly string srcSubdir; + private readonly bool separateProperties; + + public RustPropertyMaintainer( + string propertyName, + CodeName propSchema, + string compnentName, + string readCommandName, + string writeCommandName, + CodeName genNamespace, + string modelId, + EmptyTypeName readSerializerEmptyType, + EmptyTypeName writeSerializerEmptyType, + string? readRespSchema, + string? writeReqSchema, + string? writeRespSchema, + string? propValueName, + string? readErrorName, + string? readErrorSchema, + string? writeErrorName, + string? writeErrorSchema, + string readTopicPattern, + string writeTopicPattern, + string srcSubdir, + bool separateProperties) + { + this.propertyName = new CodeName(propertyName); + this.propSchema = propSchema; + this.componentName = new CodeName(compnentName); + this.readCommandName = readCommandName; + this.writeCommandName = writeCommandName; + this.genNamespace = genNamespace; + this.modelId = modelId; + this.readSerializerEmptyType = readSerializerEmptyType; + this.writeSerializerEmptyType = writeSerializerEmptyType; + this.readRespSchema = readRespSchema != null ? new CodeName(readRespSchema) : null; + this.writeReqSchema = writeReqSchema != null ? new CodeName(writeReqSchema) : null; + this.writeRespSchema = writeRespSchema != null ? new CodeName(writeRespSchema) : null; + this.propValueName = propValueName != null ? new CodeName(propValueName) : null; + this.readErrorName = readErrorName != null ? new CodeName(readErrorName) : null; + this.readErrorSchema = readErrorSchema != null ? new CodeName(readErrorSchema) : null; + this.writeErrorName = writeErrorName != null ? new CodeName(writeErrorName) : null; + this.writeErrorSchema = writeErrorSchema != null ? new CodeName(writeErrorSchema) : null; + this.readTopicPattern = readTopicPattern; + this.writeTopicPattern = writeTopicPattern; + this.srcSubdir = srcSubdir; + this.separateProperties = separateProperties; + } + + public string FileName { get => $"{this.componentName.GetFileName(TargetLanguage.Rust)}.rs"; } + + public string FolderPath { get => Path.Combine(this.srcSubdir, this.genNamespace.GetFolderName(TargetLanguage.Rust)); } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyConsumer.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyConsumer.tt new file mode 100644 index 0000000000..52793a1e16 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyConsumer.tt @@ -0,0 +1,445 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ + +use std::collections::HashMap; +<# if (this.readErrorName != null) { #> +use std::error::Error; +<# } #> +use std::time::Duration; + +use azure_iot_operations_mqtt::interface::ManagedClient; +use azure_iot_operations_protocol::common::aio_protocol_error::{ + AIOProtocolError, +<# if (this.readErrorName != null) { #> + AIOProtocolErrorKind, +<# } #> +}; +<# if (this.writeReqSchema != null) { #> +use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; +<# } #> +use azure_iot_operations_protocol::rpc_command; +use azure_iot_operations_protocol::application::ApplicationContext; + +use super::<#=this.propSchema.GetFileName(TargetLanguage.Rust)#>::<#=this.propSchema.GetTypeName(TargetLanguage.Rust)#>; +<# if (this.readRespSchema is CodeName && !this.readRespSchema.Equals(this.propSchema)) { #> +use super::<#=this.readRespSchema.GetFileName(TargetLanguage.Rust)#>::<#=this.readRespSchema.GetTypeName(TargetLanguage.Rust)#>; +<# } #> +<# if (this.writeReqSchema is CodeName && !this.writeReqSchema.Equals(this.readRespSchema) && !this.writeReqSchema.Equals(this.propSchema)) { #> +use super::<#=this.writeReqSchema.GetFileName(TargetLanguage.Rust)#>::<#=this.writeReqSchema.GetTypeName(TargetLanguage.Rust)#>; +<# } #> +<# if (this.writeRespSchema is CodeName) { #> +use super::<#=this.writeRespSchema.GetFileName(TargetLanguage.Rust)#>::<#=this.writeRespSchema.GetTypeName(TargetLanguage.Rust)#>; +<# } #> +<# if (this.readErrorName != null) { #> +use super::<#=this.readErrorSchema.GetFileName(TargetLanguage.Rust)#>::<#=this.readErrorSchema.GetTypeName(TargetLanguage.Rust)#>; +<# } #> +<# if (this.writeErrorName != null && !this.writeErrorSchema.Equals(this.readErrorSchema)) { #> +use super::<#=this.writeErrorSchema.GetFileName(TargetLanguage.Rust)#>::<#=this.writeErrorSchema.GetTypeName(TargetLanguage.Rust)#>; +<# } #> +use super::super::common_types::options::CommandInvokerOptions; +use super::super::common_types::<#=this.readSerializerEmptyType.GetFileName(TargetLanguage.Rust)#>::<#=this.readSerializerEmptyType.GetTypeName(TargetLanguage.Rust)#>; +<# if (!this.readSerializerEmptyType.Equals(this.writeSerializerEmptyType)) { #> +use super::super::common_types::<#=this.writeSerializerEmptyType.GetFileName(TargetLanguage.Rust)#>::<#=this.writeSerializerEmptyType.GetTypeName(TargetLanguage.Rust)#>; +<# } #> + +<# if (this.readRespSchema != null) { #> +pub type <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "request")#> = rpc_command::invoker::Request<<#=this.readSerializerEmptyType.GetTypeName(TargetLanguage.Rust)#>>; +pub type <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "response")#> = rpc_command::invoker::Response<<#=this.propSchema.GetTypeName(TargetLanguage.Rust)#>>; +pub type <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "request", "builder", "error")#> = rpc_command::invoker::RequestBuilderError; +<# if (this.readErrorSchema != null) { #> +pub type <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "response", "error")#> = rpc_command::invoker::Response<<#=this.readErrorSchema.GetTypeName(TargetLanguage.Rust)#>>; +<# } #> +<# } #> +<# if (this.writeReqSchema != null) { #> +pub type <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "request")#> = rpc_command::invoker::Request<<#=this.writeReqSchema.GetTypeName(TargetLanguage.Rust)#>>; +pub type <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "response")#> = rpc_command::invoker::Response<<#=this.writeSerializerEmptyType.GetTypeName(TargetLanguage.Rust)#>>; +pub type <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "request", "builder", "error")#> = rpc_command::invoker::RequestBuilderError; +<# if (this.writeErrorSchema != null) { #> +pub type <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "response", "error")#> = rpc_command::invoker::Response<<#=this.writeErrorSchema.GetTypeName(TargetLanguage.Rust)#>>; +<# } #> +<# } #> +<# if (this.readRespSchema != null) { #> + +#[derive(Default)] +/// Builder for [`<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "request")#>`] +pub struct <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "request", "builder")#> { + inner_builder: rpc_command::invoker::RequestBuilder<<#=this.readSerializerEmptyType.GetTypeName(TargetLanguage.Rust)#>>, +<# if (this.doesPropertyTargetReadMaintainer) { #> + set_maintainer_id: bool, +<# } #> + topic_tokens: HashMap, +} + +impl <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "request", "builder")#> { + /// Custom user data to set on the read request + pub fn custom_user_data(&mut self, custom_user_data: Vec<(String, String)>) -> &mut Self { + self.inner_builder.custom_user_data(custom_user_data); + self + } + + /// Topic token keys/values to be replaced into the publish topic of the request message. + /// A prefix of "ex:" will be prepended to each key before scanning the topic pattern. + /// Thus, only tokens of the form `{ex:SOMEKEY}` will be replaced. + pub fn topic_tokens(&mut self, topic_tokens: HashMap) -> &mut Self { + for (k, v) in topic_tokens { + self.topic_tokens.insert(format!("ex:{k}"), v); + } + self + } + + /// Timeout for the request + pub fn timeout(&mut self, timeout: Duration) -> &mut Self { + self.inner_builder.timeout(timeout); + self + } + +<# if (this.doesPropertyTargetReadMaintainer) { #> + /// Target maintainer ID + pub fn maintainer_id(&mut self, maintainer_id: &str) -> &mut Self { + self.topic_tokens + .insert("maintainerId".to_string(), maintainer_id.to_string()); + self.set_maintainer_id = true; + self + } + +<# } #> + /// Builds a new `<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "request")#>` + /// + /// # Errors + /// If a required field has not been initialized + #[allow(clippy::missing_panics_doc)] // The panic is not possible + pub fn build(&mut self) -> Result<<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "request")#>, <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "request", "builder", "error")#>> { +<# if (this.doesPropertyTargetReadMaintainer) { #> + if !self.set_maintainer_id { + return Err(<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "request", "builder", "error")#>::UninitializedField( + "maintainer_id", + )); + } + +<# } #> + self.inner_builder.payload(<#=this.readSerializerEmptyType.GetAllocator(TargetLanguage.Rust)#>).unwrap(); + + self.inner_builder.topic_tokens(self.topic_tokens.clone()); + + self.inner_builder.build() + } +} +<# } #> +<# if (this.writeReqSchema != null) { #> + +#[derive(Default)] +/// Builder for [`<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "request")#>`] +pub struct <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "request", "builder")#> { + inner_builder: rpc_command::invoker::RequestBuilder<<#=this.writeReqSchema.GetTypeName(TargetLanguage.Rust)#>>, +<# if (this.doesPropertyTargetWriteMaintainer) { #> + set_maintainer_id: bool, +<# } #> + topic_tokens: HashMap, +} + +impl <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "request", "builder")#> { + /// Custom user data to set on the write request + pub fn custom_user_data(&mut self, custom_user_data: Vec<(String, String)>) -> &mut Self { + self.inner_builder.custom_user_data(custom_user_data); + self + } + + /// Topic token keys/values to be replaced into the publish topic of the request message. + /// A prefix of "ex:" will be prepended to each key before scanning the topic pattern. + /// Thus, only tokens of the form `{ex:SOMEKEY}` will be replaced. + pub fn topic_tokens(&mut self, topic_tokens: HashMap) -> &mut Self { + for (k, v) in topic_tokens { + self.topic_tokens.insert(format!("ex:{k}"), v); + } + self + } + + /// Timeout for the request + pub fn timeout(&mut self, timeout: Duration) -> &mut Self { + self.inner_builder.timeout(timeout); + self + } + +<# if (this.doesPropertyTargetWriteMaintainer) { #> + /// Target maintainer ID + pub fn maintainer_id(&mut self, maintainer_id: &str) -> &mut Self { + self.topic_tokens + .insert("maintainerId".to_string(), maintainer_id.to_string()); + self.set_maintainer_id = true; + self + } + +<# } #> + /// Payload of the write request + /// + /// # Errors + /// If the payload cannot be serialized + pub fn payload( + &mut self, + payload: <#=this.writeReqSchema.GetTypeName(TargetLanguage.Rust)#>, + ) -> Result<&mut Self, AIOProtocolError> { + self.inner_builder.payload(payload)?; + Ok(self) + } + + /// Builds a new `<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "request")#>` + /// + /// # Errors + /// If a required field has not been initialized + #[allow(clippy::missing_panics_doc)] // The panic is not possible + pub fn build(&mut self) -> Result<<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "request")#>, <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "request", "builder", "error")#>> { +<# if (this.doesPropertyTargetWriteMaintainer) { #> + if !self.set_maintainer_id { + return Err(<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "request", "builder", "error")#>::UninitializedField( + "maintainer_id", + )); + } + +<# } #> + self.inner_builder.topic_tokens(self.topic_tokens.clone()); + + self.inner_builder.build() + } +} +<# } #> +<# if (this.readRespSchema != null) { #> + +<# if (!this.propertyName.IsEmpty) { #> +/// Read requester for `<#=this.propertyName.AsGiven#>` +<# } else { #> +/// Read requester for a Property collection +<# } #> +pub struct <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "requester")#>( + rpc_command::Invoker<<#=this.readSerializerEmptyType.GetTypeName(TargetLanguage.Rust)#>, <#=this.readRespSchema.GetTypeName(TargetLanguage.Rust)#>, C>, +) +where + C: ManagedClient + Clone + Send + Sync + 'static, + C::PubReceiver: Send + Sync + 'static; + +impl <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "requester")#> +where + C: ManagedClient + Clone + Send + Sync + 'static, + C::PubReceiver: Send + Sync + 'static, +{ + /// Creates a new [`<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "requester")#>`] + /// + /// # Panics + /// If the DTDL that generated this code was invalid + pub fn new(application_context: ApplicationContext, client: C, options: &CommandInvokerOptions) -> Self { + let mut invoker_options_builder = rpc_command::invoker::OptionsBuilder::default(); + if let Some(topic_namespace) = &options.topic_namespace { + invoker_options_builder.topic_namespace(topic_namespace.clone()); + } + + let mut topic_token_map: HashMap = options + .topic_token_map + .clone() + .into_iter() + .map(|(k, v)| (format!("ex:{k}"), v)) + .collect(); + + topic_token_map.insert("action".to_string(), "read".to_string()); + topic_token_map.insert("modelId".to_string(), "<#=this.modelId#>".to_string()); + topic_token_map.insert("consumerClientId".to_string(), client.client_id().to_string()); +<# if (!this.propertyName.IsEmpty) { #> + topic_token_map.insert("propertyName".to_string(), "<#=this.propertyName.AsGiven#>".to_string()); +<# } #> + + let invoker_options = invoker_options_builder + .request_topic_pattern("<#=this.readTopicPattern#>") + .command_name("<#=this.readCommandName#>") + .topic_token_map(topic_token_map) + .response_topic_prefix(options.response_topic_prefix.clone()) + .response_topic_suffix(options.response_topic_suffix.clone()) + .build() + .expect("DTDL schema generated invalid arguments"); + + Self( + rpc_command::Invoker::new(application_context, client, invoker_options) + .expect("DTDL schema generated invalid arguments"), + ) + } + + /// Invokes the [`<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "request")#>`] + /// + /// # Errors + /// [`AIOProtocolError`] if there is a failure invoking the request + pub async fn invoke( + &self, + request: <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "request")#>, +<# if (this.readErrorName != null) { #> + ) -> Result, <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "response", "error")#>>, AIOProtocolError> { + let response = self.0.invoke(request).await; + match response { + Ok(response) => { + if let Some(<#=this.readErrorName.GetVariableName(TargetLanguage.Rust)#>) = response.payload.<#=this.readErrorName.GetFieldName(TargetLanguage.Rust)#> { + Ok(Err(<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "response", "error")#> { + payload: <#=this.readErrorName.GetVariableName(TargetLanguage.Rust)#>, + content_type: response.content_type, + format_indicator: response.format_indicator, + custom_user_data: response.custom_user_data, + timestamp: response.timestamp, + executor_id: response.executor_id, + })) + } else if let Some(<#=this.propValueName.GetVariableName(TargetLanguage.Rust)#>) = response.payload.<#=this.propValueName.GetFieldName(TargetLanguage.Rust)#> { + Ok(Ok(<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "response")#> { +<# if (this.separateProperties) { #> + payload: <#=this.propSchema.GetTypeName(TargetLanguage.Rust)#> { <#=(this.propValueName ?? this.propertyName).GetFieldName(TargetLanguage.Rust)#>: <#=this.propValueName.GetVariableName(TargetLanguage.Rust)#> }, +<# } else { #> + payload: <#=this.propValueName.GetVariableName(TargetLanguage.Rust)#>, +<# } #> + content_type: response.content_type, + format_indicator: response.format_indicator, + custom_user_data: response.custom_user_data, + timestamp: response.timestamp, + executor_id: response.executor_id, + })) + } else { + Err(AIOProtocolError { + message: Some( + "Command response has neither normal nor error payload content" + .to_string(), + ), + kind: AIOProtocolErrorKind::PayloadInvalid, + is_shallow: false, + is_remote: true, + nested_error: None, + header_name: None, + header_value: None, + timeout_name: None, + timeout_value: None, + property_name: None, + property_value: None, + command_name: Some("<#=this.readCommandName#>".to_string()), + protocol_version: None, + supported_protocol_major_versions: None, + }) + } + } + Err(err) => Err(err), + } +<# } else { #> + ) -> Result<<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "response")#>, AIOProtocolError> { + self.0.invoke(request).await +<# } #> + } + + /// Shutdown the [`<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "requester")#>`]. Unsubscribes from the response topic and cancels the receiver loop to drop the receiver and to prevent the task from looping indefinitely. + /// + /// Returns Ok(()) on success, otherwise returns [`AIOProtocolError`]. + /// # Errors + /// [`AIOProtocolError`] of kind [`ClientError`](azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolErrorKind::ClientError) if the unsubscribe fails or if the unsuback reason code doesn't indicate success. + pub async fn shutdown(&self) -> Result<(), AIOProtocolError> { + self.0.shutdown().await + } +} +<# } #> +<# if (this.writeReqSchema != null) { #> + +<# if (!this.propertyName.IsEmpty) { #> +/// Write requester for `<#=this.propertyName.AsGiven#>` +<# } else { #> +/// Write requester for a Property collection +<# } #> +pub struct <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "requester")#>( + rpc_command::Invoker<<#=this.writeReqSchema.GetTypeName(TargetLanguage.Rust)#>, <#=((ITypeName)this.writeRespSchema ?? this.writeSerializerEmptyType).GetTypeName(TargetLanguage.Rust)#>, C>, +) +where + C: ManagedClient + Clone + Send + Sync + 'static, + C::PubReceiver: Send + Sync + 'static; + +impl <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "requester")#> +where + C: ManagedClient + Clone + Send + Sync + 'static, + C::PubReceiver: Send + Sync + 'static, +{ + /// Creates a new [`<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "requester")#>`] + /// + /// # Panics + /// If the DTDL that generated this code was invalid + pub fn new(application_context: ApplicationContext, client: C, options: &CommandInvokerOptions) -> Self { + let mut invoker_options_builder = rpc_command::invoker::OptionsBuilder::default(); + if let Some(topic_namespace) = &options.topic_namespace { + invoker_options_builder.topic_namespace(topic_namespace.clone()); + } + + let mut topic_token_map: HashMap = options + .topic_token_map + .clone() + .into_iter() + .map(|(k, v)| (format!("ex:{k}"), v)) + .collect(); + + topic_token_map.insert("action".to_string(), "write".to_string()); + topic_token_map.insert("modelId".to_string(), "<#=this.modelId#>".to_string()); + topic_token_map.insert("consumerClientId".to_string(), client.client_id().to_string()); +<# if (!this.propertyName.IsEmpty) { #> + topic_token_map.insert("propertyName".to_string(), "<#=this.propertyName.AsGiven#>".to_string()); +<# } #> + + let invoker_options = invoker_options_builder + .request_topic_pattern("<#=this.readTopicPattern#>") + .command_name("<#=this.writeCommandName#>") + .topic_token_map(topic_token_map) + .response_topic_prefix(options.response_topic_prefix.clone()) + .response_topic_suffix(options.response_topic_suffix.clone()) + .build() + .expect("DTDL schema generated invalid arguments"); + + Self( + rpc_command::Invoker::new(application_context, client, invoker_options) + .expect("DTDL schema generated invalid arguments"), + ) + } + + /// Invokes the [`<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "request")#>`] + /// + /// # Errors + /// [`AIOProtocolError`] if there is a failure invoking the request + pub async fn invoke( + &self, + request: <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "request")#>, +<# if (this.writeErrorName != null) { #> + ) -> Result, <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "response", "error")#>>, AIOProtocolError> { + let response = self.0.invoke(request).await; + match response { + Ok(response) => { + if let Some(<#=this.writeErrorName.GetVariableName(TargetLanguage.Rust)#>) = response.payload.<#=this.writeErrorName.GetFieldName(TargetLanguage.Rust)#> { + Ok(Err(<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "response", "error")#> { + payload: <#=this.writeErrorName.GetVariableName(TargetLanguage.Rust)#>, + content_type: response.content_type, + format_indicator: response.format_indicator, + custom_user_data: response.custom_user_data, + timestamp: response.timestamp, + executor_id: response.executor_id, + })) + } else { + Ok(Ok(<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "response")#> { + payload: <#=this.writeSerializerEmptyType.GetAllocator(TargetLanguage.Rust)#>, + content_type: response.content_type, + format_indicator: response.format_indicator, + custom_user_data: response.custom_user_data, + timestamp: response.timestamp, + executor_id: response.executor_id, + })) + } + } + Err(err) => Err(err), + } +<# } else { #> + ) -> Result<<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "response")#>, AIOProtocolError> { + self.0.invoke(request).await +<# } #> + } + + /// Shutdown the [`<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "requester")#>`]. Unsubscribes from the response topic and cancels the receiver loop to drop the receiver and to prevent the task from looping indefinitely. + /// + /// Returns Ok(()) on success, otherwise returns [`AIOProtocolError`]. + /// # Errors + /// [`AIOProtocolError`] of kind [`ClientError`](azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolErrorKind::ClientError) if the unsubscribe fails or if the unsuback reason code doesn't indicate success. + pub async fn shutdown(&self) -> Result<(), AIOProtocolError> { + self.0.shutdown().await + } +} +<# } #> diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyMaintainer.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyMaintainer.tt new file mode 100644 index 0000000000..44e7aa8d5f --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyMaintainer.tt @@ -0,0 +1,280 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ + +use std::collections::HashMap; + +use azure_iot_operations_mqtt::interface::ManagedClient; +use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; +<# if (this.readRespSchema != null || this.writeRespSchema != null) { #> +use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; +<# } #> +use azure_iot_operations_protocol::rpc_command; +use azure_iot_operations_protocol::application::ApplicationContext; + +use super::<#=this.propSchema.GetFileName(TargetLanguage.Rust)#>::<#=this.propSchema.GetTypeName(TargetLanguage.Rust)#>; +<# if (this.readRespSchema is CodeName && !this.readRespSchema.Equals(this.propSchema)) { #> +use super::<#=this.readRespSchema.GetFileName(TargetLanguage.Rust)#>::<#=this.readRespSchema.GetTypeName(TargetLanguage.Rust)#>; +<# } #> +<# if (this.writeReqSchema is CodeName && !this.writeReqSchema.Equals(this.readRespSchema) && !this.writeReqSchema.Equals(this.propSchema)) { #> +use super::<#=this.writeReqSchema.GetFileName(TargetLanguage.Rust)#>::<#=this.writeReqSchema.GetTypeName(TargetLanguage.Rust)#>; +<# } #> +<# if (this.writeRespSchema is CodeName) { #> +use super::<#=this.writeRespSchema.GetFileName(TargetLanguage.Rust)#>::<#=this.writeRespSchema.GetTypeName(TargetLanguage.Rust)#>; +<# } #> +<# if (this.readErrorName != null) { #> +use super::<#=this.readErrorSchema.GetFileName(TargetLanguage.Rust)#>::<#=this.readErrorSchema.GetTypeName(TargetLanguage.Rust)#>; +<# } #> +<# if (this.writeErrorName != null && !this.writeErrorSchema.Equals(this.readErrorSchema)) { #> +use super::<#=this.writeErrorSchema.GetFileName(TargetLanguage.Rust)#>::<#=this.writeErrorSchema.GetTypeName(TargetLanguage.Rust)#>; +<# } #> +use super::super::common_types::options::CommandExecutorOptions; +use super::super::common_types::<#=this.readSerializerEmptyType.GetFileName(TargetLanguage.Rust)#>::<#=this.readSerializerEmptyType.GetTypeName(TargetLanguage.Rust)#>; +<# if (!this.readSerializerEmptyType.Equals(this.writeSerializerEmptyType)) { #> +use super::super::common_types::<#=this.writeSerializerEmptyType.GetFileName(TargetLanguage.Rust)#>::<#=this.writeSerializerEmptyType.GetTypeName(TargetLanguage.Rust)#>; +<# } #> + +<# if (this.readRespSchema != null) { #> +pub type <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "request")#> = rpc_command::executor::Request<<#=this.readSerializerEmptyType.GetTypeName(TargetLanguage.Rust)#>, <#=this.readRespSchema.GetTypeName(TargetLanguage.Rust)#>>; +pub type <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "response")#> = rpc_command::executor::Response<<#=this.readRespSchema.GetTypeName(TargetLanguage.Rust)#>>; +pub type <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "response", "builder", "error")#> = rpc_command::executor::ResponseBuilderError; +<# } #> +<# if (this.writeReqSchema != null) { #> +pub type <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "request")#> = rpc_command::executor::Request<<#=this.writeReqSchema.GetTypeName(TargetLanguage.Rust)#>, <#=((ITypeName)this.writeRespSchema ?? this.writeSerializerEmptyType).GetTypeName(TargetLanguage.Rust)#>>; +pub type <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "response")#> = rpc_command::executor::Response<<#=((ITypeName)this.writeRespSchema ?? this.writeSerializerEmptyType).GetTypeName(TargetLanguage.Rust)#>>; +pub type <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "response", "builder", "error")#> = rpc_command::executor::ResponseBuilderError; +<# } #> + +#[derive(Default)] +/// Builder for [`<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "response")#>`] +pub struct <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "response", "builder")#> { + inner_builder: rpc_command::executor::ResponseBuilder<<#=this.readRespSchema.GetTypeName(TargetLanguage.Rust)#>>, +} + +impl <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "response", "builder")#> { + /// Custom user data to set on the read response + pub fn custom_user_data(&mut self, custom_user_data: Vec<(String, String)>) -> &mut Self { + self.inner_builder.custom_user_data(custom_user_data); + self + } + + /// Payload of the read response + /// + /// # Errors + /// If the payload cannot be serialized + pub fn payload( + &mut self, + payload: <#=this.propSchema.GetTypeName(TargetLanguage.Rust)#>, + ) -> Result<&mut Self, AIOProtocolError> { +<# if (this.readErrorName != null) { #> + self.inner_builder.payload(<#=this.readRespSchema.GetTypeName(TargetLanguage.Rust)#> { + <#=this.propValueName.GetFieldName(TargetLanguage.Rust)#>: Some(payload<#=this.separateProperties ? $".{this.propValueName.GetFieldName(TargetLanguage.Rust)}" : "" #>), + <#=this.readErrorName.GetFieldName(TargetLanguage.Rust)#>: None, + })?; +<# } else { #> + self.inner_builder.payload(payload)?; +<# } #> + Ok(self) + } + +<# if (this.readErrorName != null) { #> + pub fn error(&mut self, error: <#=this.readErrorSchema.GetTypeName(TargetLanguage.Rust)#>) -> Result<&mut Self, AIOProtocolError> { + self.inner_builder.payload(<#=this.readRespSchema.GetTypeName(TargetLanguage.Rust)#> { + <#=this.propValueName.GetFieldName(TargetLanguage.Rust)#>: None, + <#=this.readErrorName.GetFieldName(TargetLanguage.Rust)#>: Some(error), + })?; + Ok(self) + } + +<# } #> + /// Builds a new `<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "response")#>` + /// + /// # Errors + /// If a required field has not been initialized + #[allow(clippy::missing_panics_doc)] // The panic is not possible + pub fn build(&mut self) -> Result<<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "response")#>, <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "response", "builder", "error")#>> { + self.inner_builder.build() + } +} +<# if (this.writeRespSchema != null) { #> + +#[derive(Default)] +/// Builder for [`<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "response")#>`] +pub struct <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "response", "builder")#> { + inner_builder: rpc_command::executor::ResponseBuilder<<#=this.writeRespSchema.GetTypeName(TargetLanguage.Rust)#>>, +} + +impl <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "response", "builder")#> { + /// Custom user data to set on the write response + pub fn custom_user_data(&mut self, custom_user_data: Vec<(String, String)>) -> &mut Self { + self.inner_builder.custom_user_data(custom_user_data); + self + } + +<# if (this.writeErrorName != null) { #> + pub fn error(&mut self, error: <#=this.writeErrorSchema.GetTypeName(TargetLanguage.Rust)#>) -> Result<&mut Self, AIOProtocolError> { + self.inner_builder.payload(<#=this.writeRespSchema.GetTypeName(TargetLanguage.Rust)#> { + <#=this.writeErrorName.GetFieldName(TargetLanguage.Rust)#>: Some(error), + })?; + Ok(self) + } + +<# } #> + /// Builds a new `<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "response")#>` + /// + /// # Errors + /// If a required field has not been initialized + #[allow(clippy::missing_panics_doc)] // The panic is not possible + pub fn build(&mut self) -> Result<<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "response")#>, <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "response", "builder", "error")#>> { + self.inner_builder.build() + } +} +<# } #> +<# if (this.readRespSchema != null) { #> + +<# if (!this.propertyName.IsEmpty) { #> +/// Read responder for `<#=this.propertyName.AsGiven#>` +<# } else { #> +/// Read responder for a Property collection +<# } #> +pub struct <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "responder")#>( + rpc_command::Executor<<#=this.readSerializerEmptyType.GetTypeName(TargetLanguage.Rust)#>, <#=this.readRespSchema.GetTypeName(TargetLanguage.Rust)#>, C>, +) +where + C: ManagedClient + Clone + Send + Sync + 'static, + C::PubReceiver: Send + Sync + 'static; + +impl <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "responder")#> +where + C: ManagedClient + Clone + Send + Sync + 'static, + C::PubReceiver: Send + Sync + 'static, +{ + /// Creates a new [`<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "responder")#>`] + /// + /// # Panics + /// If the DTDL that generated this code was invalid + pub fn new(application_context: ApplicationContext, client: C, options: &CommandExecutorOptions) -> Self { + let mut executor_options_builder = rpc_command::executor::OptionsBuilder::default(); + if let Some(topic_namespace) = &options.topic_namespace { + executor_options_builder.topic_namespace(topic_namespace.clone()); + } + + let mut topic_token_map: HashMap = options + .topic_token_map + .clone() + .into_iter() + .map(|(k, v)| (format!("ex:{k}"), v)) + .collect(); + + topic_token_map.insert("action".to_string(), "read".to_string()); + topic_token_map.insert("modelId".to_string(), "<#=this.modelId#>".to_string()); + topic_token_map.insert("maintainerId".to_string(), client.client_id().to_string()); +<# if (!this.propertyName.IsEmpty) { #> + topic_token_map.insert("propertyName".to_string(), "<#=this.propertyName.AsGiven#>".to_string()); +<# } #> + + let executor_options = executor_options_builder + .request_topic_pattern("<#=this.readTopicPattern#>") + .command_name("<#=this.readCommandName#>") + .topic_token_map(topic_token_map) + .build() + .expect("DTDL schema generated invalid arguments"); + + Self( + rpc_command::Executor::new(application_context, client, executor_options) + .expect("DTDL schema generated invalid arguments"), + ) + } + + /// Receive the next [`<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "request")#>`] or [`None`] if there will be no more requests + /// + /// # Errors + /// [`AIOProtocolError`] if there is a failure receiving a request + pub async fn recv(&mut self) -> Option, AIOProtocolError>> { + self.0.recv().await + } + + /// Shutdown the [`<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "responder")#>`]. Unsubscribes from the response topic and cancels the receiver loop to drop the receiver and to prevent the task from looping indefinitely. + /// + /// Returns Ok(()) on success, otherwise returns [`AIOProtocolError`]. + /// # Errors + /// [`AIOProtocolError`] of kind [`ClientError`](azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolErrorKind::ClientError) if the unsubscribe fails or if the unsuback reason code doesn't indicate success. + pub async fn shutdown(&mut self) -> Result<(), AIOProtocolError> { + self.0.shutdown().await + } +} +<# } #> +<# if (this.writeReqSchema != null) { #> + +<# if (!this.propertyName.IsEmpty) { #> +/// Write responder for `<#=this.propertyName.AsGiven#>` +<# } else { #> +/// Write responder for a Property collection +<# } #> +pub struct <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "responder")#>( + rpc_command::Executor<<#=this.writeReqSchema.GetTypeName(TargetLanguage.Rust)#>, <#=((ITypeName)this.writeRespSchema ?? this.writeSerializerEmptyType).GetTypeName(TargetLanguage.Rust)#>, C>, +) +where + C: ManagedClient + Clone + Send + Sync + 'static, + C::PubReceiver: Send + Sync + 'static; + +impl <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "responder")#> +where + C: ManagedClient + Clone + Send + Sync + 'static, + C::PubReceiver: Send + Sync + 'static, +{ + /// Creates a new [`<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "responder")#>`] + /// + /// # Panics + /// If the DTDL that generated this code was invalid + pub fn new(application_context: ApplicationContext, client: C, options: &CommandExecutorOptions) -> Self { + let mut executor_options_builder = rpc_command::executor::OptionsBuilder::default(); + if let Some(topic_namespace) = &options.topic_namespace { + executor_options_builder.topic_namespace(topic_namespace.clone()); + } + + let mut topic_token_map: HashMap = options + .topic_token_map + .clone() + .into_iter() + .map(|(k, v)| (format!("ex:{k}"), v)) + .collect(); + + topic_token_map.insert("action".to_string(), "write".to_string()); + topic_token_map.insert("modelId".to_string(), "<#=this.modelId#>".to_string()); + topic_token_map.insert("maintainerId".to_string(), client.client_id().to_string()); +<# if (!this.propertyName.IsEmpty) { #> + topic_token_map.insert("propertyName".to_string(), "<#=this.propertyName.AsGiven#>".to_string()); +<# } #> + + let executor_options = executor_options_builder + .request_topic_pattern("<#=this.writeTopicPattern#>") + .command_name("<#=this.writeCommandName#>") + .topic_token_map(topic_token_map) + .build() + .expect("DTDL schema generated invalid arguments"); + + Self( + rpc_command::Executor::new(application_context, client, executor_options) + .expect("DTDL schema generated invalid arguments"), + ) + } + + /// Receive the next [`<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "request")#>`] or [`None`] if there will be no more requests + /// + /// # Errors + /// [`AIOProtocolError`] if there is a failure receiving a request + pub async fn recv(&mut self) -> Option, AIOProtocolError>> { + self.0.recv().await + } + + /// Shutdown the [`<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "responder")#>`]. Unsubscribes from the response topic and cancels the receiver loop to drop the receiver and to prevent the task from looping indefinitely. + /// + /// Returns Ok(()) on success, otherwise returns [`AIOProtocolError`]. + /// # Errors + /// [`AIOProtocolError`] of kind [`ClientError`](azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolErrorKind::ClientError) if the unsubscribe fails or if the unsuback reason code doesn't indicate success. + pub async fn shutdown(&mut self) -> Result<(), AIOProtocolError> { + self.0.shutdown().await + } +} +<# } #> diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Serialization/code/RustSerialization.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Serialization/code/RustSerialization.cs new file mode 100644 index 0000000000..c53b35c6f4 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Serialization/code/RustSerialization.cs @@ -0,0 +1,74 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Collections.Generic; + using System.IO; + using Azure.Iot.Operations.CodeGeneration; + + public partial class RustSerialization : IEnvoyTemplateTransform + { + private static readonly Dictionary serdeLibs = new() + { + { SerializationFormat.Json, "serde_json" }, + }; + + private static readonly Dictionary> formatStdHeaders = new() + { + { SerializationFormat.Json, new List { } }, + }; + + private static readonly Dictionary> formatExtHeaders = new() + { + { SerializationFormat.Json, new List { "use serde_json;" } }, + }; + + private static readonly Dictionary formatContentType = new() + { + { SerializationFormat.Json, "application/json" }, + }; + + private static readonly Dictionary formatFormatIndicator = new() + { + { SerializationFormat.Json, "Utf8EncodedCharacterData" }, + }; + + private static readonly Dictionary> formatSerializeCode = new() + { + { SerializationFormat.Json, new List { "serde_json::to_vec(&self)" } }, + }; + + private static readonly Dictionary> formatDeserializeCode = new() + { + { SerializationFormat.Json, new List { "serde_json::from_slice(payload)" } }, + }; + + private readonly CodeName genNamespace; + private readonly CodeName schemaClassName; + private readonly string? serdeLib; + private readonly List stdHeaders; + private readonly List extHeaders; + private readonly string? contentType; + private readonly string? formatIndicator; + private readonly List serializeCode; + private readonly List deserializeCode; + private readonly string srcSubdir; + + public RustSerialization(CodeName genNamespace, SerializationFormat genFormat, CodeName schemaClassName, string srcSubdir) + { + this.genNamespace = genNamespace; + this.schemaClassName = schemaClassName; + this.srcSubdir = srcSubdir; + + this.serdeLib = serdeLibs.GetValueOrDefault(genFormat); + this.stdHeaders = formatStdHeaders.GetValueOrDefault(genFormat) ?? new List(); + this.extHeaders = formatExtHeaders.GetValueOrDefault(genFormat) ?? new List(); + this.contentType = formatContentType.GetValueOrDefault(genFormat); + this.formatIndicator = formatFormatIndicator.GetValueOrDefault(genFormat); + this.serializeCode = formatSerializeCode.GetValueOrDefault(genFormat) ?? new List(); + this.deserializeCode = formatDeserializeCode.GetValueOrDefault(genFormat) ?? new List(); + } + + public string FileName { get => $"{this.schemaClassName.GetFileName(TargetLanguage.Rust, "serialization")}.rs"; } + + public string FolderPath { get => Path.Combine(this.srcSubdir, this.genNamespace.GetFolderName(TargetLanguage.Rust)); } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Serialization/t4/RustSerialization.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Serialization/t4/RustSerialization.tt new file mode 100644 index 0000000000..c09fc6b446 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Serialization/t4/RustSerialization.tt @@ -0,0 +1,73 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="System.Linq" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ + +<# if (this.stdHeaders.Any()) { #> +<# foreach (string header in this.stdHeaders) { #> +<#=header#> +<# } #> + +<# } #> +<# if (this.extHeaders.Any()) { #> +use azure_iot_operations_protocol::common::payload_serialize::{ + DeserializationError, FormatIndicator, PayloadSerialize, SerializedPayload, +}; +<# foreach (string header in this.extHeaders) { #> +<#=header#> +<# } #> + +<# } #> +use super::<#=this.schemaClassName.GetFileName(TargetLanguage.Rust)#>::<#=this.schemaClassName.GetTypeName(TargetLanguage.Rust)#>; + +<# + var contentTypeConstName = this.schemaClassName.GetConstantName(TargetLanguage.Rust, "content", "type"); +#> +const <#=contentTypeConstName#>: &str = "<#=this.contentType#>"; + +impl <#=this.schemaClassName.GetTypeName(TargetLanguage.Rust)#> { + fn is_content_type(content_type: &str) -> bool { + content_type.starts_with(<#=contentTypeConstName#>) + && matches!( + content_type + .chars() + .nth(<#=contentTypeConstName#>.len()), + None | Some('+' | ';') + ) + } +} + +impl PayloadSerialize for <#=this.schemaClassName.GetTypeName(TargetLanguage.Rust)#> { +<# if (this.serdeLib != null) { #> + type Error = <#=this.serdeLib#>::Error; + +<# } #> + fn serialize(self) -> Result { + let payload = <#=this.serializeCode.First()#><#=this.serializeCode.Count == 1 ? ";" : ""#> +<# int ix = 2; foreach (string serializeLine in this.serializeCode.Skip(1)) { #> + <#=serializeLine#><#=ix == this.serializeCode.Count ? ";" : ""#> +<# ix++; } #> + Ok(SerializedPayload { + payload: payload?, + content_type: "<#=this.contentType#>".to_string(), + format_indicator: FormatIndicator::<#=this.formatIndicator#>, + }) + } + + fn deserialize( + payload: &[u8], + content_type: Option<&String>, + _format_indicator: &FormatIndicator, + ) -> Result> { + if let Some(content_type) = content_type { + if !<#=this.schemaClassName.GetTypeName(TargetLanguage.Rust)#>::is_content_type(content_type) { + return Err(DeserializationError::UnsupportedContentType(format!( + "Invalid content type: '{content_type}'. Must be '<#=this.contentType#>'" + ))); + } + } +<# ix = 1; foreach (string deserializeLine in this.deserializeCode) { #> + <#=deserializeLine#><#=ix == this.deserializeCode.Count ? ".map_err(DeserializationError::InvalidPayload)" : ""#> +<# ix++; } #> + } +} diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/ArgBinder.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/ArgBinder.cs new file mode 100644 index 0000000000..8be5b49c59 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/ArgBinder.cs @@ -0,0 +1,91 @@ +namespace Azure.Iot.Operations.ProtocolCompiler +{ + using System.CommandLine; + using System.CommandLine.Binding; + using System.IO; + + /// + /// Custom arguemnt binder for CLI. + /// + public class ArgBinder : BinderBase + { + private readonly Option thingFiles; + private readonly Option extSchemaFiles; + private readonly Option outputDir; + private readonly Option workingDir; + private readonly Option outputSourceSubdir; + private readonly Option genNamespace; + private readonly Option sdkPath; + private readonly Option language; + private readonly Option clientOnly; + private readonly Option serverOnly; + private readonly Option noProj; + private readonly Option defaultImpl; + + /// + /// Initializes a new instance of the class. + /// + /// File(s) containing WoT Thing Description(s) to process. + /// Filespec(s) of files containing external schema definitions. + /// Directory for receiving generated code. + /// Directory for storing temporary files (relative to outDir unless path is rooted). + /// Subdirectory under outputDir for generated source code. + /// Namespace for generated code; null for default. + /// Local path or feed URL for Azure.Iot.Operations.Protocol SDK. + /// Programming language for generated code. + /// Generate only client-side code. + /// Generate only server-side code. + /// Suppress generation of a project. + /// Generate default (empty) implementations of callbacks. + public ArgBinder( + Option thingFiles, + Option extSchemaFiles, + Option outputDir, + Option workingDir, + Option outputSourceSubdir, + Option genNamespace, + Option sdkPath, + Option language, + Option clientOnly, + Option serverOnly, + Option noProj, + Option defaultImpl) + { + this.thingFiles = thingFiles; + this.extSchemaFiles = extSchemaFiles; + this.outputDir = outputDir; + this.workingDir = workingDir; + this.outputSourceSubdir = outputSourceSubdir; + this.genNamespace = genNamespace; + this.sdkPath = sdkPath; + this.language = language; + this.clientOnly = clientOnly; + this.serverOnly = serverOnly; + this.noProj = noProj; + this.defaultImpl = defaultImpl; + } + + /// + protected override OptionContainer GetBoundValue(BindingContext bindingContext) + { + DirectoryInfo outputDir = bindingContext.ParseResult.GetValueForOption(this.outputDir)!; + string workingDir = bindingContext.ParseResult.GetValueForOption(this.workingDir)!; + + return new OptionContainer() + { + ThingFiles = bindingContext.ParseResult.GetValueForOption(this.thingFiles)!, + ExtSchemaFiles = bindingContext.ParseResult.GetValueForOption(this.extSchemaFiles)!, + OutputDir = outputDir, + WorkingDir = Path.IsPathRooted(workingDir) ? new DirectoryInfo(workingDir) : new DirectoryInfo(Path.Combine(outputDir.FullName, workingDir)), + OutputSourceSubdir = bindingContext.ParseResult.GetValueForOption(this.outputSourceSubdir)!, + GenNamespace = bindingContext.ParseResult.GetValueForOption(this.genNamespace)!, + SdkPath = bindingContext.ParseResult.GetValueForOption(this.sdkPath), + Language = bindingContext.ParseResult.GetValueForOption(this.language)!, + ClientOnly = bindingContext.ParseResult.GetValueForOption(this.clientOnly), + ServerOnly = bindingContext.ParseResult.GetValueForOption(this.serverOnly), + NoProj = bindingContext.ParseResult.GetValueForOption(this.noProj), + DefaultImpl = bindingContext.ParseResult.GetValueForOption(this.defaultImpl), + }; + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/Azure.Iot.Operations.ProtocolCompiler.csproj b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/Azure.Iot.Operations.ProtocolCompiler.csproj new file mode 100644 index 0000000000..8137cbe6d7 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/Azure.Iot.Operations.ProtocolCompiler.csproj @@ -0,0 +1,21 @@ + + + + Exe + net9.0 + enable + + + + + + + + + + + + + + + diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs new file mode 100644 index 0000000000..fe03cf7eb9 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs @@ -0,0 +1,197 @@ +namespace Azure.Iot.Operations.ProtocolCompiler +{ + using System; + using System.Collections.Generic; + using System.IO; + using System.Linq; + using System.Text.RegularExpressions; + using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.EnvoyGenerator; + using Azure.Iot.Operations.TDParser; + using Azure.Iot.Operations.TDParser.Model; + using Azure.Iot.Operations.TypeGenerator; + using Azure.Iot.Operations.SchemaGenerator; + + internal class CommandHandler + { + private static readonly Dictionary LanguageMap = new() + { + { "csharp", TargetLanguage.CSharp }, + { "rust", TargetLanguage.Rust }, + }; + + public static readonly string[] SupportedLanguages = LanguageMap.Keys.ToArray(); + + public static int GenerateCode(OptionContainer options) + { + try + { + WarnOnSuspiciousOptions(options); + + if (!TryConfirmValidOptions(options)) + { + return 1; + } + + // TODO must do something with these + // The formats must be inferred from the file names + // Should I copy them to the working dir? + FileInfo[] extSchemaFiles = options.ExtSchemaFiles.SelectMany(fs => Directory.GetFiles(Path.GetDirectoryName(fs) ?? string.Empty, Path.GetFileName(fs)), (_, f) => new FileInfo(f)).ToArray(); + + string projectName = LegalizeProjectName(options.OutputDir.Name); + TargetLanguage targetLanguage = LanguageMap[options.Language.ToLowerInvariant()]; + + List parsedThings = ParseThings(options.ThingFiles); + + Dictionary> generatedSchemas = SchemaGenerator.GenerateSchemas(parsedThings, projectName, options.GenNamespace); + foreach (List schemas in generatedSchemas.Values) + { + WriteItems(schemas, options.WorkingDir); + } + + List generatedTypes = new(); + foreach (KeyValuePair> schemaSet in generatedSchemas) + { + Dictionary schemaTextsByName = schemaSet.Value.ToDictionary(s => s.FileName, s => s.Content); + TypeGenerator typeGenerator = new TypeGenerator(schemaSet.Key, targetLanguage); + generatedTypes.AddRange(typeGenerator.GenerateTypes(schemaTextsByName, new CodeName(options.GenNamespace), projectName, options.OutputSourceSubdir)); + } + WriteItems(generatedTypes, options.OutputDir); + + List typeNames = generatedTypes.Select(gt => Path.GetFileNameWithoutExtension(gt.FileName)).ToList(); + + string? sdkPath = options.SdkPath != null ? Path.GetRelativePath(options.OutputDir.FullName, options.SdkPath) : null; + + List generatedEnvoys = EnvoyGenerator.GenerateEnvoys( + parsedThings, + generatedSchemas.Keys.ToList(), + targetLanguage, + options.GenNamespace, + projectName, + sdkPath, + typeNames, + options.OutputSourceSubdir, + generateClient: !options.ServerOnly, + generateServer: !options.ClientOnly, + generateProject: !options.NoProj, + defaultImpl: options.DefaultImpl); + WriteItems(generatedEnvoys, options.OutputDir); + } + catch (Exception ex) + { + Console.WriteLine($"Code generation failed with exception: {ex.Message}"); + return 1; + } + + return 0; + } + + private static List ParseThings(FileInfo[] thingFiles) + { + List parsedThings = new(); + + foreach (FileInfo thingFile in thingFiles) + { + Console.Write($"Parsing thing description file: {thingFile.Name} ..."); + + using (StreamReader thingReader = thingFile.OpenText()) + { + string thingText = thingReader.ReadToEnd(); + List things = TDParser.ParseMultiple(thingText); + + foreach (TDThing thing in things) + { + string? schemaNamesFilename = thing.Links?.FirstOrDefault(l => l.Relation == TDValues.RelationSchemaNaming)?.Href; + string? schemaNameInfoText = schemaNamesFilename != null ? File.ReadAllText(Path.Combine(thingFile.DirectoryName!, schemaNamesFilename)) : null; + SchemaNamer schemaNamer = new SchemaNamer(schemaNameInfoText); + + parsedThings.Add(new ParsedThing(thing, schemaNamer)); + } + + Console.WriteLine($" {things.Count} {(things.Count == 1 ? "TD" : "TDs")} parsed"); + } + } + + return parsedThings; + } + + private static void WriteItems(List generatedItems, DirectoryInfo destDir) + { + foreach (GeneratedItem genItem in generatedItems) + { + DirectoryInfo folderPath = new DirectoryInfo(Path.Combine(destDir.FullName, genItem.FolderPath)); + if (!folderPath.Exists) + { + folderPath.Create(); + } + + string filePath = Path.Combine(folderPath.FullName, genItem.FileName); + File.WriteAllText(filePath, genItem.Content); + Console.WriteLine($" Generated {filePath}"); + } + } + + private static string LegalizeProjectName(string fsName) + { + return string.Join('.', fsName.Split('.', StringSplitOptions.RemoveEmptyEntries).Select(s => (char.IsNumber(s[0]) ? "_" : "") + Regex.Replace(s, "[^a-zA-Z0-9]+", "_", RegexOptions.CultureInvariant))); + } + + private static bool TryConfirmValidOptions(OptionContainer options) + { + if (options.ThingFiles.Length == 0) + { + Console.WriteLine("No Thing Description files specified."); + Console.WriteLine("Use option --help for CLI usage and options."); + return false; + } + + if (!SupportedLanguages.Contains(options.Language)) + { + Console.WriteLine($"language \"{options.Language}\" not recognized. Language must be {string.Join(" or ", SupportedLanguages.Select(l => $"'{l}'"))}"); + return false; + } + + if (options.ClientOnly && options.ServerOnly) + { + Console.WriteLine("options --clientOnly and --serverOnly are mutually exclusive"); + return false; + } + + if (options.ThingFiles.Any(mf => !mf.Exists)) + { + Console.WriteLine("All Thing Description files must exist. Non-existent files specified:"); + foreach (FileInfo f in options.ThingFiles.Where(tf => !tf.Exists)) + { + Console.WriteLine($" {f.FullName}"); + } + return false; + } + + return true; + } + + private static void WarnOnSuspiciousOptions(OptionContainer options) + { + if (!options.WorkingDir.Exists) + { + WarnOnSuspiciousOption("workingDir", options.WorkingDir.Name); + } + + if (!options.OutputDir.Exists) + { + WarnOnSuspiciousOption("outDir", options.OutputDir.Name); + } + + WarnOnSuspiciousOption("namespace", options.GenNamespace); + WarnOnSuspiciousOption("sdkPath", options.SdkPath); + } + + private static void WarnOnSuspiciousOption(string optionName, string? pathName) + { + if (pathName != null && pathName.StartsWith("--")) + { + Console.WriteLine($"Warning: {optionName} \"{pathName}\" looks like a flag. Did you forget to specify a value?"); + } + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/OptionContainer.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/OptionContainer.cs new file mode 100644 index 0000000000..3f1f4662a6 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/OptionContainer.cs @@ -0,0 +1,46 @@ +namespace Azure.Iot.Operations.ProtocolCompiler +{ + using System.IO; + + /// + /// Custom container for holding CLI options. + /// + public class OptionContainer + { + /// Gets or sets the file(s) containing WoT Thing Description(s) to process. + public required FileInfo[] ThingFiles { get; set; } + + /// Gets or sets the filespec(s) of files containing external schema definitions. + public required string[] ExtSchemaFiles { get; set; } + + /// Gets or sets the directory for storing temporary files. + public required DirectoryInfo WorkingDir { get; set; } + + /// Gets or sets the directory for receiving generated code. + public required DirectoryInfo OutputDir { get; set; } + + /// Gets or sets a subdirectory under OutputDir for generated source code. + public required string OutputSourceSubdir { get; set; } + + /// Gets or sets a namespace for generated code. + public required string GenNamespace { get; set; } + + /// Gets or sets a local path or feed URL for Azure.Iot.Operations.Protocol SDK. + public string? SdkPath { get; set; } + + /// Gets or sets the programming language for generated code. + public required string Language { get; set; } + + /// Gets or sets an indication of whether to generate only client-side code. + public bool ClientOnly { get; set; } + + /// Gets or sets an indication of whether to generate only server-side code. + public bool ServerOnly { get; set; } + + /// Gets or sets an indication of whether to suppress generation of a project. + public bool NoProj { get; set; } + + /// Gets or sets an indication of whether to substitute virtual methods for abstract methods. + public bool DefaultImpl { get; set; } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/Program.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/Program.cs new file mode 100644 index 0000000000..aa69aba85c --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/Program.cs @@ -0,0 +1,112 @@ +namespace Azure.Iot.Operations.ProtocolCompiler +{ + using System; + using System.CommandLine; + using System.IO; + + internal class Program + { + private static readonly string DefaultOutDir = "."; + private static readonly string DefaultWorkingDir = "schemas"; + private static readonly string DefaultNamespace = "Generated"; + + static void Main(string[] args) + { + var thingFilesOption = new Option( + name: "--thingFiles", + description: "File(s) containing WoT Thing Description(s) to process") + { ArgumentHelpName = "FILEPATH ...", AllowMultipleArgumentsPerToken = true }; + + var extSchemasOption = new Option( + name: "--extSchemas", + description: "Filespec(s) of files containing external schema definitions (each may include wildcards).") + { ArgumentHelpName = "FILESPEC ...", AllowMultipleArgumentsPerToken = true }; + + var outDirOption = new Option( + name: "--outDir", + getDefaultValue: () => new DirectoryInfo(DefaultOutDir), + description: "Directory for receiving generated code") + { ArgumentHelpName = "DIRPATH" }; + + var workingDirOption = new Option( + name: "--workingDir", + getDefaultValue: () => DefaultWorkingDir, + description: "Directory for storing temporary files (relative to outDir unless path is rooted)") + { ArgumentHelpName = "DIRPATH" }; + + var srcSubdirOption = new Option( + name: "--srcSubdir", + getDefaultValue: () => string.Empty, + description: "Subdirectory under OutputDir for generated source code") + { ArgumentHelpName = "SUBDIR" }; + + var namespaceOption = new Option( + name: "--namespace", + getDefaultValue: () => DefaultNamespace, + description: "Namespace for generated code") + { ArgumentHelpName = "NAMESPACE" }; + + var sdkPathOption = new Option( + name: "--sdkPath", + description: "Local path or feed URL for Azure.Iot.Operations.Protocol SDK") + { ArgumentHelpName = "FILEPATH | URL" }; + + var langOption = new Option( + name: "--lang", + description: "Programming language for generated code") + { ArgumentHelpName = string.Join('|', CommandHandler.SupportedLanguages) }; + + var clientOnlyOption = new Option( + name: "--clientOnly", + description: "Generate only client-side code"); + + var serverOnlyOption = new Option( + name: "--serverOnly", + description: "Generate only server-side code"); + + var noProjOption = new Option( + name: "--noProj", + description: "Do not generate code in a project"); + + var defaultImplOption = new Option( + name: "--defaultImpl", + description: "Generate default implementations of user-level callbacks"); + + var rootCommand = new RootCommand("Akri MQTT code generation tool for WoT Thing Descriptions") + { + thingFilesOption, + extSchemasOption, + outDirOption, + workingDirOption, + srcSubdirOption, + namespaceOption, + sdkPathOption, + langOption, + clientOnlyOption, + serverOnlyOption, + noProjOption, + defaultImplOption, + }; + + ArgBinder argBinder = new ArgBinder( + thingFilesOption, + extSchemasOption, + outDirOption, + workingDirOption, + srcSubdirOption, + namespaceOption, + sdkPathOption, + langOption, + clientOnlyOption, + serverOnlyOption, + noProjOption, + defaultImplOption); + + rootCommand.SetHandler( + (OptionContainer options) => { Environment.ExitCode = CommandHandler.GenerateCode(options); }, + argBinder); + + rootCommand.Invoke(args); + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs index 82f5ea038d..50ea0ec86b 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs @@ -9,13 +9,6 @@ internal static class ActionSchemaGenerator { internal static void GenerateActionSchemas(TDThing tdThing, SchemaNamer schemaNamer, string projectName, Dictionary schemaSpecs, Dictionary> referencedSchemas) { - Dictionary readValueFields = new(); - Dictionary writeValueFields = new(); - Dictionary readErrorFields = new(); - Dictionary writeErrorFields = new(); - HashSet readErrorSchemaNames = new(); - HashSet writeErrorSchemaNames = new(); - if (tdThing.Actions != null) { foreach (KeyValuePair propKvp in tdThing.Actions) @@ -41,13 +34,14 @@ private static void ProcessAction( Dictionary schemaSpecs, Dictionary> referencedSchemas) { - FormInfo? actionForm = FormInfo.CreateFromForm(tdAction.Forms?.FirstOrDefault(f => f.Op == TDValues.OpInvokeAction || f.Op == TDValues.OpQueryAction), schemaDefinitions); + FormInfo? actionForm = FormInfo.CreateFromForm(tdAction.Forms?.FirstOrDefault(f => (f.Op?.Values.Contains(TDValues.OpInvokeAction) ?? false) || (f.Op?.Values.Contains(TDValues.OpQueryAction) ?? false)), schemaDefinitions); + actionForm ??= FormInfo.CreateFromForm(tdAction.Forms?.FirstOrDefault(f => f.Op == null), schemaDefinitions); if (actionForm?.TopicPattern != null) { if (tdAction.Input != null) { - string inputSchemaName = tdAction.Input.Title ?? schemaNamer.GetActionInSchema(actionName); + string inputSchemaName = schemaNamer.GetActionInSchema(tdAction.Input.Title, actionName); ObjectSpec inputObjectSpec = ObjectSpec.CreateFromDataSchema(schemaNamer, tdAction.Input, actionForm.Format, inputSchemaName, tdAction.Input.Description ?? $"Input arguments for action '{actionName}'"); schemaSpecs[inputSchemaName] = inputObjectSpec; } @@ -55,18 +49,18 @@ private static void ProcessAction( Dictionary responseFields = new(); if (tdAction.Output != null) { - string outputSchemaName = tdAction.Output.Title ?? schemaNamer.GetActionOutSchema(actionName); + string outputSchemaName = schemaNamer.GetActionOutSchema(tdAction.Output.Title, actionName); ObjectSpec outputObjectSpec = ObjectSpec.CreateFromDataSchema(schemaNamer, tdAction.Output, actionForm.Format, outputSchemaName, tdAction.Output.Description ?? $"Output arguments for action '{actionName}'"); schemaSpecs[outputSchemaName] = outputObjectSpec; responseFields = outputObjectSpec.Fields.ToDictionary(f => f.Key, f => f.Value with { Require = false }); } - if (actionForm?.ErrorSchema != null) + if (actionForm?.ErrorRespSchema != null) { - responseFields[schemaNamer.ActionRespErrorField] = new FieldSpec( + responseFields[schemaNamer.GetActionRespErrorField(actionName, actionForm.ErrorRespName!)] = new FieldSpec( tdAction.Description ?? $"Read error for the '{actionName}' Action.", - actionForm.ErrorSchema, - BackupSchemaName: actionForm.ErrorSchemaName!, + actionForm.ErrorRespSchema, + BackupSchemaName: actionForm.ErrorRespName!, Require: false); string respSchemaName = schemaNamer.GetActionRespSchema(actionName); @@ -77,12 +71,17 @@ private static void ProcessAction( respSchemaName); schemaSpecs[respSchemaName] = propReadRespObjectSpec; - SchemaGenerationSupport.AddSchemaReference(actionForm.ErrorSchemaName!, actionForm.ErrorSchemaFormat, referencedSchemas); + SchemaGenerationSupport.AddSchemaReference(actionForm.ErrorRespName!, actionForm.ErrorRespFormat, referencedSchemas); + } + + if (actionForm?.HeaderInfoSchema != null) + { + SchemaGenerationSupport.AddSchemaReference(actionForm.HeaderInfoName!, actionForm.HeaderInfoFormat, referencedSchemas); } - if (actionForm?.HeaderSchema != null) + if (actionForm?.HeaderCodeSchema != null) { - SchemaGenerationSupport.AddSchemaReference(actionForm.HeaderSchemaName!, actionForm.HeaderSchemaFormat, referencedSchemas); + SchemaGenerationSupport.AddSchemaReference(actionForm.HeaderCodeName!, SerializationFormat.Json, referencedSchemas); } } } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EnumSpec.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EnumSpec.cs index 79d66d4760..adae27b153 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EnumSpec.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EnumSpec.cs @@ -8,9 +8,9 @@ internal record EnumSpec(string? Description, List Values, SerializationFormat Format, string SchemaName) : SchemaSpec(Format) { - internal static EnumSpec CreateFromDataSchema(TDDataSchema dataSchema, SerializationFormat format, string backupName, string? defaultDescription = null) + internal static EnumSpec CreateFromDataSchema(SchemaNamer schemaNamer, TDDataSchema dataSchema, SerializationFormat format, string backupName, string? defaultDescription = null) { - string schemaName = dataSchema.Title ?? backupName; + string schemaName = schemaNamer.ApplyBackupSchemaName(dataSchema.Title, backupName); if (dataSchema.Type != TDValues.TypeString || dataSchema.Enum == null) { diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EventSchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EventSchemaGenerator.cs index 57f8467c93..ab2e0050da 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EventSchemaGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EventSchemaGenerator.cs @@ -9,7 +9,7 @@ internal static class EventSchemaGenerator { internal static void GenerateEventSchemas(TDThing tdThing, SchemaNamer schemaNamer, string projectName, Dictionary schemaSpecs, Dictionary> referencedSchemas) { - FormInfo? subAllEventsForm = FormInfo.CreateFromForm(tdThing.Forms?.FirstOrDefault(f => f.Op == TDValues.OpSubAllEvents), tdThing.SchemaDefinitions); + FormInfo? subAllEventsForm = FormInfo.CreateFromForm(tdThing.Forms?.FirstOrDefault(f => f.Op?.Values.Contains(TDValues.OpSubAllEvents) ?? false), tdThing.SchemaDefinitions); Dictionary valueFields = new(); @@ -44,7 +44,8 @@ private static void ProcessEvent( Dictionary schemaSpecs, Dictionary valueFields) { - FormInfo? subEventForm = FormInfo.CreateFromForm(tdEvent.Forms?.FirstOrDefault(f => f.Op == TDValues.OpSubEvent), schemaDefinitions); + FormInfo? subEventForm = FormInfo.CreateFromForm(tdEvent.Forms?.FirstOrDefault(f => f.Op?.Values.Contains(TDValues.OpSubEvent) ?? false), schemaDefinitions); + subEventForm ??= FormInfo.CreateFromForm(tdEvent.Forms?.FirstOrDefault(f => f.Op == null), schemaDefinitions); FieldSpec dataFieldSpec = new( tdEvent.Description ?? $"The '{eventName}' Event data value.", diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/FieldSpec.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/FieldSpec.cs index 3187c5dc40..7c7de783d9 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/FieldSpec.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/FieldSpec.cs @@ -3,7 +3,7 @@ using Azure.Iot.Operations.CodeGeneration; using Azure.Iot.Operations.TDParser.Model; - internal record FieldSpec(string Description, TDDataSchema Schema, bool Require, string BackupSchemaName, bool Fragment = false) + internal record FieldSpec(string Description, TDDataSchema Schema, bool Require, string BackupSchemaName, bool Fragment = false, bool ForceOption = false) { internal static FieldSpec CreateFixed(string title, string description, string backupSchemaName) { diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/GeneratedSchema.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/GeneratedSchema.cs deleted file mode 100644 index 8f8caf1add..0000000000 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/GeneratedSchema.cs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Azure.Iot.Operations.SchemaGenerator -{ - public record GeneratedSchema(string Content, string FileName, string FolderPath); -} diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ISchemaTemplateTransform.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ISchemaTemplateTransform.cs index 3e1ebc6e78..a541b031a5 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ISchemaTemplateTransform.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ISchemaTemplateTransform.cs @@ -1,7 +1,11 @@ namespace Azure.Iot.Operations.SchemaGenerator { + using Azure.Iot.Operations.CodeGeneration; + internal interface ISchemaTemplateTransform { + SerializationFormat Format { get; } + string FileName { get; } string FolderPath { get; } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ObjectSpec.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ObjectSpec.cs index bf2f727859..c359507a66 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ObjectSpec.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ObjectSpec.cs @@ -10,7 +10,7 @@ internal record ObjectSpec(string? Description, Dictionary Fi { internal static ObjectSpec CreateFromDataSchema(SchemaNamer schemaNamer, TDDataSchema dataSchema, SerializationFormat format, string backupName, string? defaultDescription = null) { - string schemaName = dataSchema.Title ?? backupName; + string schemaName = schemaNamer.ApplyBackupSchemaName(dataSchema.Title, backupName); if (dataSchema.Type != TDValues.TypeObject) { @@ -20,7 +20,7 @@ internal static ObjectSpec CreateFromDataSchema(SchemaNamer schemaNamer, TDDataS Dictionary fieldSpecs = new(); foreach (KeyValuePair property in dataSchema.Properties ?? new Dictionary()) { - fieldSpecs[property.Key] = new FieldSpec(property.Key, property.Value, Require: dataSchema.Required?.Contains(property.Key) ?? false, schemaNamer.GetBackupSchemaName(schemaName, property.Key)); + fieldSpecs[property.Key] = new FieldSpec(property.Value.Description ?? $"The '{property.Key}' Field.", property.Value, Require: dataSchema.Required?.Contains(property.Key) ?? false, schemaNamer.GetBackupSchemaName(schemaName, property.Key)); } return new ObjectSpec(dataSchema.Description ?? defaultDescription, fieldSpecs, format, schemaName); diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/PropertySchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/PropertySchemaGenerator.cs index 7997f0ce98..8fb20cdaac 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/PropertySchemaGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/PropertySchemaGenerator.cs @@ -9,8 +9,8 @@ internal static class PropertySchemaGenerator { internal static void GeneratePropertySchemas(TDThing tdThing, SchemaNamer schemaNamer, string projectName, Dictionary schemaSpecs, Dictionary> referencedSchemas) { - FormInfo? readAllPropsForm = FormInfo.CreateFromForm(tdThing.Forms?.FirstOrDefault(f => f.Op == TDValues.OpReadAllProps), tdThing.SchemaDefinitions); - FormInfo? writeMultPropsForm = FormInfo.CreateFromForm(tdThing.Forms?.FirstOrDefault(f => f.Op == TDValues.OpWriteMultProps), tdThing.SchemaDefinitions); + FormInfo? readAllPropsForm = FormInfo.CreateFromForm(tdThing.Forms?.FirstOrDefault(f => f.Op?.Values.Contains(TDValues.OpReadAllProps) ?? false), tdThing.SchemaDefinitions); + FormInfo? writeMultPropsForm = FormInfo.CreateFromForm(tdThing.Forms?.FirstOrDefault(f => f.Op?.Values.Contains(TDValues.OpWriteMultProps) ?? false), tdThing.SchemaDefinitions); Dictionary readValueFields = new(); Dictionary writeValueFields = new(); @@ -31,12 +31,23 @@ internal static void GeneratePropertySchemas(TDThing tdThing, SchemaNamer schema tdThing.SchemaDefinitions, schemaSpecs, readValueFields, - writeValueFields, readErrorFields, - writeErrorFields, referencedSchemas, readErrorSchemaNames, - writeErrorSchemaNames); + isRead: true); + + ProcessProperty( + schemaNamer, + propKvp.Key, + propKvp.Value, + projectName, + tdThing.SchemaDefinitions, + schemaSpecs, + writeValueFields, + writeErrorFields, + referencedSchemas, + writeErrorSchemaNames, + isRead: false); } } @@ -79,105 +90,73 @@ private static void ProcessProperty( string projectName, Dictionary? schemaDefinitions, Dictionary schemaSpecs, - Dictionary readValueFields, - Dictionary writeValueFields, - Dictionary readErrorFields, - Dictionary writeErrorFields, + Dictionary valueFields, + Dictionary errorFields, Dictionary> referencedSchemas, - HashSet readErrorSchemaNames, - HashSet writeErrorSchemaNames) + HashSet errorSchemaNames, + bool isRead) { - FormInfo? readPropForm = FormInfo.CreateFromForm(tdProperty.Forms?.FirstOrDefault(f => f.Op == TDValues.OpReadProp), schemaDefinitions); - FormInfo? writePropForm = FormInfo.CreateFromForm(tdProperty.Forms?.FirstOrDefault(f => f.Op == TDValues.OpWriteProp), schemaDefinitions); + if (tdProperty.ReadOnly && !isRead) + { + return; + } + + string operation = isRead ? TDValues.OpReadProp : TDValues.OpWriteProp; + FormInfo? propForm = FormInfo.CreateFromForm(tdProperty.Forms?.FirstOrDefault(f => f.Op?.Values.Contains(operation) ?? false), schemaDefinitions); + propForm ??= FormInfo.CreateFromForm(tdProperty.Forms?.FirstOrDefault(f => f.Op == null), schemaDefinitions); FieldSpec propFieldSpec = new( - tdProperty.Description ?? $"The '{propName}' Property value.", + tdProperty.Description ?? (isRead ? $"The '{propName}' Property value." : $"Value for the '{propName}' Property."), tdProperty as TDDataSchema, BackupSchemaName: schemaNamer.GetPropValueSchema(propName), - Require: true, + Require: isRead, Fragment: tdProperty.Placeholder); - readValueFields[propName] = propFieldSpec; + valueFields[propName] = propFieldSpec; - if (readPropForm?.TopicPattern != null) + if (propForm?.TopicPattern != null && (isRead || tdProperty.Placeholder)) { - string propSchemaName = schemaNamer.GetPropSchema(propName); + string propSchemaName = isRead ? schemaNamer.GetPropSchema(propName) : schemaNamer.GetWritablePropSchema(propName); ObjectSpec propObjectSpec = new( - tdProperty.Description ?? $"Container for the '{propName}' Property.", + tdProperty.Description ?? $"Container for{(isRead ? "" : "writing to")} the '{propName}' Property.", new Dictionary { { propName, propFieldSpec } }, - readPropForm.Format, + propForm.Format, propSchemaName); schemaSpecs[propSchemaName] = propObjectSpec; } - if (readPropForm?.ErrorSchema != null) + if (propForm?.ErrorRespSchema != null) { - FieldSpec propReadRespFieldSpec = new( - tdProperty.Description ?? $"Read error for the '{propName}' Property.", - readPropForm.ErrorSchema, - BackupSchemaName: readPropForm.ErrorSchemaName!, + FieldSpec respFieldSpec = new( + tdProperty.Description ?? $"{(isRead ? "Read" : "Write")} error for the '{propName}' Property.", + propForm.ErrorRespSchema, + BackupSchemaName: propForm.ErrorRespName!, Require: false); - readErrorFields[propName] = propReadRespFieldSpec; - - readErrorSchemaNames.Add(readPropForm.ErrorSchemaName!); - - if (readPropForm?.TopicPattern != null) - { - string propReadRespSchemaName = schemaNamer.GetPropReadRespSchema(propName); - ObjectSpec propReadRespObjectSpec = new( - tdProperty.Description ?? $"Response to a '{propName}' Property read.", - new Dictionary { { propName, propFieldSpec with { Require = false } }, { schemaNamer.PropRespErrorField, propReadRespFieldSpec } }, - readPropForm.Format, - propReadRespSchemaName); - schemaSpecs[propReadRespSchemaName] = propReadRespObjectSpec; - - SchemaGenerationSupport.AddSchemaReference(readPropForm.ErrorSchemaName!, readPropForm.ErrorSchemaFormat, referencedSchemas); - } - } + errorFields[propName] = respFieldSpec; - if (!tdProperty.ReadOnly) - { - FieldSpec writablePropFieldSpec = new( - tdProperty.Description ?? $"Value for the '{propName}' Property.", - tdProperty as TDDataSchema, - BackupSchemaName: schemaNamer.GetPropValueSchema(propName), - Require: false, - Fragment: tdProperty.Placeholder); - writeValueFields[propName] = writablePropFieldSpec; - - if (tdProperty.Placeholder && writePropForm?.TopicPattern != null) - { - string writablePropSchemaName = schemaNamer.GetWritablePropSchema(propName); - ObjectSpec writablePropObjectSpec = new( - tdProperty.Description ?? $"Container for writing to the '{propName}' Property.", - new Dictionary { { propName, writablePropFieldSpec } }, - writePropForm.Format, - writablePropSchemaName); - schemaSpecs[writablePropSchemaName] = writablePropObjectSpec; - } + errorSchemaNames.Add(propForm.ErrorRespName!); - if (writePropForm?.ErrorSchema != null) + if (propForm?.TopicPattern != null) { - FieldSpec propWriteRespFieldSpec = new( - tdProperty.Description ?? $"Write error for the '{propName}' Property.", - writePropForm.ErrorSchema, - BackupSchemaName: writePropForm.ErrorSchemaName!, - Require: false); - writeErrorFields[propName] = propWriteRespFieldSpec; - - writeErrorSchemaNames.Add(writePropForm.ErrorSchemaName!); - - if (writePropForm?.TopicPattern != null) + Dictionary responseFields = new(); + if (isRead) { - string propWriteRespSchemaName = schemaNamer.GetPropWriteRespSchema(propName); - ObjectSpec propWriteRespObjectSpec = new( - tdProperty.Description ?? $"Response to a '{propName}' Property write.", - new Dictionary { { schemaNamer.PropRespErrorField, propWriteRespFieldSpec } }, - writePropForm.Format, - propWriteRespSchemaName); - schemaSpecs[propWriteRespSchemaName] = propWriteRespObjectSpec; - - SchemaGenerationSupport.AddSchemaReference(writePropForm.ErrorSchemaName!, writePropForm.ErrorSchemaFormat, referencedSchemas); + responseFields[propName] = propFieldSpec with { ForceOption = true }; + responseFields[schemaNamer.GetPropReadRespErrorField(propName, propForm.ErrorRespName!)] = respFieldSpec; } + else + { + responseFields[schemaNamer.GetPropWriteRespErrorField(propName, propForm.ErrorRespName!)] = respFieldSpec; + } + + string respSchemaName = isRead ? schemaNamer.GetPropReadRespSchema(propName) : schemaNamer.GetPropWriteRespSchema(propName); + ObjectSpec respObjectSpec = new( + tdProperty.Description ?? $"Response to a '{propName}' Property {(isRead ? "read" : "write")}.", + responseFields, + propForm.Format, + respSchemaName); + schemaSpecs[respSchemaName] = respObjectSpec; + + SchemaGenerationSupport.AddSchemaReference(propForm.ErrorRespName!, propForm.ErrorRespFormat, referencedSchemas); } } } @@ -209,7 +188,7 @@ private static void GenerateCollectiveResponseObject( propsSchema); } - if (topLevelPropsForm.HasErrorResponse && errorFields.Any()) + if (topLevelPropsForm.HasErrorResponse) { schemaSpecs[errorSchema] = new ObjectSpec( $"Errors from any Property {operation}.", diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs index 3cfb6338c3..369191e04b 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs @@ -7,22 +7,53 @@ public static class SchemaGenerator { - public static List GenerateSchemas(TDThing tdThing, SchemaNamer schemaNamer, string projectName, string genNamespace) + public static Dictionary> GenerateSchemas(List parsedThings, string projectName, string genNamespace) { - Dictionary schemaSpecs = new(); - Dictionary> referencedSchemas = new(); + Dictionary transforms = new(); - PropertySchemaGenerator.GeneratePropertySchemas(tdThing, schemaNamer, projectName, schemaSpecs, referencedSchemas); - ActionSchemaGenerator.GenerateActionSchemas(tdThing, schemaNamer, projectName, schemaSpecs, referencedSchemas); - EventSchemaGenerator.GenerateEventSchemas(tdThing, schemaNamer, projectName, schemaSpecs, referencedSchemas); + foreach (ParsedThing parsedThing in parsedThings) + { + Dictionary schemaSpecs = new(); + Dictionary> referencedSchemas = new(); + + PropertySchemaGenerator.GeneratePropertySchemas(parsedThing.Thing, parsedThing.SchemaNamer, projectName, schemaSpecs, referencedSchemas); + ActionSchemaGenerator.GenerateActionSchemas(parsedThing.Thing, parsedThing.SchemaNamer, projectName, schemaSpecs, referencedSchemas); + EventSchemaGenerator.GenerateEventSchemas(parsedThing.Thing, parsedThing.SchemaNamer, projectName, schemaSpecs, referencedSchemas); + + Dictionary closedSchemaSpecs = ComputeClosedSchemaSpecs(parsedThing.Thing, parsedThing.SchemaNamer, schemaSpecs, referencedSchemas); + + foreach (KeyValuePair schemaSpec in closedSchemaSpecs) + { + ISchemaTemplateTransform transform = SchemaTransformFactory.GetSchemaTransform(parsedThing.SchemaNamer, schemaSpec.Key, schemaSpec.Value, genNamespace); + transforms[transform.FileName] = transform; + } + } + + Dictionary> generatedSchemas = new(); + + foreach (KeyValuePair transform in transforms) + { + if (!generatedSchemas.TryGetValue(transform.Value.Format, out List? schemas)) + { + schemas = new(); + generatedSchemas[transform.Value.Format] = schemas; + } + + schemas.Add(new GeneratedItem(transform.Value.TransformText(), transform.Key, transform.Value.FolderPath)); + } + + return generatedSchemas; + } + private static Dictionary ComputeClosedSchemaSpecs(TDThing thing, SchemaNamer schemaNamer, Dictionary schemaSpecs, Dictionary> referencedSchemas) + { Dictionary closedSchemaSpecs = new(); foreach (KeyValuePair> referencedSchema in referencedSchemas) { foreach (SerializationFormat format in referencedSchema.Value) { - if (tdThing.SchemaDefinitions?.TryGetValue(referencedSchema.Key, out TDDataSchema? dataSchema) ?? false) + if (thing.SchemaDefinitions?.TryGetValue(referencedSchema.Key, out TDDataSchema? dataSchema) ?? false) { ComputeClosureOfDataSchema(schemaNamer, referencedSchema.Key, dataSchema, format, closedSchemaSpecs); } @@ -34,21 +65,7 @@ public static List GenerateSchemas(TDThing tdThing, SchemaNamer ComputeClosureOfSchemaSpec(schemaNamer, schemaSpec.Key, schemaSpec.Value, closedSchemaSpecs); } - List generatedSchemas = new(); - - foreach (KeyValuePair schemaSpec in closedSchemaSpecs) - { - ISchemaTemplateTransform schema = SchemaTransformFactory.GetSchemaTransform(schemaSpec.Key, schemaSpec.Value, genNamespace); - generatedSchemas.Add(new GeneratedSchema(schema.TransformText(), schema.FileName, schema.FolderPath)); - } - - if (tdThing.SchemaDefinitions?.Any(d => d.Value.Type == TDValues.TypeInteger && d.Value.Const != null) ?? false) - { - ISchemaTemplateTransform schema = new ConstSchema(projectName, tdThing.SchemaDefinitions, genNamespace); - generatedSchemas.Add(new GeneratedSchema(schema.TransformText(), schema.FileName, schema.FolderPath)); - } - - return generatedSchemas; + return closedSchemaSpecs; } private static void ComputeClosureOfSchemaSpec(SchemaNamer schemaNamer, string schemaName, SchemaSpec schemaSpec, Dictionary closedSchemaSpecs) @@ -76,7 +93,7 @@ private static void ComputeClosureOfDataSchema(SchemaNamer schemaNamer, string b return; } - string schemaName = dataSchema.Title ?? backupName; + string schemaName = schemaNamer.ApplyBackupSchemaName(dataSchema.Title, backupName); if (SchemaSpec.TryCreateFromDataSchema(schemaNamer, dataSchema, format, backupName, out SchemaSpec? schemaSpec)) { diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaSpec.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaSpec.cs index 1338ccbb40..f4ddd00b0f 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaSpec.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaSpec.cs @@ -15,7 +15,7 @@ internal static bool TryCreateFromDataSchema(SchemaNamer schemaNamer, TDDataSche } else if (dataSchema.Type == TDValues.TypeString && dataSchema.Enum != null) { - schemaSpec = EnumSpec.CreateFromDataSchema(dataSchema, format, backupName); + schemaSpec = EnumSpec.CreateFromDataSchema(schemaNamer, dataSchema, format, backupName); return true; } else diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaTransformFactory.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaTransformFactory.cs index bdab53cb70..cc9e197ecf 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaTransformFactory.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaTransformFactory.cs @@ -5,21 +5,21 @@ namespace Azure.Iot.Operations.SchemaGenerator internal static class SchemaTransformFactory { - internal static ISchemaTemplateTransform GetSchemaTransform(string schemaName, SchemaSpec schemaSpec, string genNamespace) + internal static ISchemaTemplateTransform GetSchemaTransform(SchemaNamer schemaNamer, string schemaName, SchemaSpec schemaSpec, string genNamespace) { return schemaSpec switch { - ObjectSpec objectSpec => GetObjectSchemaTransform(schemaName, objectSpec, genNamespace), + ObjectSpec objectSpec => GetObjectSchemaTransform(schemaNamer, schemaName, objectSpec, genNamespace), EnumSpec enumSpec => GetEnumSchemaTransform(schemaName, enumSpec, genNamespace), _ => throw new NotSupportedException($"Unable to transform schema spec of type {schemaSpec.GetType()}."), }; } - internal static ISchemaTemplateTransform GetObjectSchemaTransform(string schemaName, ObjectSpec objectSpec, string genNamespace) + internal static ISchemaTemplateTransform GetObjectSchemaTransform(SchemaNamer schemaNamer, string schemaName, ObjectSpec objectSpec, string genNamespace) { return objectSpec.Format switch { - SerializationFormat.Json => new ObjectJsonSchema(schemaName, objectSpec, genNamespace), + SerializationFormat.Json => new ObjectJsonSchema(schemaNamer, schemaName, objectSpec, genNamespace), _ => throw new NotSupportedException($"Serialization format {objectSpec.Format} is not supported."), }; } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/free/code/ConstSchema.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/free/code/ConstSchema.cs deleted file mode 100644 index 168e1fd044..0000000000 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/free/code/ConstSchema.cs +++ /dev/null @@ -1,25 +0,0 @@ -namespace Azure.Iot.Operations.SchemaGenerator -{ - using System.Collections.Generic; - using System.Linq; - using Azure.Iot.Operations.CodeGeneration; - using Azure.Iot.Operations.TDParser.Model; - - public partial class ConstSchema : ISchemaTemplateTransform - { - string name; - List<(string, int)> constValues; - string genNamespace; - - internal ConstSchema(string name, Dictionary schemaDefinitions, string genNamespace) - { - this.name = name; - this.constValues = schemaDefinitions.Where(d => d.Value.Type == TDValues.TypeInteger && d.Value.Const != null).Select(d => (d.Key, (int)d.Value.Const!)).OrderBy(d => d.Item2).ToList(); - this.genNamespace = genNamespace; - } - - public string FileName { get => $"{this.name}.const.json"; } - - public string FolderPath { get => this.genNamespace; } - } -} diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/free/t4/ConstSchema.tt b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/free/t4/ConstSchema.tt deleted file mode 100644 index 70e139fcc8..0000000000 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/free/t4/ConstSchema.tt +++ /dev/null @@ -1,8 +0,0 @@ -<#@ template language="C#" linePragmas="false" #> -<#@ import namespace="System.Collections.Generic" #> -<#@ import namespace="Azure.Iot.Operations.TDParser.Model" #> -{ -<# int ix = 1; foreach ((string, int) constValue in this.constValues) { #> - "<#=constValue.Item1#>": <#=constValue.Item2#><#=ix < this.constValues.Count ? "," : ""#> -<# ix++; } #> -} diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs index 8c87745614..f8fdd64538 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs @@ -17,20 +17,20 @@ internal static string GetFragmented(string typeAndAddenda, bool require) return $"\"type\": \"object\", \"additionalProperties\": {{ {addProps} }}"; } - internal static string GetTypeAndAddenda(TDDataSchema tdSchema, string? backupSchemaName) + internal static string GetTypeAndAddenda(SchemaNamer schemaNamer, TDDataSchema tdSchema, string backupSchemaName) { if ((tdSchema.Type == TDValues.TypeObject && tdSchema.AdditionalProperties?.Boolean == false) || (tdSchema.Type == TDValues.TypeString && tdSchema.Enum != null)) { - return $"\"$ref\": \"{tdSchema.Title ?? backupSchemaName}.schema.json\""; + return $"\"$ref\": \"{schemaNamer.ApplyBackupSchemaName(tdSchema.Title, backupSchemaName)}.schema.json\""; } switch (tdSchema.Type ?? string.Empty) { case TDValues.TypeObject: - return $"\"type\": \"object\", \"additionalProperties\": {{ {GetTypeAndAddenda(tdSchema.AdditionalProperties!.DataSchema!, backupSchemaName)} }}"; + return $"\"type\": \"object\", \"additionalProperties\": {{ {GetTypeAndAddenda(schemaNamer, tdSchema.AdditionalProperties!.DataSchema!, backupSchemaName)} }}"; case TDValues.TypeArray: - string itemsProp = tdSchema.Items != null ? $", \"items\": {{ {GetTypeAndAddenda(tdSchema.Items, backupSchemaName)} }}" : string.Empty; + string itemsProp = tdSchema.Items != null ? $", \"items\": {{ {GetTypeAndAddenda(schemaNamer, tdSchema.Items, backupSchemaName)} }}" : string.Empty; return $"\"type\": \"array\"{itemsProp}"; case TDValues.TypeString: string formatProp = TDValues.FormatValues.Contains(tdSchema.Format ?? string.Empty) ? $", \"format\": \"{tdSchema.Format}\"" : @@ -43,8 +43,8 @@ internal static string GetTypeAndAddenda(TDDataSchema tdSchema, string? backupSc string numberFormat = tdSchema.Minimum >= -3.40e+38 && tdSchema.Maximum <= 3.40e+38 ? "float" : "double"; return $"\"type\": \"number\", \"format\": \"{numberFormat}\""; case TDValues.TypeInteger: - string minProp = tdSchema.Minimum != null ? $", \"minimum\": {(int)tdSchema.Minimum}" : string.Empty; - string maxProp = tdSchema.Maximum != null ? $", \"maximum\": {(int)tdSchema.Maximum}" : string.Empty; + string minProp = tdSchema.Minimum != null ? $", \"minimum\": {(long)tdSchema.Minimum}" : string.Empty; + string maxProp = tdSchema.Maximum != null ? $", \"maximum\": {(long)tdSchema.Maximum}" : string.Empty; return $"\"type\": \"integer\"{minProp}{maxProp}"; case TDValues.TypeBoolean: return @"""type"": ""boolean"""; diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/EnumJsonSchema.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/EnumJsonSchema.cs index 1cfac733a5..8851eee6b1 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/EnumJsonSchema.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/EnumJsonSchema.cs @@ -1,5 +1,7 @@ namespace Azure.Iot.Operations.SchemaGenerator { + using Azure.Iot.Operations.CodeGeneration; + public partial class EnumJsonSchema : ISchemaTemplateTransform { string schemaName; @@ -13,6 +15,8 @@ internal EnumJsonSchema(string schemaName, EnumSpec enumSpec, string genNamespac this.genNamespace = genNamespace; } + public SerializationFormat Format { get => SerializationFormat.Json; } + public string FileName { get => $"{this.schemaName}.schema.json"; } public string FolderPath { get => this.genNamespace; } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/ObjectJsonSchema.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/ObjectJsonSchema.cs index c8c88e3589..f22c00ec83 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/ObjectJsonSchema.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/ObjectJsonSchema.cs @@ -1,18 +1,24 @@ namespace Azure.Iot.Operations.SchemaGenerator { + using Azure.Iot.Operations.CodeGeneration; + public partial class ObjectJsonSchema : ISchemaTemplateTransform { + SchemaNamer schemaNamer; string schemaName; ObjectSpec objectSpec; string genNamespace; - internal ObjectJsonSchema(string schemaName, ObjectSpec objectSpec, string genNamespace) + internal ObjectJsonSchema(SchemaNamer schemaNamer, string schemaName, ObjectSpec objectSpec, string genNamespace) { + this.schemaNamer = schemaNamer; this.schemaName = schemaName; this.objectSpec = objectSpec; this.genNamespace = genNamespace; } + public SerializationFormat Format { get => SerializationFormat.Json; } + public string FileName { get => $"{this.schemaName}.schema.json"; } public string FolderPath { get => this.genNamespace; } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/ObjectJsonSchema.tt b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/ObjectJsonSchema.tt index 9abf2d5b3b..dfbbd43a9e 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/ObjectJsonSchema.tt +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/ObjectJsonSchema.tt @@ -10,16 +10,16 @@ "type": "object", "additionalProperties": false, <# if (this.objectSpec.Fields.Any(f => f.Value.Require || f.Value.Fragment)) { #> - "required": [ <#=string.Join(", ", this.objectSpec.Fields.Where(f => f.Value.Require || f.Value.Fragment).Select(f => $"\"{f.Key}\""))#> ], + "required": [ <#=string.Join(", ", this.objectSpec.Fields.Where(f => (f.Value.Require || f.Value.Fragment) && !f.Value.ForceOption).Select(f => $"\"{f.Key}\""))#> ], <# } #> "properties": { -<# int ix = 1; foreach (KeyValuePair field in this.objectSpec.Fields) { #> +<# int ix = 1; foreach (KeyValuePair field in this.objectSpec.Fields.OrderBy(field => field.Key)) { #> "<#=field.Key#>": { "description": "<#=field.Value.Description#>", <# if (field.Value.Fragment) { #> - <#=JsonSchemaSupport.GetFragmented(JsonSchemaSupport.GetTypeAndAddenda(field.Value.Schema, field.Value.BackupSchemaName), field.Value.Require)#> + <#=JsonSchemaSupport.GetFragmented(JsonSchemaSupport.GetTypeAndAddenda(this.schemaNamer, field.Value.Schema, field.Value.BackupSchemaName), field.Value.Require)#> <# } else { #> - <#=JsonSchemaSupport.GetTypeAndAddenda(field.Value.Schema, field.Value.BackupSchemaName)#> + <#=JsonSchemaSupport.GetTypeAndAddenda(this.schemaNamer, field.Value.Schema, field.Value.BackupSchemaName)#> <# } #> }<#=ix < this.objectSpec.Fields.Count ? "," : ""#> <# ix++; } #> diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs index e7c2367588..0f88527d97 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs @@ -16,7 +16,7 @@ public class TDDataSchema public string? Type { get; set; } [JsonPropertyName("const")] - public int? Const { get; set; } + public object? Const { get; set; } [JsonPropertyName("minimum")] public double? Minimum { get; set; } diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDForm.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDForm.cs index 5a02dd0781..f757c9c6d0 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDForm.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDForm.cs @@ -17,7 +17,7 @@ public class TDForm public TDSchemaReference[]? HeaderInfo { get; set; } [JsonPropertyName("dtv:headerCode")] - public string[]? HeaderCode { get; set; } + public string? HeaderCode { get; set; } [JsonPropertyName("dtv:serviceGroupId")] public string? ServiceGroupId { get; set; } @@ -26,6 +26,6 @@ public class TDForm public string? Topic { get; set; } [JsonPropertyName("op")] - public string? Op { get; set; } + public TDStringArray? Op { get; set; } } } diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDStringArray.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDStringArray.cs new file mode 100644 index 0000000000..f2a2e99fe6 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDStringArray.cs @@ -0,0 +1,50 @@ +namespace Azure.Iot.Operations.TDParser.Model +{ + using System; + using System.Collections.Generic; + using System.Linq; + using System.Text.Json; + using System.Text.Json.Serialization; + + public class TDStringArray + { + public List Values { get; set; } = new(); + + public override string ToString() + { + return string.Join(", ", Values.Select(s => $"{s}")); + } + } + + public sealed class TDStringArrayJsonConverter : JsonConverter + { + public override TDStringArray Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.String) + { + return new TDStringArray + { + Values = new List { reader.GetString()! } + }; + } + + if (reader.TokenType == JsonTokenType.StartArray) + { + return new TDStringArray + { + Values = JsonSerializer.Deserialize>(ref reader, options)! + }; + } + + return new TDStringArray(); + } + + public override void Write( + Utf8JsonWriter writer, + TDStringArray amount, + JsonSerializerOptions options) + { + JsonSerializer.Serialize(writer, amount.Values, options); + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/TDParser.cs b/codegen2/src/Azure.Iot.Operations.TDParser/TDParser.cs index c76324048f..29e63e7232 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/TDParser.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/TDParser.cs @@ -1,5 +1,7 @@ namespace Azure.Iot.Operations.TDParser { + using System.Collections.Generic; + using System.Text; using System.Text.Json; using Azure.Iot.Operations.TDParser.Model; @@ -12,6 +14,7 @@ public class TDParser { new ContextSpecifierJsonConverter(), new AdditionalPropSpecifierJsonConverter(), + new TDStringArrayJsonConverter(), } }; @@ -19,5 +22,26 @@ public class TDParser { return JsonSerializer.Deserialize(tdJson, serializerOptions); } + + public static List ParseMultiple(string tdJson) + { + Utf8JsonReader reader = new Utf8JsonReader(Encoding.UTF8.GetBytes(tdJson)); + JsonElement rootElt = JsonElement.ParseValue(ref reader); + + if (rootElt.ValueKind == JsonValueKind.Array) + { + return JsonSerializer.Deserialize>(rootElt, serializerOptions) ?? new(); + } + else if (rootElt.ValueKind == JsonValueKind.Object) + { + TDThing? thing = JsonSerializer.Deserialize(rootElt, serializerOptions); + if (thing != null) + { + return new List { thing }; + } + } + + return new(); + } } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/Azure.Iot.Operations.TypeGenerator.csproj b/codegen2/src/Azure.Iot.Operations.TypeGenerator/Azure.Iot.Operations.TypeGenerator.csproj index d29a0bdb55..8f6d0063dc 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/Azure.Iot.Operations.TypeGenerator.csproj +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/Azure.Iot.Operations.TypeGenerator.csproj @@ -1,6 +1,7 @@  + 0.10.0 net9.0 enable diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/DotNetTypeGenerator.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/DotNetTypeGenerator.cs index 565b326e42..e65d0564e8 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/DotNetTypeGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/DotNetTypeGenerator.cs @@ -6,7 +6,7 @@ internal class DotNetTypeGenerator : ITypeGenerator { - public GeneratedType GenerateTypeFromSchema(SchemaType schemaType, string projectName, SerializationFormat serFormat) + public GeneratedItem GenerateTypeFromSchema(SchemaType schemaType, string projectName, SerializationFormat serFormat, string _) { ITypeTemplateTransform templateTransform = schemaType switch { @@ -15,7 +15,7 @@ public GeneratedType GenerateTypeFromSchema(SchemaType schemaType, string projec _ => throw new Exception("unrecognized schema type"), }; - return new GeneratedType(templateTransform.TransformText(), templateTransform.FileName, templateTransform.FolderPath); + return new GeneratedItem(templateTransform.TransformText(), templateTransform.FileName, templateTransform.FolderPath); } } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/GeneratedType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/GeneratedType.cs deleted file mode 100644 index 3a64a1f1e1..0000000000 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/GeneratedType.cs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Azure.Iot.Operations.TypeGenerator -{ - public record GeneratedType(string Content, string FileName, string FolderPath); -} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/ITypeGenerator.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/ITypeGenerator.cs index f70f41e948..6cb5309957 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/ITypeGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/ITypeGenerator.cs @@ -5,6 +5,6 @@ internal interface ITypeGenerator { - GeneratedType GenerateTypeFromSchema(SchemaType schemaType, string projectName, SerializationFormat serFormat); + GeneratedItem GenerateTypeFromSchema(SchemaType schemaType, string projectName, SerializationFormat serFormat, string srcSubdir); } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/RustTypeGenerator.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/RustTypeGenerator.cs index 6eb4c4856c..fc5c88acdf 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/RustTypeGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/RustTypeGenerator.cs @@ -6,16 +6,16 @@ internal class RustTypeGenerator : ITypeGenerator { - public GeneratedType GenerateTypeFromSchema(SchemaType schemaType, string projectName, SerializationFormat serFormat) + public GeneratedItem GenerateTypeFromSchema(SchemaType schemaType, string projectName, SerializationFormat serFormat, string srcSubdir) { ITypeTemplateTransform templateTransform = schemaType switch { - ObjectType objectType => new RustObject(objectType, allowSkipping: serFormat == SerializationFormat.Json), - EnumType enumType => new RustEnum(enumType), + ObjectType objectType => new RustObject(objectType, allowSkipping: serFormat == SerializationFormat.Json, srcSubdir), + EnumType enumType => new RustEnum(enumType, srcSubdir), _ => throw new Exception("unrecognized schema type"), }; - return new GeneratedType(templateTransform.TransformText(), templateTransform.FileName, templateTransform.FolderPath); + return new GeneratedItem(templateTransform.TransformText(), templateTransform.FileName, templateTransform.FolderPath); } } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/TypeGenerator.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/TypeGenerator.cs index dce7fa7045..7cffe9cfb4 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/TypeGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/TypeGenerator.cs @@ -25,13 +25,13 @@ public TypeGenerator(SerializationFormat serializationFormat, TargetLanguage tar }; } - public List GenerateTypes(Dictionary schemaTextsByName, CodeName genNamespace, string projectName) + public List GenerateTypes(Dictionary schemaTextsByName, CodeName genNamespace, string projectName, string srcSubdir) { - List generatedTypes = new(); + List generatedTypes = new(); foreach (SchemaType schemaType in schemaStandardizer.GetStandardizedSchemas(schemaTextsByName, genNamespace)) { - generatedTypes.Add(this.typeGenerator.GenerateTypeFromSchema(schemaType, projectName, schemaStandardizer.SerializationFormat)); + generatedTypes.Add(this.typeGenerator.GenerateTypeFromSchema(schemaType, projectName, schemaStandardizer.SerializationFormat, srcSubdir)); } return generatedTypes; diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetEnum.tt b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetEnum.tt index 34385a9ce0..65cc3b87de 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetEnum.tt +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetEnum.tt @@ -1,7 +1,7 @@ <#@ template language="C#" linePragmas="false" #> <#@ import namespace="System.Linq" #> <#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> -/* Code generated by <#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Name#> v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ #nullable enable <# if (this.enumType.SchemaName.AsGiven.All(c => char.IsLower(c))) { #> diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetObject.tt b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetObject.tt index 385da9f1c1..ca2ac8b032 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetObject.tt +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetObject.tt @@ -1,6 +1,6 @@ <#@ template language="C#" linePragmas="false" #> <#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> -/* Code generated by <#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Name#> v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ #nullable enable diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/code/RustEnum.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/code/RustEnum.cs index 2fa417bf84..54fcf46533 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/code/RustEnum.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/code/RustEnum.cs @@ -1,18 +1,24 @@ namespace Azure.Iot.Operations.TypeGenerator { + using System.IO; + using System.Linq; using Azure.Iot.Operations.CodeGeneration; public partial class RustEnum : ITypeTemplateTransform { private readonly EnumType enumType; + private readonly string srcSubdir; + private readonly bool hasNonPascalNames; - internal RustEnum(EnumType enumType) + internal RustEnum(EnumType enumType, string srcSubdir) { this.enumType = enumType; + this.srcSubdir = srcSubdir; + this.hasNonPascalNames = this.enumType.EnumValues.Any(v => !char.IsUpper(v.AsGiven[0])); } public string FileName { get => $"{this.enumType.SchemaName.GetFileName(TargetLanguage.Rust)}.rs"; } - public string FolderPath { get => this.enumType.Namespace.GetFolderName(TargetLanguage.Rust); } + public string FolderPath { get => Path.Combine(this.srcSubdir, this.enumType.Namespace.GetFolderName(TargetLanguage.Rust)); } } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/code/RustObject.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/code/RustObject.cs index ce44081261..63528a5657 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/code/RustObject.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/code/RustObject.cs @@ -1,6 +1,7 @@ namespace Azure.Iot.Operations.TypeGenerator { using System.Collections.Generic; + using System.IO; using Azure.Iot.Operations.CodeGeneration; public partial class RustObject : ITypeTemplateTransform @@ -8,16 +9,18 @@ public partial class RustObject : ITypeTemplateTransform private readonly ObjectType objectType; private readonly IReadOnlyCollection referencedSchemas; private readonly bool allowSkipping; + private readonly string srcSubdir; - internal RustObject(ObjectType objectType, bool allowSkipping) + internal RustObject(ObjectType objectType, bool allowSkipping, string srcSubdir) { this.objectType = objectType; this.referencedSchemas = TypeGeneratorSupport.GetReferencedSchemas(objectType); this.allowSkipping = allowSkipping; + this.srcSubdir = srcSubdir; } public string FileName { get => $"{this.objectType.SchemaName.GetFileName(TargetLanguage.Rust)}.rs"; } - public string FolderPath { get => this.objectType.Namespace.GetFolderName(TargetLanguage.Rust); } + public string FolderPath { get => Path.Combine(this.srcSubdir, this.objectType.Namespace.GetFolderName(TargetLanguage.Rust)); } } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustEnum.tt b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustEnum.tt index a01e17d2c6..219821bfac 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustEnum.tt +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustEnum.tt @@ -1,6 +1,10 @@ <#@ template language="C#" linePragmas="false" #> <#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> -/* Code generated by <#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Name#> v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ +<# if (this.hasNonPascalNames) { #> + +#![allow(non_camel_case_types)] +<# } #> use serde::{Deserialize, Serialize}; diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustObject.tt b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustObject.tt index 9be59952c0..f7e047f6fe 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustObject.tt +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustObject.tt @@ -1,6 +1,6 @@ <#@ template language="C#" linePragmas="false" #> <#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> -/* Code generated by <#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Name#> v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ #![allow(unused_imports)] use std::collections::HashMap; @@ -11,6 +11,7 @@ use iso8601_duration::Duration; use serde::{Deserialize, Serialize}; use uuid::Uuid; +use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; <# foreach (var referencedSchema in this.referencedSchemas) { #> <# if (!referencedSchema.SchemaName.Equals(this.objectType.SchemaName)) { #> <# if (referencedSchema.Namespace.Equals(this.objectType.Namespace)) { #> @@ -20,7 +21,6 @@ use super::super::<#=referencedSchema.Namespace.GetFolderName(TargetLanguage.Rus <# } #> <# } #> <# } #> -use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; <# if (this.objectType.Description != null) { #> /// <#=this.objectType.Description#> diff --git a/codegen2/src/EnvoyTester/EnvoyTester.csproj b/codegen2/src/EnvoyTester/EnvoyTester.csproj new file mode 100644 index 0000000000..7d1c0c3529 --- /dev/null +++ b/codegen2/src/EnvoyTester/EnvoyTester.csproj @@ -0,0 +1,13 @@ + + + + Exe + net9.0 + enable + + + + + + + diff --git a/codegen2/src/EnvoyTester/Program.cs b/codegen2/src/EnvoyTester/Program.cs new file mode 100644 index 0000000000..f14d5ea37c --- /dev/null +++ b/codegen2/src/EnvoyTester/Program.cs @@ -0,0 +1,78 @@ +namespace EnvoyTester +{ + using System; + using System.Collections.Generic; + using System.IO; + using System.Linq; + using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser; + using Azure.Iot.Operations.TDParser.Model; + using Azure.Iot.Operations.EnvoyGenerator; + + internal class Program + { + static void Main(string[] args) + { + if (args.Length < 5) + { + Console.WriteLine("Usage: EnvoyTester C#|Rust "); + return; + } + + DirectoryInfo modelFolder = new DirectoryInfo(args[0]); + if (!modelFolder.Exists) + { + Console.WriteLine($"Folder not found: {modelFolder.FullName}"); + return; + } + + DirectoryInfo outputFolder = new DirectoryInfo(args[1]); + + string projectName = args[2]; + + var (targetLanguage, extension, srcSubdir) = args[3].ToLower() switch + { + "c#" => (TargetLanguage.CSharp, "cs", ""), + "rust" => (TargetLanguage.Rust, "rs", "src"), + _ => throw new NotSupportedException($"Target language {args[3]} is not supported."), + }; + + string sdkPath = Path.GetRelativePath(outputFolder.FullName, args[4]); + + Dictionary modelTextsByName = modelFolder.GetFiles("*.TD.json").ToDictionary(f => f.Name, f => File.ReadAllText(f.FullName)); + + List typeFileNames = outputFolder.GetFiles($"*.{extension}").Select(p => Path.GetFileNameWithoutExtension(p.Name)).Order().ToList(); + + foreach (KeyValuePair modelNameAndText in modelTextsByName) + { + TDThing? thing = TDParser.Parse(modelNameAndText.Value); + if (thing == null) + { + Console.WriteLine($"Failed to parse model: {modelNameAndText.Key}"); + continue; + } + + Console.WriteLine($"Processing model: {modelNameAndText.Key}"); + + string? schemaNamesFilename = thing.Links?.FirstOrDefault(l => l.Relation == TDValues.RelationSchemaNaming)?.Href; + string? schemaNameInfoText = schemaNamesFilename != null ? File.ReadAllText(Path.Combine(modelFolder.FullName, schemaNamesFilename)) : null; + SchemaNamer schemaNamer = new SchemaNamer(schemaNameInfoText); + + List serializationFormats = ThingSupport.GetSerializationFormats(new List { thing }); + + foreach (GeneratedItem genEnvoy in EnvoyGenerator.GenerateEnvoys(new List { new ParsedThing(thing, schemaNamer) }, serializationFormats, targetLanguage, "Namespace", projectName, sdkPath, typeFileNames, srcSubdir, true, true, true, false)) + { + DirectoryInfo folderPath = new DirectoryInfo(Path.Combine(outputFolder.FullName, genEnvoy.FolderPath)); + if (!folderPath.Exists) + { + folderPath.Create(); + } + + string filePath = Path.Combine(folderPath.FullName, genEnvoy.FileName); + File.WriteAllText(filePath, genEnvoy.Content); + Console.WriteLine($"Generated {filePath}"); + } + } + } + } +} diff --git a/codegen2/src/SchemaTester/Program.cs b/codegen2/src/SchemaTester/Program.cs index 30378b931e..752001485c 100644 --- a/codegen2/src/SchemaTester/Program.cs +++ b/codegen2/src/SchemaTester/Program.cs @@ -13,9 +13,9 @@ internal class Program { static void Main(string[] args) { - if (args.Length < 2) + if (args.Length < 3) { - Console.WriteLine("Usage: SchemaTester "); + Console.WriteLine("Usage: SchemaTester "); return; } @@ -28,6 +28,8 @@ static void Main(string[] args) DirectoryInfo outputFolder = new DirectoryInfo(args[1]); + string projectName = args[2]; + Dictionary modelTextsByName = modelFolder.GetFiles("*.TD.json").ToDictionary(f => f.Name, f => File.ReadAllText(f.FullName)); foreach (KeyValuePair modelNameAndText in modelTextsByName) @@ -45,17 +47,20 @@ static void Main(string[] args) string? schemaNameInfoText = schemaNamesFilename != null ? File.ReadAllText(Path.Combine(modelFolder.FullName, schemaNamesFilename)) : null; SchemaNamer schemaNamer = new SchemaNamer(schemaNameInfoText); - foreach (GeneratedSchema genSchema in SchemaGenerator.GenerateSchemas(thing, schemaNamer, "GeneratedProject", "Namespace")) + foreach (KeyValuePair> schemaSet in SchemaGenerator.GenerateSchemas(new List { new ParsedThing(thing, schemaNamer) }, projectName, "Namespace")) { - DirectoryInfo folderPath = new DirectoryInfo(Path.Combine(outputFolder.FullName, genSchema.FolderPath)); - if (!folderPath.Exists) + foreach (GeneratedItem genSchema in schemaSet.Value) { - folderPath.Create(); - } + DirectoryInfo folderPath = new DirectoryInfo(Path.Combine(outputFolder.FullName, genSchema.FolderPath)); + if (!folderPath.Exists) + { + folderPath.Create(); + } - string filePath = Path.Combine(folderPath.FullName, genSchema.FileName); - File.WriteAllText(filePath, genSchema.Content); - Console.WriteLine($"Generated {filePath}"); + string filePath = Path.Combine(folderPath.FullName, genSchema.FileName); + File.WriteAllText(filePath, genSchema.Content); + Console.WriteLine($"Generated {filePath}"); + } } } } diff --git a/codegen2/src/TDParse/Program.cs b/codegen2/src/TDParse/Program.cs index 2364f24e4d..ecdb3b414b 100644 --- a/codegen2/src/TDParse/Program.cs +++ b/codegen2/src/TDParse/Program.cs @@ -1,7 +1,9 @@ namespace TDParse { using System; + using System.Collections.Generic; using System.IO; + using System.Linq; using Azure.Iot.Operations.TDParser; using Azure.Iot.Operations.TDParser.Model; @@ -23,9 +25,10 @@ static void Main(string[] args) } string tdJson = File.ReadAllText(file.FullName); - TDThing? thing = TDParser.Parse(tdJson); - if (thing != null) + List? things = TDParser.ParseMultiple(tdJson); + if (things != null) { + TDThing? thing = things.First(); if (thing.Context != null) { foreach (var context in thing.Context) diff --git a/codegen2/src/TypeTester/Program.cs b/codegen2/src/TypeTester/Program.cs index 5baec0f249..708e114f54 100644 --- a/codegen2/src/TypeTester/Program.cs +++ b/codegen2/src/TypeTester/Program.cs @@ -16,9 +16,9 @@ internal class Program static void Main(string[] args) { - if (args.Length < 3) + if (args.Length < 4) { - Console.WriteLine("Usage: TypeTester C#|Rust"); + Console.WriteLine("Usage: TypeTester C#|Rust"); return; } @@ -31,10 +31,12 @@ static void Main(string[] args) DirectoryInfo outputFolder = new DirectoryInfo(args[1]); - TargetLanguage targetLanguage = args[2].ToLower() switch + string projectName = args[2]; + + var (targetLanguage, srcSubdir) = args[3].ToLower() switch { - "c#" => TargetLanguage.CSharp, - "rust" => TargetLanguage.Rust, + "c#" => (TargetLanguage.CSharp, ""), + "rust" => (TargetLanguage.Rust, "src"), _ => throw new NotSupportedException($"Target language {args[3]} is not supported."), }; @@ -44,7 +46,7 @@ static void Main(string[] args) Dictionary schemaTextsByName = schemaFolder.GetFiles(formatFilter.Value).ToDictionary(f => f.Name, f => File.ReadAllText(f.FullName)); - foreach (GeneratedType genType in typeGenerator.GenerateTypes(schemaTextsByName, new CodeName("Namespace"), "GeneratedProject")) + foreach (GeneratedItem genType in typeGenerator.GenerateTypes(schemaTextsByName, new CodeName("Namespace"), projectName, srcSubdir)) { DirectoryInfo folderPath = new DirectoryInfo(Path.Combine(outputFolder.FullName, genType.FolderPath)); if (!folderPath.Exists) From 646e2d3c153aed4a1623c0af183dfef0ef552b26 Mon Sep 17 00:00:00 2001 From: Auto Gen Date: Thu, 30 Oct 2025 07:32:10 -0700 Subject: [PATCH 03/52] update ValueExtractor --- .../Serializers/common/ValueExtractor.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dotnet/test/Azure.Iot.Operations.Protocol.UnitTests/Serializers/common/ValueExtractor.cs b/dotnet/test/Azure.Iot.Operations.Protocol.UnitTests/Serializers/common/ValueExtractor.cs index 6e61a15a03..e99e1b279a 100644 --- a/dotnet/test/Azure.Iot.Operations.Protocol.UnitTests/Serializers/common/ValueExtractor.cs +++ b/dotnet/test/Azure.Iot.Operations.Protocol.UnitTests/Serializers/common/ValueExtractor.cs @@ -10,8 +10,8 @@ namespace Azure.Iot.Operations.Protocol.UnitTests.Serializers.common internal static class ValueExtractor { #pragma warning disable IDE0030 // Null check can be simplified - public static T Value(this T obj) - where T : class => obj; + public static T Value(this T? obj) + where T : class => obj!; public static T Value(this T? val) where T : struct => val.HasValue ? val.Value : default(T); From c8f5d3431accf6b5e97e62afd9ec3b19c24aa0e1 Mon Sep 17 00:00:00 2001 From: Auto Gen Date: Mon, 3 Nov 2025 13:04:38 -0800 Subject: [PATCH 04/52] support external schemas --- codegen2/eval/.gitignore | 4 +- codegen2/eval/gen.sh | 6 ++ codegen2/eval/wot/ExternalSchemas.TD.json | 69 +++++++++++++++++++ .../wot/ExternalSchemas/AlephProp.schema.json | 17 +++++ .../wot/ExternalSchemas/BethData.schema.json | 17 +++++ .../DoSomethingInput.schema.json | 18 +++++ .../DoSomethingOuput.schema.json | 18 +++++ .../GeneratedItem.cs | 2 +- .../ParsedThing.cs | 2 +- .../SchemaNamer.cs | 20 ++++-- .../ActionEnvoyGenerator.cs | 4 +- .../CommandHandler.cs | 35 ++++++++-- .../ActionSchemaGenerator.cs | 11 +-- .../EventSchemaGenerator.cs | 5 +- .../FieldSpec.cs | 5 +- .../ISchemaTemplateTransform.cs | 2 - .../ObjectSpec.cs | 2 +- .../PropertySchemaGenerator.cs | 9 ++- .../SchemaGenerator.cs | 14 ++-- .../SchemaTransformFactory.cs | 24 ++++--- .../json/JsonSchemaSupport.cs | 28 ++++++-- .../json/code/EnumJsonSchema.cs | 6 +- .../json/code/ObjectJsonSchema.cs | 14 ++-- .../json/t4/ObjectJsonSchema.tt | 4 +- .../Model/TDDataSchema.cs | 3 + .../JsonSchemaStandardizer.cs | 4 +- codegen2/src/EnvoyTester/Program.cs | 2 +- codegen2/src/SchemaTester/Program.cs | 2 +- 28 files changed, 276 insertions(+), 71 deletions(-) create mode 100644 codegen2/eval/wot/ExternalSchemas.TD.json create mode 100644 codegen2/eval/wot/ExternalSchemas/AlephProp.schema.json create mode 100644 codegen2/eval/wot/ExternalSchemas/BethData.schema.json create mode 100644 codegen2/eval/wot/ExternalSchemas/DoSomethingInput.schema.json create mode 100644 codegen2/eval/wot/ExternalSchemas/DoSomethingOuput.schema.json diff --git a/codegen2/eval/.gitignore b/codegen2/eval/.gitignore index a89535bb38..befad2cefa 100644 --- a/codegen2/eval/.gitignore +++ b/codegen2/eval/.gitignore @@ -1,6 +1,6 @@ -**/*.const.json -**/*.schema.json **/*.cs **/*.csproj **/*.rs **/Cargo.toml +**/*.schema.json +!wot/**/*.schema.json diff --git a/codegen2/eval/gen.sh b/codegen2/eval/gen.sh index f9207c3ae5..967f2498e1 100644 --- a/codegen2/eval/gen.sh +++ b/codegen2/eval/gen.sh @@ -49,3 +49,9 @@ $gen --thingFiles wot/TwoThings.TD.json --outDir dotnet/TwoThingsSample --lang c [[ -d rust/two_things_gen ]] && rm -r rust/two_things_gen $gen --thingFiles wot/TwoThings.TD.json --outDir rust/two_things_gen --lang rust --namespace TwoThings --sdkPath ../../rust --srcSubdir src + +[[ -d dotnet/ExternalSchemasSample ]] && rm -r dotnet/ExternalSchemasSample +$gen --thingFiles wot/ExternalSchemas.TD.json --extSchemas wot/ExternalSchemas/*.schema.json --outDir dotnet/ExternalSchemasSample --lang csharp --namespace ExternalSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol + +[[ -d rust/external_schemas_gen ]] && rm -r rust/external_schemas_gen +$gen --thingFiles wot/ExternalSchemas.TD.json --extSchemas wot/ExternalSchemas/*.schema.json --outDir rust/external_schemas_gen --lang rust --namespace ExternalSchemas --sdkPath ../../rust --srcSubdir src diff --git a/codegen2/eval/wot/ExternalSchemas.TD.json b/codegen2/eval/wot/ExternalSchemas.TD.json new file mode 100644 index 0000000000..4633a87895 --- /dev/null +++ b/codegen2/eval/wot/ExternalSchemas.TD.json @@ -0,0 +1,69 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:jsonTest:ExternalSchemas;1", + "title": "ExternalSchemas", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "DoSomething": { + "input": { + "dtv:ref": "./ExternalSchemas/DoSomethingInput.schema.json" + }, + "output": { + "dtv:ref": "./ExternalSchemas/DoSomethingOuput.schema.json" + }, + "forms": [ + { + "href": "dtmi:jsonTest:ExternalSchemas:_contents:__doSomething;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/doSomething", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "Aleph": { + "dtv:ref": "./ExternalSchemas/AlephProp.schema.json", + "readOnly": false, + "forms": [ + { + "href": "dtmi:jsonTest:ExternalSchemas:_contents:__Aleph;1", + "contentType": "application/json", + "dtv:topic": "test/ExternalSchemas/Aleph/write", + "op": "writeproperty" + }, + { + "href": "dtmi:jsonTest:ExternalSchemas:_contents:__Aleph;1", + "contentType": "application/json", + "dtv:topic": "test/ExternalSchemas/Aleph/read", + "op": "readproperty" + } + ] + } + }, + "events": { + "Beth": { + "data": { + "dtv:ref": "./ExternalSchemas/BethData.schema.json" + }, + "forms": [ + { + "href": "dtmi:jsonTest:ExternalSchemas:_contents:__Beth;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/{senderId}/telemetry/{telemetryName}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/eval/wot/ExternalSchemas/AlephProp.schema.json b/codegen2/eval/wot/ExternalSchemas/AlephProp.schema.json new file mode 100644 index 0000000000..c280980789 --- /dev/null +++ b/codegen2/eval/wot/ExternalSchemas/AlephProp.schema.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "AlephProp", + "type": "object", + "additionalProperties": false, + "required": [ "epsilon", "zeta" ], + "properties": { + "epsilon": { + "description": "The 'epsilon' Field.", + "type": "string" + }, + "zeta": { + "description": "The 'zeta' Field.", + "type": "integer", "minimum": -2147483648, "maximum": 2147483647 + } + } +} diff --git a/codegen2/eval/wot/ExternalSchemas/BethData.schema.json b/codegen2/eval/wot/ExternalSchemas/BethData.schema.json new file mode 100644 index 0000000000..8d917bf18c --- /dev/null +++ b/codegen2/eval/wot/ExternalSchemas/BethData.schema.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "BethData", + "type": "object", + "additionalProperties": false, + "required": [ "eta", "theta" ], + "properties": { + "eta": { + "description": "The 'eta' Field.", + "type": "string" + }, + "theta": { + "description": "The 'theta' Field.", + "type": "integer", "minimum": -2147483648, "maximum": 2147483647 + } + } +} diff --git a/codegen2/eval/wot/ExternalSchemas/DoSomethingInput.schema.json b/codegen2/eval/wot/ExternalSchemas/DoSomethingInput.schema.json new file mode 100644 index 0000000000..ac97230d70 --- /dev/null +++ b/codegen2/eval/wot/ExternalSchemas/DoSomethingInput.schema.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "DoSomethingInput", + "description": "Input arguments for action 'DoSomething'", + "type": "object", + "additionalProperties": false, + "required": [ "alpha", "beta" ], + "properties": { + "alpha": { + "description": "The 'alpha' Field.", + "type": "string" + }, + "beta": { + "description": "The 'beta' Field.", + "type": "integer", "minimum": -2147483648, "maximum": 2147483647 + } + } +} diff --git a/codegen2/eval/wot/ExternalSchemas/DoSomethingOuput.schema.json b/codegen2/eval/wot/ExternalSchemas/DoSomethingOuput.schema.json new file mode 100644 index 0000000000..45a6a69fb7 --- /dev/null +++ b/codegen2/eval/wot/ExternalSchemas/DoSomethingOuput.schema.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "DoSomethingOuput", + "description": "Output arguments for action 'DoSomething'", + "type": "object", + "additionalProperties": false, + "required": [ "gamma", "delta" ], + "properties": { + "delta": { + "description": "The 'delta' Field.", + "type": "integer", "minimum": -2147483648, "maximum": 2147483647 + }, + "gamma": { + "description": "The 'gamma' Field.", + "type": "string" + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/GeneratedItem.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/GeneratedItem.cs index b98a944171..45e276a959 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/GeneratedItem.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/GeneratedItem.cs @@ -1,4 +1,4 @@ namespace Azure.Iot.Operations.CodeGeneration { - public record GeneratedItem(string Content, string FileName, string FolderPath); + public record GeneratedItem(string Content, string FileName, string FolderPath = ""); } diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ParsedThing.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ParsedThing.cs index e5a882634c..6d63d55bfe 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ParsedThing.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ParsedThing.cs @@ -2,5 +2,5 @@ { using Azure.Iot.Operations.TDParser.Model; - public record ParsedThing(TDThing Thing, SchemaNamer SchemaNamer); + public record ParsedThing(TDThing Thing, string DirectoryName, SchemaNamer SchemaNamer); } diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNamer.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNamer.cs index 5d2640a88d..b6ff5cba29 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNamer.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNamer.cs @@ -1,8 +1,10 @@ namespace Azure.Iot.Operations.CodeGeneration { using System.Diagnostics.CodeAnalysis; - using System.Text.Json; + using System.IO; using System.Linq; + using System.Text.Json; + using Azure.Iot.Operations.TDParser.Model; public class SchemaNamer { @@ -73,9 +75,9 @@ public SchemaNamer(string? schemaNameInfoText) public string GetPropConsumerBinder(string propSchema) => Expand(null, this.schemaNameInfo?.PropConsumerBinder, $"{Cap(propSchema)}Consumer", propSchema); - public string GetActionInSchema(string? title, string actionName) => Expand(title, this.schemaNameInfo?.ActionInSchema, $"{Cap(actionName)}InputArguments", actionName); + public string GetActionInSchema(TDDataSchema? dataSchema, string actionName) => Expand(dataSchema, this.schemaNameInfo?.ActionInSchema, $"{Cap(actionName)}InputArguments", actionName); - public string GetActionOutSchema(string? title, string actionName) => Expand(title, this.schemaNameInfo?.ActionOutSchema, $"{Cap(actionName)}OutputArguments", actionName); + public string GetActionOutSchema(TDDataSchema? dataSchema, string actionName) => Expand(dataSchema, this.schemaNameInfo?.ActionOutSchema, $"{Cap(actionName)}OutputArguments", actionName); public string GetActionRespSchema(string actionName) => Expand(null, this.schemaNameInfo?.ActionRespSchema, $"{Cap(actionName)}ResponseSchema", actionName); @@ -96,11 +98,17 @@ public SchemaNamer(string? schemaNameInfoText) [return: NotNullIfNotNull(nameof(name))] public string? ChooseTitleOrName(string? title, string? name) => this.suppressTitles ? name : title ?? name; - private string Expand(string? title, FuncInfo? funcInfo, string defaultOut, params string[] args) + private string Expand(TDDataSchema? dataSchema, FuncInfo? funcInfo, string defaultOut, params string[] args) { - if (!this.suppressTitles && title != null) + if (dataSchema?.Ref != null) + { + string filename = Path.GetFileName(dataSchema.Ref); + return filename.Substring(0, filename.IndexOf('.')); + } + + if (!this.suppressTitles && dataSchema?.Title != null) { - return title; + return dataSchema.Title; } if (funcInfo == null || funcInfo.Output == null || funcInfo.Input == null || funcInfo.Input.Length < args.Length) diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs index 430a4ceb48..4b0b0b0a0a 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs @@ -18,8 +18,8 @@ internal static List GenerateActionEnvoys(TDThing tdThing, SchemaNam if (actionForm?.TopicPattern != null && actionForm.Format != SerializationFormat.None) { - string? inputSchemaType = actionKvp.Value.Input != null ? schemaNamer.GetActionInSchema(actionKvp.Value.Input.Title, actionKvp.Key) : null; - string? outArgsType = actionKvp.Value.Output != null ? schemaNamer.GetActionOutSchema(actionKvp.Value.Output.Title, actionKvp.Key) : null; + string? inputSchemaType = actionKvp.Value.Input != null ? schemaNamer.GetActionInSchema(actionKvp.Value.Input, actionKvp.Key) : null; + string? outArgsType = actionKvp.Value.Output != null ? schemaNamer.GetActionOutSchema(actionKvp.Value.Output, actionKvp.Key) : null; string? outputSchemaType = actionForm.ErrorRespSchema != null ? schemaNamer.GetActionRespSchema(actionKvp.Key) : outArgsType; string? errSchemaName = schemaNamer.ChooseTitleOrName(actionForm.ErrorRespSchema?.Title, actionForm.ErrorRespName); diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs index fe03cf7eb9..cc7806693b 100644 --- a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs @@ -33,22 +33,23 @@ public static int GenerateCode(OptionContainer options) return 1; } - // TODO must do something with these - // The formats must be inferred from the file names - // Should I copy them to the working dir? - FileInfo[] extSchemaFiles = options.ExtSchemaFiles.SelectMany(fs => Directory.GetFiles(Path.GetDirectoryName(fs) ?? string.Empty, Path.GetFileName(fs)), (_, f) => new FileInfo(f)).ToArray(); - string projectName = LegalizeProjectName(options.OutputDir.Name); TargetLanguage targetLanguage = LanguageMap[options.Language.ToLowerInvariant()]; List parsedThings = ParseThings(options.ThingFiles); - Dictionary> generatedSchemas = SchemaGenerator.GenerateSchemas(parsedThings, projectName, options.GenNamespace); + Dictionary> generatedSchemas = SchemaGenerator.GenerateSchemas(parsedThings, projectName, options.WorkingDir); foreach (List schemas in generatedSchemas.Values) { WriteItems(schemas, options.WorkingDir); } + FileInfo[] extSchemaFiles = options.ExtSchemaFiles.SelectMany(fs => Directory.GetFiles(Path.GetDirectoryName(fs) ?? string.Empty, Path.GetFileName(fs)), (_, f) => new FileInfo(f)).ToArray(); + if (extSchemaFiles.Length > 0) + { + ImportSchemas(extSchemaFiles, generatedSchemas); + } + List generatedTypes = new(); foreach (KeyValuePair> schemaSet in generatedSchemas) { @@ -105,7 +106,7 @@ private static List ParseThings(FileInfo[] thingFiles) string? schemaNameInfoText = schemaNamesFilename != null ? File.ReadAllText(Path.Combine(thingFile.DirectoryName!, schemaNamesFilename)) : null; SchemaNamer schemaNamer = new SchemaNamer(schemaNameInfoText); - parsedThings.Add(new ParsedThing(thing, schemaNamer)); + parsedThings.Add(new ParsedThing(thing, thingFile.DirectoryName!, schemaNamer)); } Console.WriteLine($" {things.Count} {(things.Count == 1 ? "TD" : "TDs")} parsed"); @@ -131,6 +132,26 @@ private static void WriteItems(List generatedItems, DirectoryInfo } } + private static void ImportSchemas(FileInfo[] extSchemaFiles, Dictionary> generatedSchemas) + { + foreach (FileInfo schemaFile in extSchemaFiles) + { + SerializationFormat format = schemaFile.Name switch + { + string n when n.EndsWith(".schema.json", StringComparison.OrdinalIgnoreCase) => SerializationFormat.Json, + _ => SerializationFormat.None, + }; + + if (!generatedSchemas.TryGetValue(format, out List? schemas)) + { + schemas = new(); + generatedSchemas[format] = schemas; + } + + schemas.Add(new GeneratedItem(schemaFile.OpenText().ReadToEnd(), schemaFile.Name, schemaFile.Directory!.FullName)); + } + } + private static string LegalizeProjectName(string fsName) { return string.Join('.', fsName.Split('.', StringSplitOptions.RemoveEmptyEntries).Select(s => (char.IsNumber(s[0]) ? "_" : "") + Regex.Replace(s, "[^a-zA-Z0-9]+", "_", RegexOptions.CultureInvariant))); diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs index 50ea0ec86b..15ee9b07ec 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs @@ -39,17 +39,17 @@ private static void ProcessAction( if (actionForm?.TopicPattern != null) { - if (tdAction.Input != null) + if (tdAction.Input != null && tdAction.Input.Ref == null) { - string inputSchemaName = schemaNamer.GetActionInSchema(tdAction.Input.Title, actionName); + string inputSchemaName = schemaNamer.GetActionInSchema(tdAction.Input, actionName); ObjectSpec inputObjectSpec = ObjectSpec.CreateFromDataSchema(schemaNamer, tdAction.Input, actionForm.Format, inputSchemaName, tdAction.Input.Description ?? $"Input arguments for action '{actionName}'"); schemaSpecs[inputSchemaName] = inputObjectSpec; } Dictionary responseFields = new(); - if (tdAction.Output != null) + if (tdAction.Output != null && tdAction.Output.Ref == null) { - string outputSchemaName = schemaNamer.GetActionOutSchema(tdAction.Output.Title, actionName); + string outputSchemaName = schemaNamer.GetActionOutSchema(tdAction.Output, actionName); ObjectSpec outputObjectSpec = ObjectSpec.CreateFromDataSchema(schemaNamer, tdAction.Output, actionForm.Format, outputSchemaName, tdAction.Output.Description ?? $"Output arguments for action '{actionName}'"); schemaSpecs[outputSchemaName] = outputObjectSpec; responseFields = outputObjectSpec.Fields.ToDictionary(f => f.Key, f => f.Value with { Require = false }); @@ -60,8 +60,9 @@ private static void ProcessAction( responseFields[schemaNamer.GetActionRespErrorField(actionName, actionForm.ErrorRespName!)] = new FieldSpec( tdAction.Description ?? $"Read error for the '{actionName}' Action.", actionForm.ErrorRespSchema, + Require: false, BackupSchemaName: actionForm.ErrorRespName!, - Require: false); + Base: string.Empty); string respSchemaName = schemaNamer.GetActionRespSchema(actionName); ObjectSpec propReadRespObjectSpec = new( diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EventSchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EventSchemaGenerator.cs index ab2e0050da..f1edbbeab9 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EventSchemaGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EventSchemaGenerator.cs @@ -7,7 +7,7 @@ internal static class EventSchemaGenerator { - internal static void GenerateEventSchemas(TDThing tdThing, SchemaNamer schemaNamer, string projectName, Dictionary schemaSpecs, Dictionary> referencedSchemas) + internal static void GenerateEventSchemas(TDThing tdThing, string dirName, SchemaNamer schemaNamer, string projectName, Dictionary schemaSpecs, Dictionary> referencedSchemas) { FormInfo? subAllEventsForm = FormInfo.CreateFromForm(tdThing.Forms?.FirstOrDefault(f => f.Op?.Values.Contains(TDValues.OpSubAllEvents) ?? false), tdThing.SchemaDefinitions); @@ -22,6 +22,7 @@ internal static void GenerateEventSchemas(TDThing tdThing, SchemaNamer schemaNam eventKvp.Key, eventKvp.Value, projectName, + dirName, tdThing.SchemaDefinitions, schemaSpecs, valueFields); @@ -40,6 +41,7 @@ private static void ProcessEvent( string eventName, TDEvent tdEvent, string projectName, + string dirName, Dictionary? schemaDefinitions, Dictionary schemaSpecs, Dictionary valueFields) @@ -52,6 +54,7 @@ private static void ProcessEvent( tdEvent.Data!, BackupSchemaName: schemaNamer.GetEventValueSchema(eventName), Require: true, + Base: dirName, Fragment: tdEvent.Placeholder); valueFields[eventName] = dataFieldSpec with { Require = false }; diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/FieldSpec.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/FieldSpec.cs index 7c7de783d9..3a8b56852a 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/FieldSpec.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/FieldSpec.cs @@ -3,7 +3,7 @@ using Azure.Iot.Operations.CodeGeneration; using Azure.Iot.Operations.TDParser.Model; - internal record FieldSpec(string Description, TDDataSchema Schema, bool Require, string BackupSchemaName, bool Fragment = false, bool ForceOption = false) + internal record FieldSpec(string Description, TDDataSchema Schema, bool Require, string BackupSchemaName, string Base, bool Fragment = false, bool ForceOption = false) { internal static FieldSpec CreateFixed(string title, string description, string backupSchemaName) { @@ -16,7 +16,8 @@ internal static FieldSpec CreateFixed(string title, string description, string b AdditionalProperties = new TDAdditionalPropSpecifier { Boolean = false }, }, Require: false, - backupSchemaName); + backupSchemaName, + string.Empty); } public override int GetHashCode() diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ISchemaTemplateTransform.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ISchemaTemplateTransform.cs index a541b031a5..91448a8519 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ISchemaTemplateTransform.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ISchemaTemplateTransform.cs @@ -8,8 +8,6 @@ internal interface ISchemaTemplateTransform string FileName { get; } - string FolderPath { get; } - string TransformText(); } } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ObjectSpec.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ObjectSpec.cs index c359507a66..51dbeaf6e7 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ObjectSpec.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ObjectSpec.cs @@ -20,7 +20,7 @@ internal static ObjectSpec CreateFromDataSchema(SchemaNamer schemaNamer, TDDataS Dictionary fieldSpecs = new(); foreach (KeyValuePair property in dataSchema.Properties ?? new Dictionary()) { - fieldSpecs[property.Key] = new FieldSpec(property.Value.Description ?? $"The '{property.Key}' Field.", property.Value, Require: dataSchema.Required?.Contains(property.Key) ?? false, schemaNamer.GetBackupSchemaName(schemaName, property.Key)); + fieldSpecs[property.Key] = new FieldSpec(property.Value.Description ?? $"The '{property.Key}' Field.", property.Value, Require: dataSchema.Required?.Contains(property.Key) ?? false, schemaNamer.GetBackupSchemaName(schemaName, property.Key), string.Empty); } return new ObjectSpec(dataSchema.Description ?? defaultDescription, fieldSpecs, format, schemaName); diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/PropertySchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/PropertySchemaGenerator.cs index 8fb20cdaac..386b986e38 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/PropertySchemaGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/PropertySchemaGenerator.cs @@ -7,7 +7,7 @@ internal static class PropertySchemaGenerator { - internal static void GeneratePropertySchemas(TDThing tdThing, SchemaNamer schemaNamer, string projectName, Dictionary schemaSpecs, Dictionary> referencedSchemas) + internal static void GeneratePropertySchemas(TDThing tdThing, string dirName, SchemaNamer schemaNamer, string projectName, Dictionary schemaSpecs, Dictionary> referencedSchemas) { FormInfo? readAllPropsForm = FormInfo.CreateFromForm(tdThing.Forms?.FirstOrDefault(f => f.Op?.Values.Contains(TDValues.OpReadAllProps) ?? false), tdThing.SchemaDefinitions); FormInfo? writeMultPropsForm = FormInfo.CreateFromForm(tdThing.Forms?.FirstOrDefault(f => f.Op?.Values.Contains(TDValues.OpWriteMultProps) ?? false), tdThing.SchemaDefinitions); @@ -28,6 +28,7 @@ internal static void GeneratePropertySchemas(TDThing tdThing, SchemaNamer schema propKvp.Key, propKvp.Value, projectName, + dirName, tdThing.SchemaDefinitions, schemaSpecs, readValueFields, @@ -41,6 +42,7 @@ internal static void GeneratePropertySchemas(TDThing tdThing, SchemaNamer schema propKvp.Key, propKvp.Value, projectName, + dirName, tdThing.SchemaDefinitions, schemaSpecs, writeValueFields, @@ -88,6 +90,7 @@ private static void ProcessProperty( string propName, TDProperty tdProperty, string projectName, + string dirName, Dictionary? schemaDefinitions, Dictionary schemaSpecs, Dictionary valueFields, @@ -110,6 +113,7 @@ private static void ProcessProperty( tdProperty as TDDataSchema, BackupSchemaName: schemaNamer.GetPropValueSchema(propName), Require: isRead, + Base: dirName, Fragment: tdProperty.Placeholder); valueFields[propName] = propFieldSpec; @@ -130,7 +134,8 @@ private static void ProcessProperty( tdProperty.Description ?? $"{(isRead ? "Read" : "Write")} error for the '{propName}' Property.", propForm.ErrorRespSchema, BackupSchemaName: propForm.ErrorRespName!, - Require: false); + Require: false, + Base: dirName); errorFields[propName] = respFieldSpec; errorSchemaNames.Add(propForm.ErrorRespName!); diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs index 369191e04b..ab533f52fe 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs @@ -1,13 +1,13 @@ namespace Azure.Iot.Operations.SchemaGenerator { using System.Collections.Generic; - using System.Linq; + using System.IO; using Azure.Iot.Operations.CodeGeneration; using Azure.Iot.Operations.TDParser.Model; public static class SchemaGenerator { - public static Dictionary> GenerateSchemas(List parsedThings, string projectName, string genNamespace) + public static Dictionary> GenerateSchemas(List parsedThings, string projectName, DirectoryInfo workingDir) { Dictionary transforms = new(); @@ -16,15 +16,17 @@ public static Dictionary> GenerateSchem Dictionary schemaSpecs = new(); Dictionary> referencedSchemas = new(); - PropertySchemaGenerator.GeneratePropertySchemas(parsedThing.Thing, parsedThing.SchemaNamer, projectName, schemaSpecs, referencedSchemas); + PropertySchemaGenerator.GeneratePropertySchemas(parsedThing.Thing, parsedThing.DirectoryName, parsedThing.SchemaNamer, projectName, schemaSpecs, referencedSchemas); ActionSchemaGenerator.GenerateActionSchemas(parsedThing.Thing, parsedThing.SchemaNamer, projectName, schemaSpecs, referencedSchemas); - EventSchemaGenerator.GenerateEventSchemas(parsedThing.Thing, parsedThing.SchemaNamer, projectName, schemaSpecs, referencedSchemas); + EventSchemaGenerator.GenerateEventSchemas(parsedThing.Thing, parsedThing.DirectoryName, parsedThing.SchemaNamer, projectName, schemaSpecs, referencedSchemas); Dictionary closedSchemaSpecs = ComputeClosedSchemaSpecs(parsedThing.Thing, parsedThing.SchemaNamer, schemaSpecs, referencedSchemas); + SchemaTransformFactory transformFactory = new(parsedThing.SchemaNamer, workingDir); + foreach (KeyValuePair schemaSpec in closedSchemaSpecs) { - ISchemaTemplateTransform transform = SchemaTransformFactory.GetSchemaTransform(parsedThing.SchemaNamer, schemaSpec.Key, schemaSpec.Value, genNamespace); + ISchemaTemplateTransform transform = transformFactory.GetSchemaTransform(schemaSpec.Key, schemaSpec.Value); transforms[transform.FileName] = transform; } } @@ -39,7 +41,7 @@ public static Dictionary> GenerateSchem generatedSchemas[transform.Value.Format] = schemas; } - schemas.Add(new GeneratedItem(transform.Value.TransformText(), transform.Key, transform.Value.FolderPath)); + schemas.Add(new GeneratedItem(transform.Value.TransformText(), transform.Key)); } return generatedSchemas; diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaTransformFactory.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaTransformFactory.cs index cc9e197ecf..b80221f804 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaTransformFactory.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaTransformFactory.cs @@ -1,34 +1,42 @@ namespace Azure.Iot.Operations.SchemaGenerator { using System; + using System.IO; using Azure.Iot.Operations.CodeGeneration; - internal static class SchemaTransformFactory + internal class SchemaTransformFactory { - internal static ISchemaTemplateTransform GetSchemaTransform(SchemaNamer schemaNamer, string schemaName, SchemaSpec schemaSpec, string genNamespace) + private readonly JsonSchemaSupport jsonSchemaSupport; + + internal SchemaTransformFactory(SchemaNamer schemaNamer, DirectoryInfo workingDir) + { + this.jsonSchemaSupport = new JsonSchemaSupport(schemaNamer, workingDir); + } + + internal ISchemaTemplateTransform GetSchemaTransform(string schemaName, SchemaSpec schemaSpec) { return schemaSpec switch { - ObjectSpec objectSpec => GetObjectSchemaTransform(schemaNamer, schemaName, objectSpec, genNamespace), - EnumSpec enumSpec => GetEnumSchemaTransform(schemaName, enumSpec, genNamespace), + ObjectSpec objectSpec => GetObjectSchemaTransform(schemaName, objectSpec), + EnumSpec enumSpec => GetEnumSchemaTransform(schemaName, enumSpec), _ => throw new NotSupportedException($"Unable to transform schema spec of type {schemaSpec.GetType()}."), }; } - internal static ISchemaTemplateTransform GetObjectSchemaTransform(SchemaNamer schemaNamer, string schemaName, ObjectSpec objectSpec, string genNamespace) + internal ISchemaTemplateTransform GetObjectSchemaTransform(string schemaName, ObjectSpec objectSpec) { return objectSpec.Format switch { - SerializationFormat.Json => new ObjectJsonSchema(schemaNamer, schemaName, objectSpec, genNamespace), + SerializationFormat.Json => new ObjectJsonSchema(this.jsonSchemaSupport, schemaName, objectSpec), _ => throw new NotSupportedException($"Serialization format {objectSpec.Format} is not supported."), }; } - internal static ISchemaTemplateTransform GetEnumSchemaTransform(string schemaName, EnumSpec enumSpec, string genNamespace) + internal ISchemaTemplateTransform GetEnumSchemaTransform(string schemaName, EnumSpec enumSpec) { return enumSpec.Format switch { - SerializationFormat.Json => new EnumJsonSchema(schemaName, enumSpec, genNamespace), + SerializationFormat.Json => new EnumJsonSchema(schemaName, enumSpec), _ => throw new NotSupportedException($"Serialization format {enumSpec.Format} is not supported."), }; } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs index f8fdd64538..a9c8888fd9 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs @@ -1,36 +1,52 @@ namespace Azure.Iot.Operations.SchemaGenerator { + using System.IO; using System.Text.RegularExpressions; using Azure.Iot.Operations.CodeGeneration; using Azure.Iot.Operations.TDParser.Model; - internal static class JsonSchemaSupport + internal class JsonSchemaSupport { private const string Iso8601DurationExample = "P3Y6M4DT12H30M5S"; private const string DecimalExample = "1234567890.0987654321"; private const string AnArbitraryString = "HelloWorld"; private const string DecimalPattern = @"^(?:\\+|-)?(?:[1-9][0-9]*|0)(?:\\.[0-9]*)?$"; - internal static string GetFragmented(string typeAndAddenda, bool require) + private readonly SchemaNamer schemaNamer; + private readonly DirectoryInfo workingDir; + + internal JsonSchemaSupport(SchemaNamer schemaNamer, DirectoryInfo workingDir) + { + this.schemaNamer = schemaNamer; + this.workingDir = workingDir; + } + + internal string GetFragmented(string typeAndAddenda, bool require) { string addProps = require ? typeAndAddenda : $"\"anyOf\": [ {{ \"type\": \"null\" }}, {{ {typeAndAddenda} }} ]"; return $"\"type\": \"object\", \"additionalProperties\": {{ {addProps} }}"; } - internal static string GetTypeAndAddenda(SchemaNamer schemaNamer, TDDataSchema tdSchema, string backupSchemaName) + internal string GetTypeAndAddenda(TDDataSchema tdSchema, string backupSchemaName, string refBase) { + if (tdSchema.Ref != null) + { + string schemaDir = Path.GetRelativePath(this.workingDir.FullName, Path.Combine(refBase, tdSchema.Ref)).Replace('\\', '/'); + return $"\"$ref\": \"{schemaDir}\""; + } + if ((tdSchema.Type == TDValues.TypeObject && tdSchema.AdditionalProperties?.Boolean == false) || (tdSchema.Type == TDValues.TypeString && tdSchema.Enum != null)) { - return $"\"$ref\": \"{schemaNamer.ApplyBackupSchemaName(tdSchema.Title, backupSchemaName)}.schema.json\""; + return $"\"$ref\": \"{this.schemaNamer.ApplyBackupSchemaName(tdSchema.Title, backupSchemaName)}.schema.json\""; } switch (tdSchema.Type ?? string.Empty) { case TDValues.TypeObject: - return $"\"type\": \"object\", \"additionalProperties\": {{ {GetTypeAndAddenda(schemaNamer, tdSchema.AdditionalProperties!.DataSchema!, backupSchemaName)} }}"; + return $"\"type\": \"object\", \"additionalProperties\": {{ {GetTypeAndAddenda(tdSchema.AdditionalProperties!.DataSchema!, backupSchemaName, refBase)} }}"; case TDValues.TypeArray: - string itemsProp = tdSchema.Items != null ? $", \"items\": {{ {GetTypeAndAddenda(schemaNamer, tdSchema.Items, backupSchemaName)} }}" : string.Empty; + string itemsProp = tdSchema.Items != null ? $", \"items\": {{ {GetTypeAndAddenda(tdSchema.Items, backupSchemaName, refBase)} }}" : string.Empty; return $"\"type\": \"array\"{itemsProp}"; case TDValues.TypeString: string formatProp = TDValues.FormatValues.Contains(tdSchema.Format ?? string.Empty) ? $", \"format\": \"{tdSchema.Format}\"" : diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/EnumJsonSchema.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/EnumJsonSchema.cs index 8851eee6b1..d2cc16137a 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/EnumJsonSchema.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/EnumJsonSchema.cs @@ -6,19 +6,15 @@ public partial class EnumJsonSchema : ISchemaTemplateTransform { string schemaName; EnumSpec enumSpec; - string genNamespace; - internal EnumJsonSchema(string schemaName, EnumSpec enumSpec, string genNamespace) + internal EnumJsonSchema(string schemaName, EnumSpec enumSpec) { this.schemaName = schemaName; this.enumSpec = enumSpec; - this.genNamespace = genNamespace; } public SerializationFormat Format { get => SerializationFormat.Json; } public string FileName { get => $"{this.schemaName}.schema.json"; } - - public string FolderPath { get => this.genNamespace; } } } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/ObjectJsonSchema.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/ObjectJsonSchema.cs index f22c00ec83..aefecb9483 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/ObjectJsonSchema.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/ObjectJsonSchema.cs @@ -4,23 +4,19 @@ namespace Azure.Iot.Operations.SchemaGenerator public partial class ObjectJsonSchema : ISchemaTemplateTransform { - SchemaNamer schemaNamer; - string schemaName; - ObjectSpec objectSpec; - string genNamespace; + private readonly JsonSchemaSupport schemaSupport; + private readonly string schemaName; + private readonly ObjectSpec objectSpec; - internal ObjectJsonSchema(SchemaNamer schemaNamer, string schemaName, ObjectSpec objectSpec, string genNamespace) + internal ObjectJsonSchema(JsonSchemaSupport schemaSupport, string schemaName, ObjectSpec objectSpec) { - this.schemaNamer = schemaNamer; + this.schemaSupport = schemaSupport; this.schemaName = schemaName; this.objectSpec = objectSpec; - this.genNamespace = genNamespace; } public SerializationFormat Format { get => SerializationFormat.Json; } public string FileName { get => $"{this.schemaName}.schema.json"; } - - public string FolderPath { get => this.genNamespace; } } } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/ObjectJsonSchema.tt b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/ObjectJsonSchema.tt index dfbbd43a9e..1fc3df3ce4 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/ObjectJsonSchema.tt +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/ObjectJsonSchema.tt @@ -17,9 +17,9 @@ "<#=field.Key#>": { "description": "<#=field.Value.Description#>", <# if (field.Value.Fragment) { #> - <#=JsonSchemaSupport.GetFragmented(JsonSchemaSupport.GetTypeAndAddenda(this.schemaNamer, field.Value.Schema, field.Value.BackupSchemaName), field.Value.Require)#> + <#=this.schemaSupport.GetFragmented(this.schemaSupport.GetTypeAndAddenda(field.Value.Schema, field.Value.BackupSchemaName, field.Value.Base), field.Value.Require)#> <# } else { #> - <#=JsonSchemaSupport.GetTypeAndAddenda(this.schemaNamer, field.Value.Schema, field.Value.BackupSchemaName)#> + <#=this.schemaSupport.GetTypeAndAddenda(field.Value.Schema, field.Value.BackupSchemaName, field.Value.Base)#> <# } #> }<#=ix < this.objectSpec.Fields.Count ? "," : ""#> <# ix++; } #> diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs index 0f88527d97..b82b83a3a9 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs @@ -6,6 +6,9 @@ public class TDDataSchema { + [JsonPropertyName("dtv:ref")] + public string? Ref { get; set; } + [JsonPropertyName("title")] public string? Title { get; set; } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs index a747874b6f..ad30f296e2 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs @@ -2,6 +2,7 @@ { using System; using System.Collections.Generic; + using System.IO; using System.Linq; using System.Text.Json; using System.Text.RegularExpressions; @@ -102,7 +103,8 @@ private SchemaType GetSchemaTypeFromJsonElement(JsonElement rootElt, JsonElement if (internalDefsKey == null || !refString.StartsWith($"#/{internalDefsKey}/")) { - using (JsonDocument refDoc = JsonDocument.Parse(schemaTextsByName[refString])) + string refName = Path.GetFileName(refString); + using (JsonDocument refDoc = JsonDocument.Parse(schemaTextsByName[refName])) { string title = refDoc.RootElement.GetProperty("title").GetString()!; string type = refDoc.RootElement.GetProperty("type").GetString()!; diff --git a/codegen2/src/EnvoyTester/Program.cs b/codegen2/src/EnvoyTester/Program.cs index f14d5ea37c..6710d3c830 100644 --- a/codegen2/src/EnvoyTester/Program.cs +++ b/codegen2/src/EnvoyTester/Program.cs @@ -60,7 +60,7 @@ static void Main(string[] args) List serializationFormats = ThingSupport.GetSerializationFormats(new List { thing }); - foreach (GeneratedItem genEnvoy in EnvoyGenerator.GenerateEnvoys(new List { new ParsedThing(thing, schemaNamer) }, serializationFormats, targetLanguage, "Namespace", projectName, sdkPath, typeFileNames, srcSubdir, true, true, true, false)) + foreach (GeneratedItem genEnvoy in EnvoyGenerator.GenerateEnvoys(new List { new ParsedThing(thing, modelFolder.FullName, schemaNamer) }, serializationFormats, targetLanguage, "Namespace", projectName, sdkPath, typeFileNames, srcSubdir, true, true, true, false)) { DirectoryInfo folderPath = new DirectoryInfo(Path.Combine(outputFolder.FullName, genEnvoy.FolderPath)); if (!folderPath.Exists) diff --git a/codegen2/src/SchemaTester/Program.cs b/codegen2/src/SchemaTester/Program.cs index 752001485c..0e7f11a1df 100644 --- a/codegen2/src/SchemaTester/Program.cs +++ b/codegen2/src/SchemaTester/Program.cs @@ -47,7 +47,7 @@ static void Main(string[] args) string? schemaNameInfoText = schemaNamesFilename != null ? File.ReadAllText(Path.Combine(modelFolder.FullName, schemaNamesFilename)) : null; SchemaNamer schemaNamer = new SchemaNamer(schemaNameInfoText); - foreach (KeyValuePair> schemaSet in SchemaGenerator.GenerateSchemas(new List { new ParsedThing(thing, schemaNamer) }, projectName, "Namespace")) + foreach (KeyValuePair> schemaSet in SchemaGenerator.GenerateSchemas(new List { new ParsedThing(thing, modelFolder.FullName, schemaNamer) }, projectName, outputFolder)) { foreach (GeneratedItem genSchema in schemaSet.Value) { From 52a30651b92092812539ed5b4a20bc6550e19c55 Mon Sep 17 00:00:00 2001 From: Auto Gen Date: Tue, 4 Nov 2025 14:45:00 -0800 Subject: [PATCH 05/52] enhance external schema support --- codegen2/eval/dg.sh | 4 +- codegen2/eval/g1.sh | 9 + codegen2/eval/wot/ExternalSchemas.TD.json | 28 +++- .../wot/ExternalSchemas/AlephProp.schema.json | 10 +- .../wot/ExternalSchemas/BethData.schema.json | 78 ++++++++- .../DoSomethingInput.schema.json | 2 +- .../SchemaNamer.cs | 8 +- .../CommandHandler.cs | 2 +- .../ActionSchemaGenerator.cs | 18 +- .../AliasSpec.cs | 6 + ...zure.Iot.Operations.SchemaGenerator.csproj | 10 ++ .../SchemaGenerator.cs | 2 +- .../SchemaTransformFactory.cs | 10 ++ .../json/JsonSchemaSupport.cs | 8 +- .../json/code/AliasJsonSchema.cs | 23 +++ .../json/t4/AliasJsonSchema.tt | 9 + .../Azure.Iot.Operations.TypeGenerator.csproj | 20 +++ .../DotNetTypeGenerator.cs | 7 +- .../ISchemaStandardizer.cs | 2 +- .../ITypeGenerator.cs | 2 +- .../JsonSchemaStandardizer.cs | 157 ++++++++++++------ .../RustTypeGenerator.cs | 7 +- .../TypeGenerator.cs | 4 +- .../common/AliasType.cs | 22 +++ .../common/EnumType.cs | 5 +- .../common/ObjectType.cs | 5 +- .../common/ReferenceType.cs | 9 +- .../common/SchemaKind.cs | 1 + .../dotnet/code/DotNetAlias.cs | 22 +++ .../dotnet/code/DotNetEnum.cs | 6 +- .../dotnet/code/DotNetObject.cs | 8 +- .../dotnet/t4/DotNetAlias.tt | 10 ++ .../dotnet/t4/DotNetEnum.tt | 2 +- .../dotnet/t4/DotNetObject.tt | 5 +- .../rust/code/RustAlias.cs | 23 +++ .../rust/code/RustEnum.cs | 8 +- .../rust/code/RustObject.cs | 6 +- .../rust/t4/RustAlias.tt | 10 ++ .../rust/t4/RustObject.tt | 4 - codegen2/src/TypeTester/Program.cs | 2 +- 40 files changed, 459 insertions(+), 115 deletions(-) create mode 100644 codegen2/eval/g1.sh create mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/AliasSpec.cs create mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/AliasJsonSchema.cs create mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/AliasJsonSchema.tt create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/common/AliasType.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/code/DotNetAlias.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetAlias.tt create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/code/RustAlias.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustAlias.tt diff --git a/codegen2/eval/dg.sh b/codegen2/eval/dg.sh index 4d1b2ee271..901691038a 100644 --- a/codegen2/eval/dg.sh +++ b/codegen2/eval/dg.sh @@ -24,6 +24,6 @@ # odd ../../codegen/test/samples/rust/PropertySeparateSample/property_separate_gen/src rust/property_separate_gen/src & -# odd ../../codegen/test/samples/dotnet/PropertyTogetherSample dotnet/PropertyTogetherSample & +odd ../../codegen/test/samples/dotnet/PropertyTogetherSample dotnet/PropertyTogetherSample & -# odd ../../codegen/test/samples/rust/PropertyTogetherSample/property_together_gen/src rust/property_together_gen/src & +odd ../../codegen/test/samples/rust/PropertyTogetherSample/property_together_gen/src rust/property_together_gen/src & diff --git a/codegen2/eval/g1.sh b/codegen2/eval/g1.sh new file mode 100644 index 0000000000..dc7f239857 --- /dev/null +++ b/codegen2/eval/g1.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +gen=../src/Azure.Iot.Operations.ProtocolCompiler/bin/Debug/net9.0/Azure.Iot.Operations.ProtocolCompiler.exe + +[[ -d dotnet/ExternalSchemasSample ]] && rm -r dotnet/ExternalSchemasSample +$gen --thingFiles wot/ExternalSchemas.TD.json --extSchemas wot/ExternalSchemas/*.schema.json --outDir dotnet/ExternalSchemasSample --lang csharp --namespace ExternalSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol + +[[ -d rust/external_schemas_gen ]] && rm -r rust/external_schemas_gen +$gen --thingFiles wot/ExternalSchemas.TD.json --extSchemas wot/ExternalSchemas/*.schema.json --outDir rust/external_schemas_gen --lang rust --namespace ExternalSchemas --sdkPath ../../rust --srcSubdir src diff --git a/codegen2/eval/wot/ExternalSchemas.TD.json b/codegen2/eval/wot/ExternalSchemas.TD.json index 4633a87895..2f6741f7d2 100644 --- a/codegen2/eval/wot/ExternalSchemas.TD.json +++ b/codegen2/eval/wot/ExternalSchemas.TD.json @@ -60,7 +60,33 @@ { "href": "dtmi:jsonTest:ExternalSchemas:_contents:__Beth;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/{senderId}/telemetry/{telemetryName}", + "dtv:topic": "sample/{modelId}/{senderId}/telemetry/Beth", + "op": "subscribeevent" + } + ] + }, + "Gimel": { + "data": { + "dtv:ref": "./ExternalSchemas/BethData.schema.json#/definitions/Temperature" + }, + "forms": [ + { + "href": "dtmi:jsonTest:ExternalSchemas:_contents:__Gimel;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/{senderId}/telemetry/Gimel", + "op": "subscribeevent" + } + ] + }, + "Dalet": { + "data": { + "dtv:ref": "./ExternalSchemas/BethData.schema.json#/definitions/org.opcfoundation.UA.DateTime" + }, + "forms": [ + { + "href": "dtmi:jsonTest:ExternalSchemas:_contents:__Dalet;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/{senderId}/telemetry/Dalet", "op": "subscribeevent" } ] diff --git a/codegen2/eval/wot/ExternalSchemas/AlephProp.schema.json b/codegen2/eval/wot/ExternalSchemas/AlephProp.schema.json index c280980789..1548371fd0 100644 --- a/codegen2/eval/wot/ExternalSchemas/AlephProp.schema.json +++ b/codegen2/eval/wot/ExternalSchemas/AlephProp.schema.json @@ -11,7 +11,15 @@ }, "zeta": { "description": "The 'zeta' Field.", - "type": "integer", "minimum": -2147483648, "maximum": 2147483647 + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + }, + "iota": { + "$ref": "./BethData.schema.json#/definitions/HeaterState" + }, + "kappa": { + "$ref": "./BethData.schema.json#/definitions/org.opcfoundation.UA.Int32" } } } diff --git a/codegen2/eval/wot/ExternalSchemas/BethData.schema.json b/codegen2/eval/wot/ExternalSchemas/BethData.schema.json index 8d917bf18c..3b17b9e754 100644 --- a/codegen2/eval/wot/ExternalSchemas/BethData.schema.json +++ b/codegen2/eval/wot/ExternalSchemas/BethData.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft-07/schema", - "title": "BethData", + "title": "BethDatata", "type": "object", "additionalProperties": false, "required": [ "eta", "theta" ], @@ -11,7 +11,81 @@ }, "theta": { "description": "The 'theta' Field.", - "type": "integer", "minimum": -2147483648, "maximum": 2147483647 + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + }, + "iota": { + "$ref": "#/definitions/org.opcfoundation.UA.DateTime" + }, + "kappa": { + "$ref": "#/definitions/Temperature" + }, + "lambda": { + "$ref": "#/definitions/HeaterState" + } + }, + "definitions": { + "org.opcfoundation.UA.DateTime": { + "type": "string", + "title": "OpcUaDateTime", + "format": "date-time" + }, + "org.opcfoundation.UA.Int32": { + "type": "integer", + "title": "OpcUaInt32", + "format": "int32", + "minimum": -2147483648, + "maximum": 2147483647 + }, + "Temperature": { + "type": "object", + "title": "Temperatura", + "properties": { + "Top": { + "$ref": "#/definitions/org.opcfoundation.UA.Int32" + }, + "Bottom": { + "$ref": "#/definitions/org.opcfoundation.UA.Int32" + }, + "ChillerState": { + "type": "object", + "additionalProperties": { + "type": "string", + "title": "ChillerState", + "enum": [ + "Off_0", + "On_1" + ] + } + }, + "GeoLocation": { + "type": "array", + "items": { + "type": "object", + "title": "Coordinates", + "additionalProperties": false, + "properties": { + "latitude": { + "type": "number", + "format": "double" + }, + "longitude": { + "type": "number", + "format": "double" + } + } + } + } + } + }, + "HeaterState": { + "type": "string", + "title": "HeaterState", + "enum": [ + "Off_0", + "On_1" + ] } } } diff --git a/codegen2/eval/wot/ExternalSchemas/DoSomethingInput.schema.json b/codegen2/eval/wot/ExternalSchemas/DoSomethingInput.schema.json index ac97230d70..81e8cfa2ea 100644 --- a/codegen2/eval/wot/ExternalSchemas/DoSomethingInput.schema.json +++ b/codegen2/eval/wot/ExternalSchemas/DoSomethingInput.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft-07/schema", - "title": "DoSomethingInput", + "title": "DoSomethingInputStruct", "description": "Input arguments for action 'DoSomething'", "type": "object", "additionalProperties": false, diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNamer.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNamer.cs index b6ff5cba29..8f288d28d8 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNamer.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNamer.cs @@ -100,13 +100,7 @@ public SchemaNamer(string? schemaNameInfoText) private string Expand(TDDataSchema? dataSchema, FuncInfo? funcInfo, string defaultOut, params string[] args) { - if (dataSchema?.Ref != null) - { - string filename = Path.GetFileName(dataSchema.Ref); - return filename.Substring(0, filename.IndexOf('.')); - } - - if (!this.suppressTitles && dataSchema?.Title != null) + if (!this.suppressTitles && dataSchema?.Ref == null && dataSchema?.Title != null) { return dataSchema.Title; } diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs index cc7806693b..a68e0afd26 100644 --- a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs @@ -53,7 +53,7 @@ public static int GenerateCode(OptionContainer options) List generatedTypes = new(); foreach (KeyValuePair> schemaSet in generatedSchemas) { - Dictionary schemaTextsByName = schemaSet.Value.ToDictionary(s => s.FileName, s => s.Content); + Dictionary schemaTextsByName = schemaSet.Value.ToDictionary(s => Path.GetFullPath(Path.Combine(options.WorkingDir.FullName, s.FolderPath, s.FileName)).Replace('\\', '/'), s => s.Content); TypeGenerator typeGenerator = new TypeGenerator(schemaSet.Key, targetLanguage); generatedTypes.AddRange(typeGenerator.GenerateTypes(schemaTextsByName, new CodeName(options.GenNamespace), projectName, options.OutputSourceSubdir)); } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs index 15ee9b07ec..0050ce7e26 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs @@ -7,7 +7,7 @@ internal static class ActionSchemaGenerator { - internal static void GenerateActionSchemas(TDThing tdThing, SchemaNamer schemaNamer, string projectName, Dictionary schemaSpecs, Dictionary> referencedSchemas) + internal static void GenerateActionSchemas(TDThing tdThing, string dirName, SchemaNamer schemaNamer, string projectName, Dictionary schemaSpecs, Dictionary> referencedSchemas) { if (tdThing.Actions != null) { @@ -18,6 +18,7 @@ internal static void GenerateActionSchemas(TDThing tdThing, SchemaNamer schemaNa propKvp.Key, propKvp.Value, projectName, + dirName, tdThing.SchemaDefinitions, schemaSpecs, referencedSchemas); @@ -30,6 +31,7 @@ private static void ProcessAction( string actionName, TDAction tdAction, string projectName, + string dirName, Dictionary? schemaDefinitions, Dictionary schemaSpecs, Dictionary> referencedSchemas) @@ -39,7 +41,12 @@ private static void ProcessAction( if (actionForm?.TopicPattern != null) { - if (tdAction.Input != null && tdAction.Input.Ref == null) + if (tdAction.Input?.Ref != null) + { + string inputSchemaName = schemaNamer.GetActionInSchema(null, actionName); + schemaSpecs[inputSchemaName] = new AliasSpec(null, tdAction.Input.Ref, actionForm.Format, inputSchemaName, dirName); + } + else if (tdAction.Input != null) { string inputSchemaName = schemaNamer.GetActionInSchema(tdAction.Input, actionName); ObjectSpec inputObjectSpec = ObjectSpec.CreateFromDataSchema(schemaNamer, tdAction.Input, actionForm.Format, inputSchemaName, tdAction.Input.Description ?? $"Input arguments for action '{actionName}'"); @@ -47,7 +54,12 @@ private static void ProcessAction( } Dictionary responseFields = new(); - if (tdAction.Output != null && tdAction.Output.Ref == null) + if (tdAction.Output?.Ref != null) + { + string outputSchemaName = schemaNamer.GetActionOutSchema(null, actionName); + schemaSpecs[outputSchemaName] = new AliasSpec(null, tdAction.Output.Ref, actionForm.Format, outputSchemaName, dirName); + } + else if (tdAction.Output != null) { string outputSchemaName = schemaNamer.GetActionOutSchema(tdAction.Output, actionName); ObjectSpec outputObjectSpec = ObjectSpec.CreateFromDataSchema(schemaNamer, tdAction.Output, actionForm.Format, outputSchemaName, tdAction.Output.Description ?? $"Output arguments for action '{actionName}'"); diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/AliasSpec.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/AliasSpec.cs new file mode 100644 index 0000000000..82a475edd8 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/AliasSpec.cs @@ -0,0 +1,6 @@ +namespace Azure.Iot.Operations.SchemaGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + + internal record AliasSpec(string? Description, string Ref, SerializationFormat Format, string SchemaName, string Base) : SchemaSpec(Format); +} diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/Azure.Iot.Operations.SchemaGenerator.csproj b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/Azure.Iot.Operations.SchemaGenerator.csproj index d4f530bb89..f3b821762b 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/Azure.Iot.Operations.SchemaGenerator.csproj +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/Azure.Iot.Operations.SchemaGenerator.csproj @@ -20,6 +20,11 @@ ConstSchema.cs Azure.Iot.Operations.SchemaGenerator + + TextTemplatingFilePreprocessor + AliasJsonSchema.cs + Azure.Iot.Operations.SchemaGenerator + TextTemplatingFilePreprocessor EnumJsonSchema.cs @@ -42,6 +47,11 @@ True ConstSchema.tt + + True + True + AliasJsonSchema.tt + True True diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs index ab533f52fe..50d488d3e4 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs @@ -17,7 +17,7 @@ public static Dictionary> GenerateSchem Dictionary> referencedSchemas = new(); PropertySchemaGenerator.GeneratePropertySchemas(parsedThing.Thing, parsedThing.DirectoryName, parsedThing.SchemaNamer, projectName, schemaSpecs, referencedSchemas); - ActionSchemaGenerator.GenerateActionSchemas(parsedThing.Thing, parsedThing.SchemaNamer, projectName, schemaSpecs, referencedSchemas); + ActionSchemaGenerator.GenerateActionSchemas(parsedThing.Thing, parsedThing.DirectoryName, parsedThing.SchemaNamer, projectName, schemaSpecs, referencedSchemas); EventSchemaGenerator.GenerateEventSchemas(parsedThing.Thing, parsedThing.DirectoryName, parsedThing.SchemaNamer, projectName, schemaSpecs, referencedSchemas); Dictionary closedSchemaSpecs = ComputeClosedSchemaSpecs(parsedThing.Thing, parsedThing.SchemaNamer, schemaSpecs, referencedSchemas); diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaTransformFactory.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaTransformFactory.cs index b80221f804..13755f76c6 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaTransformFactory.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaTransformFactory.cs @@ -19,6 +19,7 @@ internal ISchemaTemplateTransform GetSchemaTransform(string schemaName, SchemaSp { ObjectSpec objectSpec => GetObjectSchemaTransform(schemaName, objectSpec), EnumSpec enumSpec => GetEnumSchemaTransform(schemaName, enumSpec), + AliasSpec aliasSpec => GetAliasSchemaTransform(schemaName, aliasSpec), _ => throw new NotSupportedException($"Unable to transform schema spec of type {schemaSpec.GetType()}."), }; } @@ -40,5 +41,14 @@ internal ISchemaTemplateTransform GetEnumSchemaTransform(string schemaName, Enum _ => throw new NotSupportedException($"Serialization format {enumSpec.Format} is not supported."), }; } + + internal ISchemaTemplateTransform GetAliasSchemaTransform(string schemaName, AliasSpec aliasSpec) + { + return aliasSpec.Format switch + { + SerializationFormat.Json => new AliasJsonSchema(this.jsonSchemaSupport, schemaName, aliasSpec), + _ => throw new NotSupportedException($"Serialization format {aliasSpec.Format} is not supported."), + }; + } } } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs index a9c8888fd9..36d2ea202b 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs @@ -27,12 +27,16 @@ internal string GetFragmented(string typeAndAddenda, bool require) return $"\"type\": \"object\", \"additionalProperties\": {{ {addProps} }}"; } + internal string GetReferencePath(string reference, string refBase) + { + return Path.GetRelativePath(this.workingDir.FullName, Path.Combine(refBase, reference)).Replace('\\', '/'); + } + internal string GetTypeAndAddenda(TDDataSchema tdSchema, string backupSchemaName, string refBase) { if (tdSchema.Ref != null) { - string schemaDir = Path.GetRelativePath(this.workingDir.FullName, Path.Combine(refBase, tdSchema.Ref)).Replace('\\', '/'); - return $"\"$ref\": \"{schemaDir}\""; + return $"\"$ref\": \"{GetReferencePath(tdSchema.Ref, refBase)}\""; } if ((tdSchema.Type == TDValues.TypeObject && tdSchema.AdditionalProperties?.Boolean == false) || diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/AliasJsonSchema.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/AliasJsonSchema.cs new file mode 100644 index 0000000000..883e8a529b --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/AliasJsonSchema.cs @@ -0,0 +1,23 @@ +namespace Azure.Iot.Operations.SchemaGenerator +{ + using System.IO; + using Azure.Iot.Operations.CodeGeneration; + + public partial class AliasJsonSchema : ISchemaTemplateTransform + { + private readonly JsonSchemaSupport schemaSupport; + private readonly string schemaName; + private readonly AliasSpec aliasSpec; + + internal AliasJsonSchema(JsonSchemaSupport schemaSupport, string schemaName, AliasSpec aliasSpec) + { + this.schemaSupport = schemaSupport; + this.schemaName = schemaName; + this.aliasSpec = aliasSpec; + } + + public SerializationFormat Format { get => SerializationFormat.Json; } + + public string FileName { get => $"{this.schemaName}.schema.json"; } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/AliasJsonSchema.tt b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/AliasJsonSchema.tt new file mode 100644 index 0000000000..9891b1c06d --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/AliasJsonSchema.tt @@ -0,0 +1,9 @@ +<#@ template language="C#" linePragmas="false" #> +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "<#=this.schemaName#>", +<# if (this.aliasSpec.Description != null) { #> + "description": "<#=this.aliasSpec.Description#>", +<# } #> + "$ref": "<#=this.schemaSupport.GetReferencePath(this.aliasSpec.Ref, this.aliasSpec.Base)#>" +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/Azure.Iot.Operations.TypeGenerator.csproj b/codegen2/src/Azure.Iot.Operations.TypeGenerator/Azure.Iot.Operations.TypeGenerator.csproj index 8f6d0063dc..f7f6180209 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/Azure.Iot.Operations.TypeGenerator.csproj +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/Azure.Iot.Operations.TypeGenerator.csproj @@ -15,6 +15,11 @@ + + TextTemplatingFilePreprocessor + DotNetAlias.cs + Azure.Iot.Operations.TypeGenerator + TextTemplatingFilePreprocessor DotNetEnum.cs @@ -25,6 +30,11 @@ DotNetObject.cs Azure.Iot.Operations.TypeGenerator + + TextTemplatingFilePreprocessor + RustAlias.cs + Azure.Iot.Operations.TypeGenerator + TextTemplatingFilePreprocessor RustEnum.cs @@ -42,6 +52,11 @@ + + True + True + DotNetAlias.tt + True True @@ -52,6 +67,11 @@ True DotNetObject.tt + + True + True + RustAlias.tt + True True diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/DotNetTypeGenerator.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/DotNetTypeGenerator.cs index e65d0564e8..3ba2be6361 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/DotNetTypeGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/DotNetTypeGenerator.cs @@ -6,12 +6,13 @@ internal class DotNetTypeGenerator : ITypeGenerator { - public GeneratedItem GenerateTypeFromSchema(SchemaType schemaType, string projectName, SerializationFormat serFormat, string _) + public GeneratedItem GenerateTypeFromSchema(SchemaType schemaType, string projectName, CodeName genNamespace, SerializationFormat serFormat, string _) { ITypeTemplateTransform templateTransform = schemaType switch { - ObjectType objectType => new DotNetObject(projectName, objectType, serFormat), - EnumType enumType => new DotNetEnum(projectName, enumType), + AliasType aliasType => new DotNetAlias(projectName, genNamespace, aliasType), + ObjectType objectType => new DotNetObject(projectName, genNamespace, objectType, serFormat), + EnumType enumType => new DotNetEnum(projectName, genNamespace, enumType), _ => throw new Exception("unrecognized schema type"), }; diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/ISchemaStandardizer.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/ISchemaStandardizer.cs index 5edceb94fd..f5735824e9 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/ISchemaStandardizer.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/ISchemaStandardizer.cs @@ -7,6 +7,6 @@ internal interface ISchemaStandardizer { SerializationFormat SerializationFormat { get; } - List GetStandardizedSchemas(Dictionary schemaTextsByName, CodeName genNamespace); + List GetStandardizedSchemas(Dictionary schemaTextsByName); } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/ITypeGenerator.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/ITypeGenerator.cs index 6cb5309957..a5b13653ef 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/ITypeGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/ITypeGenerator.cs @@ -5,6 +5,6 @@ internal interface ITypeGenerator { - GeneratedItem GenerateTypeFromSchema(SchemaType schemaType, string projectName, SerializationFormat serFormat, string srcSubdir); + GeneratedItem GenerateTypeFromSchema(SchemaType schemaType, string projectName, CodeName genNamespace, SerializationFormat serFormat, string srcSubdir); } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs index ad30f296e2..dca997c57b 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs @@ -14,114 +14,151 @@ internal class JsonSchemaStandardizer : ISchemaStandardizer public SerializationFormat SerializationFormat { get => SerializationFormat.Json; } - public List GetStandardizedSchemas(Dictionary schemaTextsByName, CodeName genNamespace) + public List GetStandardizedSchemas(Dictionary schemaTextsByName) { + Dictionary rootElementsByName = GetRootElementsFromSchemaTexts(schemaTextsByName); + List schemaTypes = new(); - foreach (string schemaText in schemaTextsByName.Values) + foreach (KeyValuePair namedRootElt in rootElementsByName) { - using (JsonDocument schemaDoc = JsonDocument.Parse(schemaText)) + CollateAliasTypes(namedRootElt.Key, namedRootElt.Value, schemaTypes, rootElementsByName); + CollateSchemaTypes(namedRootElt.Key, namedRootElt.Value, schemaTypes, rootElementsByName); + + foreach (string internalDefsKey in InternalDefsKeys) { - string? internalDefsKey = null; - foreach (string key in InternalDefsKeys) + if (namedRootElt.Value.TryGetProperty(internalDefsKey, out JsonElement defsElt)) { - if (schemaDoc.RootElement.TryGetProperty(key, out _)) + foreach (JsonProperty defProp in defsElt.EnumerateObject()) { - internalDefsKey = key; - break; + CollateSchemaTypes(namedRootElt.Key, defProp.Value, schemaTypes, rootElementsByName); } } + } + } - CollateSchemaTypes(schemaDoc.RootElement, schemaDoc.RootElement, internalDefsKey, genNamespace, schemaTypes, schemaTextsByName); + return schemaTypes; + } - if (internalDefsKey != null) - { - if (schemaDoc.RootElement.TryGetProperty(internalDefsKey, out JsonElement defsElt)) - { - foreach (JsonProperty defProp in defsElt.EnumerateObject()) - { - CollateSchemaTypes(schemaDoc.RootElement, defProp.Value, internalDefsKey, genNamespace, schemaTypes, schemaTextsByName); - } - } - } + private Dictionary GetRootElementsFromSchemaTexts(Dictionary schemaTextsByName) + { + Dictionary rootElementsByName = new(); + + foreach (KeyValuePair namedSchemaText in schemaTextsByName) + { + using (JsonDocument schemaDoc = JsonDocument.Parse(namedSchemaText.Value)) + { + rootElementsByName[namedSchemaText.Key] = schemaDoc.RootElement.Clone(); } } - return schemaTypes; + return rootElementsByName; } - internal void CollateSchemaTypes(JsonElement rootElt, JsonElement schemaElt, string? internalDefsKey, CodeName genNamespace, List schemaTypes, Dictionary schemaTextsByName) + internal void CollateAliasTypes(string docName, JsonElement schemaElt, List schemaTypes, Dictionary rootElementsByName) { - string? title = schemaElt.GetProperty("title").GetString(); - if (string.IsNullOrEmpty(title)) + if (!schemaElt.TryGetProperty("title", out JsonElement titleElt) || !schemaElt.TryGetProperty("$ref", out JsonElement referencingElt)) { - throw new InvalidOperationException($"The 'title' property is missing or empty in the JSON schema."); + return; } + + string title = titleElt.GetString()!; + + JsonElement referencedElt = GetReferencedElement(docName, referencingElt, rootElementsByName); + string refTitle = referencedElt.GetProperty("title").GetString()!; + + string? description = schemaElt.TryGetProperty("description", out JsonElement descElt) ? descElt.GetString() : null; + + schemaTypes.Add(new AliasType(new CodeName(title), description, new CodeName(refTitle))); + } + + internal void CollateSchemaTypes(string docName, JsonElement schemaElt, List schemaTypes, Dictionary rootElementsByName) + { + if (!schemaElt.TryGetProperty("type", out JsonElement typeElt)) + { + return; + } + + string type = typeElt.GetString()!; + if (type == "object" && schemaElt.TryGetProperty("additionalProperties", out JsonElement addlPropsElt) && addlPropsElt.ValueKind == JsonValueKind.Object) + { + CollateSchemaTypes(docName, addlPropsElt, schemaTypes, rootElementsByName); + return; + } + else if (type == "array" && schemaElt.TryGetProperty("items", out JsonElement itemsElt) && itemsElt.ValueKind == JsonValueKind.Object) + { + CollateSchemaTypes(docName, itemsElt, schemaTypes, rootElementsByName); + return; + } + + string title = schemaElt.TryGetProperty("title", out JsonElement titleElt) ? titleElt.GetString()! : "SomeDefaultTitleShouldNotBeConstValue"; CodeName schemaName = new CodeName((char.IsNumber(title[0]) ? "_" : "") + Regex.Replace(title, "[^a-zA-Z0-9]+", "_", RegexOptions.CultureInvariant)); string? description = schemaElt.TryGetProperty("description", out JsonElement descElt) ? descElt.GetString() : null; - if (schemaElt.TryGetProperty("properties", out JsonElement propertiesElt) && schemaElt.GetProperty("type").GetString() == "object") + if (schemaElt.TryGetProperty("properties", out JsonElement propertiesElt) && typeElt.GetString() == "object") { + foreach (JsonProperty objProp in propertiesElt.EnumerateObject()) + { + CollateSchemaTypes(docName, objProp.Value, schemaTypes, rootElementsByName); + } + HashSet indirectFields = schemaElt.TryGetProperty("x-indirect", out JsonElement indirectElt) ? indirectElt.EnumerateArray().Select(e => e.GetString()!).ToHashSet() : new HashSet(); HashSet requiredFields = schemaElt.TryGetProperty("required", out JsonElement requiredElt) ? requiredElt.EnumerateArray().Select(e => e.GetString()!).ToHashSet() : new HashSet(); schemaTypes.Add(new ObjectType( schemaName, - genNamespace, description, - propertiesElt.EnumerateObject().ToDictionary(p => new CodeName(p.Name), p => GetObjectTypeFieldInfo(rootElt, p.Name, p.Value, internalDefsKey, indirectFields, requiredFields, genNamespace, schemaTextsByName)))); + propertiesElt.EnumerateObject().ToDictionary(p => new CodeName(p.Name), p => GetObjectTypeFieldInfo(docName, p.Name, p.Value, indirectFields, requiredFields, rootElementsByName)))); } else if (schemaElt.TryGetProperty("enum", out JsonElement enumElt)) { CodeName[] enumValues = enumElt.EnumerateArray().Select(e => new CodeName(e.GetString()!)).ToArray(); schemaTypes.Add(new EnumType( schemaName, - genNamespace, description, enumValues)); } } - private ObjectType.FieldInfo GetObjectTypeFieldInfo(JsonElement rootElt, string fieldName, JsonElement schemaElt, string? internalDefsKey, HashSet indirectFields, HashSet requiredFields, CodeName genNamespace, Dictionary schemaTextsByName) + private ObjectType.FieldInfo GetObjectTypeFieldInfo(string docName, string fieldName, JsonElement schemaElt, HashSet indirectFields, HashSet requiredFields, Dictionary rootElementsByName) { return new ObjectType.FieldInfo( - GetSchemaTypeFromJsonElement(rootElt, schemaElt, internalDefsKey, genNamespace, schemaTextsByName), + GetSchemaTypeFromJsonElement(docName, schemaElt, rootElementsByName), indirectFields.Contains(fieldName), requiredFields.Contains(fieldName), schemaElt.TryGetProperty("description", out JsonElement descElt) ? descElt.GetString() : null, schemaElt.TryGetProperty("index", out JsonElement indexElt) ? indexElt.GetInt32() : null); } - private SchemaType GetSchemaTypeFromJsonElement(JsonElement rootElt, JsonElement schemaElt, string? internalDefsKey, CodeName genNamespace, Dictionary schemaTextsByName) + private SchemaType GetSchemaTypeFromJsonElement(string docName, JsonElement schemaElt, Dictionary rootElementsByName) { if (!schemaElt.TryGetProperty("$ref", out JsonElement referencingElt)) { - return GetPrimitiveTypeFromJsonElement(rootElt, schemaElt, internalDefsKey, genNamespace, schemaTextsByName); - } - - string refString = referencingElt.GetString()!; - - if (internalDefsKey == null || !refString.StartsWith($"#/{internalDefsKey}/")) - { - string refName = Path.GetFileName(refString); - using (JsonDocument refDoc = JsonDocument.Parse(schemaTextsByName[refName])) + if (schemaElt.TryGetProperty("title", out JsonElement titleElt) && schemaElt.TryGetProperty("type", out JsonElement typeElt)) { - string title = refDoc.RootElement.GetProperty("title").GetString()!; - string type = refDoc.RootElement.GetProperty("type").GetString()!; - return new ReferenceType(new CodeName(title), genNamespace, isNullable: type == "object"); + if (typeElt.GetString() == "object" && (!schemaElt.TryGetProperty("additionalProperties", out JsonElement addlPropsElt) || addlPropsElt.ValueKind == JsonValueKind.False)) + { + return new ReferenceType(new CodeName(titleElt.GetString()!), isNullable: true); + } + else if (typeElt.GetString() == "string" && schemaElt.TryGetProperty("enum", out _)) + { + return new ReferenceType(new CodeName(titleElt.GetString()!), isNullable: false); + } } + + return GetPrimitiveTypeFromJsonElement(docName, schemaElt, rootElementsByName); } - JsonElement referencedElt = rootElt.GetProperty(internalDefsKey).GetProperty(refString.Substring($"#/{internalDefsKey}/".Length)); + JsonElement referencedElt = GetReferencedElement(docName, referencingElt, rootElementsByName); if (referencedElt.TryGetProperty("properties", out _) || referencedElt.TryGetProperty("enum", out _)) { string title = referencedElt.GetProperty("title").GetString()!; string type = referencedElt.GetProperty("type").GetString()!; - return new ReferenceType(new CodeName(title), genNamespace, isNullable: type == "object"); + return new ReferenceType(new CodeName(title), isNullable: type == "object"); } - return GetPrimitiveTypeFromJsonElement(rootElt, referencedElt, internalDefsKey, genNamespace, schemaTextsByName); + return GetPrimitiveTypeFromJsonElement(docName, referencedElt, rootElementsByName); } private bool TryGetNestedNullableJsonElement(ref JsonElement jsonElement) @@ -143,16 +180,16 @@ private bool TryGetNestedNullableJsonElement(ref JsonElement jsonElement) return false; } - private SchemaType GetPrimitiveTypeFromJsonElement(JsonElement rootElt, JsonElement schemaElt, string? internalDefsKey, CodeName genNamespace, Dictionary schemaTextsByName) + private SchemaType GetPrimitiveTypeFromJsonElement(string docName, JsonElement schemaElt, Dictionary rootElementsByName) { switch (schemaElt.GetProperty("type").GetString()) { case "array": - return new ArrayType(GetSchemaTypeFromJsonElement(rootElt, schemaElt.GetProperty("items"), internalDefsKey, genNamespace, schemaTextsByName)); + return new ArrayType(GetSchemaTypeFromJsonElement(docName, schemaElt.GetProperty("items"), rootElementsByName)); case "object": JsonElement typeAndAddendaElt = schemaElt.GetProperty("additionalProperties"); bool nullValues = TryGetNestedNullableJsonElement(ref typeAndAddendaElt); - return new MapType(GetSchemaTypeFromJsonElement(rootElt, typeAndAddendaElt, internalDefsKey, genNamespace, schemaTextsByName), nullValues); + return new MapType(GetSchemaTypeFromJsonElement(docName, typeAndAddendaElt, rootElementsByName), nullValues); case "boolean": return new BooleanType(); case "number": @@ -206,5 +243,27 @@ private SchemaType GetPrimitiveTypeFromJsonElement(JsonElement rootElt, JsonElem throw new Exception($"unrecognized schema (type = {schemaElt.GetProperty("type").GetString()})"); } } + + private JsonElement GetReferencedElement(string docName, JsonElement referencingElt, Dictionary rootElementsByName) + { + string refString = referencingElt.GetString()!; + int fragIx = refString.IndexOf('#'); + + string baseRef = fragIx switch + { + < 0 => refString, + > 0 => refString.Substring(0, fragIx), + 0 => docName, + }; + string fragment = fragIx < 0 ? string.Empty : refString.Substring(fragIx + 2); + + string refName = Path.GetFullPath(Path.Combine(Path.GetDirectoryName(docName)!, baseRef)).Replace('\\', '/'); + JsonElement rootElt = rootElementsByName[refName]; + + int sepIx = fragment.IndexOf('/'); + JsonElement referencedElt = sepIx > 0 ? rootElt.GetProperty(fragment.Substring(0, sepIx)).GetProperty(fragment.Substring(sepIx + 1)) : rootElt; + + return referencedElt; + } } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/RustTypeGenerator.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/RustTypeGenerator.cs index fc5c88acdf..d94ba98b6a 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/RustTypeGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/RustTypeGenerator.cs @@ -6,12 +6,13 @@ internal class RustTypeGenerator : ITypeGenerator { - public GeneratedItem GenerateTypeFromSchema(SchemaType schemaType, string projectName, SerializationFormat serFormat, string srcSubdir) + public GeneratedItem GenerateTypeFromSchema(SchemaType schemaType, string projectName, CodeName genNamespace, SerializationFormat serFormat, string srcSubdir) { ITypeTemplateTransform templateTransform = schemaType switch { - ObjectType objectType => new RustObject(objectType, allowSkipping: serFormat == SerializationFormat.Json, srcSubdir), - EnumType enumType => new RustEnum(enumType, srcSubdir), + AliasType aliasType => new RustAlias(genNamespace, aliasType, srcSubdir), + ObjectType objectType => new RustObject(genNamespace, objectType, allowSkipping: serFormat == SerializationFormat.Json, srcSubdir), + EnumType enumType => new RustEnum(genNamespace, enumType, srcSubdir), _ => throw new Exception("unrecognized schema type"), }; diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/TypeGenerator.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/TypeGenerator.cs index 7cffe9cfb4..91db7b96c3 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/TypeGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/TypeGenerator.cs @@ -29,9 +29,9 @@ public List GenerateTypes(Dictionary schemaTextsB { List generatedTypes = new(); - foreach (SchemaType schemaType in schemaStandardizer.GetStandardizedSchemas(schemaTextsByName, genNamespace)) + foreach (SchemaType schemaType in schemaStandardizer.GetStandardizedSchemas(schemaTextsByName)) { - generatedTypes.Add(this.typeGenerator.GenerateTypeFromSchema(schemaType, projectName, schemaStandardizer.SerializationFormat, srcSubdir)); + generatedTypes.Add(this.typeGenerator.GenerateTypeFromSchema(schemaType, projectName, genNamespace, schemaStandardizer.SerializationFormat, srcSubdir)); } return generatedTypes; diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/AliasType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/AliasType.cs new file mode 100644 index 0000000000..efa323af68 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/AliasType.cs @@ -0,0 +1,22 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + + internal class AliasType : SchemaType + { + internal override SchemaKind Kind { get => SchemaKind.Alias; } + + internal AliasType(CodeName schemaName, string? description, CodeName referencedName) + { + SchemaName = schemaName; + Description = description; + ReferencedName = referencedName; + } + + internal CodeName SchemaName { get; } + + internal string? Description { get; } + + internal CodeName ReferencedName { get; } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/EnumType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/EnumType.cs index 394a38de79..740f1858b1 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/EnumType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/EnumType.cs @@ -6,18 +6,15 @@ internal class EnumType : SchemaType { internal override SchemaKind Kind { get => SchemaKind.Enum; } - internal EnumType(CodeName schemaName, CodeName genNamespace, string? description, CodeName[] enumValues) + internal EnumType(CodeName schemaName, string? description, CodeName[] enumValues) { SchemaName = schemaName; - Namespace = genNamespace; Description = description; EnumValues = enumValues; } internal CodeName SchemaName { get; } - internal CodeName Namespace { get; } - internal string? Description { get; } internal CodeName[] EnumValues { get; } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ObjectType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ObjectType.cs index 0fefbb31dd..7eeebba93e 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ObjectType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ObjectType.cs @@ -7,18 +7,15 @@ internal class ObjectType : SchemaType { internal override SchemaKind Kind { get => SchemaKind.Object; } - internal ObjectType(CodeName schemaName, CodeName genNamespace, string? description, Dictionary fieldInfos) + internal ObjectType(CodeName schemaName, string? description, Dictionary fieldInfos) { SchemaName = schemaName; - Namespace = genNamespace; Description = description; FieldInfos = fieldInfos; } internal CodeName SchemaName { get; } - internal CodeName Namespace { get; } - internal string? Description { get; } internal Dictionary FieldInfos { get; } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ReferenceType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ReferenceType.cs index 66aa9a8f42..80858aa336 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ReferenceType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ReferenceType.cs @@ -6,18 +6,15 @@ internal class ReferenceType : SchemaType { internal override SchemaKind Kind { get => SchemaKind.Reference; } - internal ReferenceType(CodeName schemaName, CodeName genNamespace, bool isNullable = true, bool isEnum = false) + internal ReferenceType(CodeName schemaName, bool isNullable = true, bool isEnum = false) { SchemaName = schemaName; - Namespace = genNamespace; IsNullable = isNullable; IsEnum = isEnum; } internal CodeName SchemaName { get; } - internal CodeName Namespace { get; } - internal bool IsNullable { get; } internal bool IsEnum { get; } @@ -29,12 +26,12 @@ public override bool Equals(object? obj) internal bool Equals(ReferenceType? other) { - return !ReferenceEquals(null, other) && SchemaName.Equals(other.SchemaName) && Namespace.Equals(other.Namespace); + return !ReferenceEquals(null, other) && SchemaName.Equals(other.SchemaName); } public override int GetHashCode() { - return SchemaName.GetHashCode() ^ Namespace.GetHashCode(); + return SchemaName.GetHashCode(); } } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/SchemaKind.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/SchemaKind.cs index caf0f4a4bf..7fb361b9cc 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/SchemaKind.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/SchemaKind.cs @@ -2,6 +2,7 @@ namespace Azure.Iot.Operations.TypeGenerator { internal enum SchemaKind { + Alias, Array, Boolean, Bytes, diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/code/DotNetAlias.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/code/DotNetAlias.cs new file mode 100644 index 0000000000..6f9b0ca7bd --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/code/DotNetAlias.cs @@ -0,0 +1,22 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + + public partial class DotNetAlias : ITypeTemplateTransform + { + private readonly string projectName; + private readonly CodeName genNamespace; + private readonly AliasType aliasType; + + internal DotNetAlias(string projectName, CodeName genNamespace, AliasType aliasType) + { + this.projectName = projectName; + this.genNamespace = genNamespace; + this.aliasType = aliasType; + } + + public string FileName { get => $"{this.aliasType.SchemaName.GetFileName(TargetLanguage.CSharp)}.g.cs"; } + + public string FolderPath { get => this.genNamespace.GetFolderName(TargetLanguage.CSharp); } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/code/DotNetEnum.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/code/DotNetEnum.cs index 47e61ea021..9793146f94 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/code/DotNetEnum.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/code/DotNetEnum.cs @@ -5,16 +5,18 @@ namespace Azure.Iot.Operations.TypeGenerator public partial class DotNetEnum : ITypeTemplateTransform { private readonly string projectName; + private readonly CodeName genNamespace; private readonly EnumType enumType; - internal DotNetEnum(string projectName, EnumType enumType) + internal DotNetEnum(string projectName, CodeName genNamespace, EnumType enumType) { this.projectName = projectName; + this.genNamespace = genNamespace; this.enumType = enumType; } public string FileName { get => $"{this.enumType.SchemaName.GetFileName(TargetLanguage.CSharp)}.g.cs"; } - public string FolderPath { get => this.enumType.Namespace.GetFolderName(TargetLanguage.CSharp); } + public string FolderPath { get => this.genNamespace.GetFolderName(TargetLanguage.CSharp); } } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/code/DotNetObject.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/code/DotNetObject.cs index 8046e34072..26c0cdd96b 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/code/DotNetObject.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/code/DotNetObject.cs @@ -7,22 +7,22 @@ namespace Azure.Iot.Operations.TypeGenerator public partial class DotNetObject : ITypeTemplateTransform { private readonly string projectName; + private readonly CodeName genNamespace; private readonly ObjectType objectType; - private readonly HashSet referencedNamespaces; private readonly SerializationFormat serFormat; private readonly bool needsNullCheck; - internal DotNetObject(string projectName, ObjectType objectType, SerializationFormat serFormat) + internal DotNetObject(string projectName, CodeName genNamespace, ObjectType objectType, SerializationFormat serFormat) { this.projectName = projectName; + this.genNamespace = genNamespace; this.objectType = objectType; - this.referencedNamespaces = new(TypeGeneratorSupport.GetReferencedSchemas(objectType).Select(s => s.Namespace).Where(n => !n.Equals(objectType.Namespace))); this.serFormat = serFormat; this.needsNullCheck = objectType.FieldInfos.Any(fi => fi.Value.IsRequired && DotNetSchemaSupport.IsNullable(fi.Value.SchemaType)); } public string FileName { get => $"{this.objectType.SchemaName.GetFileName(TargetLanguage.CSharp)}.g.cs"; } - public string FolderPath { get => this.objectType.Namespace.GetFolderName(TargetLanguage.CSharp); } + public string FolderPath { get => this.genNamespace.GetFolderName(TargetLanguage.CSharp); } } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetAlias.tt b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetAlias.tt new file mode 100644 index 0000000000..d73fec5d64 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetAlias.tt @@ -0,0 +1,10 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ + +<# if (this.aliasType.Description != null) { #> + /// + /// <#=this.aliasType.Description#> + /// +<# } #> +global using <#=this.aliasType.SchemaName.GetTypeName(TargetLanguage.CSharp)#> = <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage.CSharp)#>.<#=this.aliasType.ReferencedName.GetTypeName(TargetLanguage.CSharp)#>; diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetEnum.tt b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetEnum.tt index 65cc3b87de..d726f94c22 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetEnum.tt +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetEnum.tt @@ -9,7 +9,7 @@ #pragma warning disable CS8981 // The type name '<#=this.enumType.SchemaName.AsGiven#>' only contains lower-cased ascii characters. <# } #> -namespace <#=this.projectName#>.<#=this.enumType.Namespace.GetTypeName(TargetLanguage.CSharp)#> +namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage.CSharp)#> { <# if (this.enumType.Description != null) { #> /// diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetObject.tt b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetObject.tt index ca2ac8b032..7f4f5ab8bf 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetObject.tt +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetObject.tt @@ -4,7 +4,7 @@ #nullable enable -namespace <#=this.projectName#>.<#=this.objectType.Namespace.GetTypeName(TargetLanguage.CSharp)#> +namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage.CSharp)#> { using System; using System.Collections.Generic; @@ -12,9 +12,6 @@ namespace <#=this.projectName#>.<#=this.objectType.Namespace.GetTypeName(TargetL using System.Text.Json.Serialization; <# } #> using <#=this.projectName#>; -<# foreach (CodeName referencedNamespace in this.referencedNamespaces) { #> - using <#=this.projectName#>.<#=referencedNamespace.GetTypeName(TargetLanguage.CSharp)#>; -<# } #> <# if (this.objectType.Description != null) { #> /// diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/code/RustAlias.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/code/RustAlias.cs new file mode 100644 index 0000000000..f0f9be908a --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/code/RustAlias.cs @@ -0,0 +1,23 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + using System.IO; + using Azure.Iot.Operations.CodeGeneration; + + public partial class RustAlias : ITypeTemplateTransform + { + private readonly CodeName genNamespace; + private readonly AliasType aliasType; + private readonly string srcSubdir; + + internal RustAlias(CodeName genNamespace, AliasType aliasType, string srcSubdir) + { + this.genNamespace = genNamespace; + this.aliasType = aliasType; + this.srcSubdir = srcSubdir; + } + + public string FileName { get => $"{this.aliasType.SchemaName.GetFileName(TargetLanguage.Rust)}.rs"; } + + public string FolderPath { get => Path.Combine(this.srcSubdir, this.genNamespace.GetFolderName(TargetLanguage.Rust)); } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/code/RustEnum.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/code/RustEnum.cs index 54fcf46533..7d510f3f03 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/code/RustEnum.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/code/RustEnum.cs @@ -6,19 +6,21 @@ namespace Azure.Iot.Operations.TypeGenerator public partial class RustEnum : ITypeTemplateTransform { + private readonly CodeName genNamespace; private readonly EnumType enumType; private readonly string srcSubdir; private readonly bool hasNonPascalNames; - internal RustEnum(EnumType enumType, string srcSubdir) + internal RustEnum(CodeName genNamespace, EnumType enumType, string srcSubdir) { + this.genNamespace = genNamespace; this.enumType = enumType; this.srcSubdir = srcSubdir; - this.hasNonPascalNames = this.enumType.EnumValues.Any(v => !char.IsUpper(v.AsGiven[0])); + this.hasNonPascalNames = this.enumType.EnumValues.Any(v => !char.IsUpper(v.AsGiven[0]) || v.AsGiven.Contains('_')); } public string FileName { get => $"{this.enumType.SchemaName.GetFileName(TargetLanguage.Rust)}.rs"; } - public string FolderPath { get => Path.Combine(this.srcSubdir, this.enumType.Namespace.GetFolderName(TargetLanguage.Rust)); } + public string FolderPath { get => Path.Combine(this.srcSubdir, this.genNamespace.GetFolderName(TargetLanguage.Rust)); } } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/code/RustObject.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/code/RustObject.cs index 63528a5657..080ca0bb84 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/code/RustObject.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/code/RustObject.cs @@ -6,13 +6,15 @@ namespace Azure.Iot.Operations.TypeGenerator public partial class RustObject : ITypeTemplateTransform { + private readonly CodeName genNamespace; private readonly ObjectType objectType; private readonly IReadOnlyCollection referencedSchemas; private readonly bool allowSkipping; private readonly string srcSubdir; - internal RustObject(ObjectType objectType, bool allowSkipping, string srcSubdir) + internal RustObject(CodeName genNamespace, ObjectType objectType, bool allowSkipping, string srcSubdir) { + this.genNamespace = genNamespace; this.objectType = objectType; this.referencedSchemas = TypeGeneratorSupport.GetReferencedSchemas(objectType); this.allowSkipping = allowSkipping; @@ -21,6 +23,6 @@ internal RustObject(ObjectType objectType, bool allowSkipping, string srcSubdir) public string FileName { get => $"{this.objectType.SchemaName.GetFileName(TargetLanguage.Rust)}.rs"; } - public string FolderPath { get => Path.Combine(this.srcSubdir, this.objectType.Namespace.GetFolderName(TargetLanguage.Rust)); } + public string FolderPath { get => Path.Combine(this.srcSubdir, this.genNamespace.GetFolderName(TargetLanguage.Rust)); } } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustAlias.tt b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustAlias.tt new file mode 100644 index 0000000000..65de65cef4 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustAlias.tt @@ -0,0 +1,10 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ + +use super::<#=this.aliasType.ReferencedName.GetFileName(TargetLanguage.Rust)#>::<#=this.aliasType.ReferencedName.GetTypeName(TargetLanguage.Rust)#>; + +<# if (this.aliasType.Description != null) { #> +/// <#=this.aliasType.Description#> +<# } #> +pub type <#=this.aliasType.SchemaName.GetTypeName(TargetLanguage.Rust)#> = <#=this.aliasType.ReferencedName.GetTypeName(TargetLanguage.Rust)#>; diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustObject.tt b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustObject.tt index f7e047f6fe..b1edf48c71 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustObject.tt +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustObject.tt @@ -14,11 +14,7 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; <# foreach (var referencedSchema in this.referencedSchemas) { #> <# if (!referencedSchema.SchemaName.Equals(this.objectType.SchemaName)) { #> -<# if (referencedSchema.Namespace.Equals(this.objectType.Namespace)) { #> use super::<#=referencedSchema.SchemaName.GetFileName(TargetLanguage.Rust)#>::<#=referencedSchema.SchemaName.GetTypeName(TargetLanguage.Rust)#>; -<# } else { #> -use super::super::<#=referencedSchema.Namespace.GetFolderName(TargetLanguage.Rust)#>::<#=referencedSchema.SchemaName.GetFileName(TargetLanguage.Rust)#>::<#=referencedSchema.SchemaName.GetTypeName(TargetLanguage.Rust)#>; -<# } #> <# } #> <# } #> diff --git a/codegen2/src/TypeTester/Program.cs b/codegen2/src/TypeTester/Program.cs index 708e114f54..251ede6428 100644 --- a/codegen2/src/TypeTester/Program.cs +++ b/codegen2/src/TypeTester/Program.cs @@ -44,7 +44,7 @@ static void Main(string[] args) { TypeGenerator typeGenerator = new TypeGenerator(formatFilter.Key, targetLanguage); - Dictionary schemaTextsByName = schemaFolder.GetFiles(formatFilter.Value).ToDictionary(f => f.Name, f => File.ReadAllText(f.FullName)); + Dictionary schemaTextsByName = schemaFolder.GetFiles(formatFilter.Value).ToDictionary(f => f.FullName.Replace('\\', '/'), f => File.ReadAllText(f.FullName)); foreach (GeneratedItem genType in typeGenerator.GenerateTypes(schemaTextsByName, new CodeName("Namespace"), projectName, srcSubdir)) { From 5500182f40d34a3b920a62581d3531856e92a34a Mon Sep 17 00:00:00 2001 From: Auto Gen Date: Thu, 6 Nov 2025 11:43:52 -0800 Subject: [PATCH 06/52] add TypeNamer --- codegen2/eval/g1.sh | 4 +- .../eval/wot/ExternalSchemas.TypeNames.json | 9 ++ .../wot/ExternalSchemas/BethData.schema.json | 21 +++++ .../DoSomethingInput.schema.json | 2 +- .../TypeNameInfo.cs | 17 ++++ .../TypeNamer.cs | 58 ++++++++++++ .../ArgBinder.cs | 4 + .../CommandHandler.cs | 5 +- .../OptionContainer.cs | 3 + .../Program.cs | 7 ++ .../JsonSchemaStandardizer.cs | 92 ++++++++++++------- .../TypeGenerator.cs | 4 +- codegen2/src/TypeTester/Program.cs | 4 +- 13 files changed, 188 insertions(+), 42 deletions(-) create mode 100644 codegen2/eval/wot/ExternalSchemas.TypeNames.json create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/TypeNameInfo.cs create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/TypeNamer.cs diff --git a/codegen2/eval/g1.sh b/codegen2/eval/g1.sh index dc7f239857..ad3defc50c 100644 --- a/codegen2/eval/g1.sh +++ b/codegen2/eval/g1.sh @@ -3,7 +3,7 @@ gen=../src/Azure.Iot.Operations.ProtocolCompiler/bin/Debug/net9.0/Azure.Iot.Operations.ProtocolCompiler.exe [[ -d dotnet/ExternalSchemasSample ]] && rm -r dotnet/ExternalSchemasSample -$gen --thingFiles wot/ExternalSchemas.TD.json --extSchemas wot/ExternalSchemas/*.schema.json --outDir dotnet/ExternalSchemasSample --lang csharp --namespace ExternalSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol +$gen --thingFiles wot/ExternalSchemas.TD.json --extSchemas wot/ExternalSchemas/*.schema.json --typeNamer wot/ExternalSchemas.TypeNames.json --outDir dotnet/ExternalSchemasSample --lang csharp --namespace ExternalSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/external_schemas_gen ]] && rm -r rust/external_schemas_gen -$gen --thingFiles wot/ExternalSchemas.TD.json --extSchemas wot/ExternalSchemas/*.schema.json --outDir rust/external_schemas_gen --lang rust --namespace ExternalSchemas --sdkPath ../../rust --srcSubdir src +$gen --thingFiles wot/ExternalSchemas.TD.json --extSchemas wot/ExternalSchemas/*.schema.json --typeNamer wot/ExternalSchemas.TypeNames.json --outDir rust/external_schemas_gen --lang rust --namespace ExternalSchemas --sdkPath ../../rust --srcSubdir src diff --git a/codegen2/eval/wot/ExternalSchemas.TypeNames.json b/codegen2/eval/wot/ExternalSchemas.TypeNames.json new file mode 100644 index 0000000000..09e72241e8 --- /dev/null +++ b/codegen2/eval/wot/ExternalSchemas.TypeNames.json @@ -0,0 +1,9 @@ +{ + "suppressTitles": false, + "nameRules": { + "^.*\\.([A-Za-z]+)$": "{1}", + "^.*/([A-Za-z]+)/([A-Za-z]+);i=([0-9]+)$": "{1}{2}{3}", + "^([A-Za-z][A-Za-z0-9]+)$": "{1}" + }, + "capitalizeCaptures": true +} diff --git a/codegen2/eval/wot/ExternalSchemas/BethData.schema.json b/codegen2/eval/wot/ExternalSchemas/BethData.schema.json index 3b17b9e754..aa2fcf33ec 100644 --- a/codegen2/eval/wot/ExternalSchemas/BethData.schema.json +++ b/codegen2/eval/wot/ExternalSchemas/BethData.schema.json @@ -23,9 +23,30 @@ }, "lambda": { "$ref": "#/definitions/HeaterState" + }, + "ManufacturerUri": { + "$ref": "#/definitions/nsu%3Dhttp%3A%2F%2Fmicrosoft.com%2FOpc%2FOpcPlc%2FBoiler%3Bi%3D6203" + }, + "ManufacturerUnencodedUri": { + "$ref": "#/definitions/nsu=http://microsoft.com/Opc/OpcPlc/Boiler;i=6203" } }, "definitions": { + "nsu=http://microsoft.com/Opc/OpcPlc/Boiler;i=6203": { + "type": "object", + "title": "MicrosoftComOpcOpcPlcBoilerManufacturerUri", + "properties": { + "SourceTimestamp": { + "$ref": "#/definitions/org.opcfoundation.UA.DateTime" + }, + "Value": { + "$ref": "#/definitions/org.opcfoundation.UA.Int32" + }, + "StatusCode": { + "$ref": "#/definitions/org.opcfoundation.UA.Int32" + } + } + }, "org.opcfoundation.UA.DateTime": { "type": "string", "title": "OpcUaDateTime", diff --git a/codegen2/eval/wot/ExternalSchemas/DoSomethingInput.schema.json b/codegen2/eval/wot/ExternalSchemas/DoSomethingInput.schema.json index 81e8cfa2ea..6602997ab6 100644 --- a/codegen2/eval/wot/ExternalSchemas/DoSomethingInput.schema.json +++ b/codegen2/eval/wot/ExternalSchemas/DoSomethingInput.schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft-07/schema", - "title": "DoSomethingInputStruct", + "title": "DoSomethingInputArguments", "description": "Input arguments for action 'DoSomething'", "type": "object", "additionalProperties": false, diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/TypeNameInfo.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/TypeNameInfo.cs new file mode 100644 index 0000000000..42c137d227 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/TypeNameInfo.cs @@ -0,0 +1,17 @@ +namespace Azure.Iot.Operations.CodeGeneration +{ + using System.Collections.Generic; + using System.Text.Json.Serialization; + + public class TypeNameInfo + { + [JsonPropertyName("suppressTitles")] + public bool SuppressTitles { get; set; } + + [JsonPropertyName("nameRules")] + public Dictionary? NameRules { get; set; } + + [JsonPropertyName("capitalizeCaptures")] + public bool CapitalizeCaptures { get; set; } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/TypeNamer.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/TypeNamer.cs new file mode 100644 index 0000000000..3e7f2274ae --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/TypeNamer.cs @@ -0,0 +1,58 @@ +namespace Azure.Iot.Operations.CodeGeneration +{ + using System.Collections.Generic; + using System.IO; + using System.Text.Json; + using System.Text.RegularExpressions; + + public class TypeNamer + { + private TypeNameInfo? typeNameInfo; + private bool suppressTitles; + private Dictionary nameRules; + private bool capitalizeCaptures; + + public TypeNamer(string? typeNameInfoText) + { + this.typeNameInfo = typeNameInfoText != null ? JsonSerializer.Deserialize(typeNameInfoText) : null; + this.suppressTitles = this.typeNameInfo?.SuppressTitles ?? false; + this.nameRules = this.typeNameInfo?.NameRules ?? new(); + this.capitalizeCaptures = this.typeNameInfo?.CapitalizeCaptures ?? false; + } + + public string GenerateTypeName(string schemaName, string? keyName, string? title) + { + if (title != null && !this.suppressTitles) + { + return title; + } + + if (keyName == null) + { + return Capitalize(Path.GetFileName(schemaName).Replace(".schema", string.Empty).Replace(".json", string.Empty)); + } + + foreach (KeyValuePair rule in this.nameRules) + { + Regex rx = new(rule.Key, RegexOptions.IgnoreCase); + Match? match = rx.Match(keyName); + if (match.Success) + { + string replacement = rule.Value; + for (int i = 1; i < match.Groups.Count; i++) + { + string captureValue = match.Groups[i].Captures[0].Value; + replacement = replacement.Replace($"{{{i}}}", this.capitalizeCaptures ? Capitalize(captureValue) : captureValue); + } + + return replacement; + } + } + + uint keyHash = (uint)((long)keyName.GetHashCode() - (long)int.MinValue); + return $"Type{keyHash:D10}"; + } + + private static string Capitalize(string input) => input.Length == 0 ? input : char.ToUpper(input[0]) + input.Substring(1); + } +} diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/ArgBinder.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/ArgBinder.cs index 8be5b49c59..f21d71ada9 100644 --- a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/ArgBinder.cs +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/ArgBinder.cs @@ -11,6 +11,7 @@ public class ArgBinder : BinderBase { private readonly Option thingFiles; private readonly Option extSchemaFiles; + private readonly Option typeNamerFile; private readonly Option outputDir; private readonly Option workingDir; private readonly Option outputSourceSubdir; @@ -40,6 +41,7 @@ public class ArgBinder : BinderBase public ArgBinder( Option thingFiles, Option extSchemaFiles, + Option typeNamerFile, Option outputDir, Option workingDir, Option outputSourceSubdir, @@ -53,6 +55,7 @@ public ArgBinder( { this.thingFiles = thingFiles; this.extSchemaFiles = extSchemaFiles; + this.typeNamerFile = typeNamerFile; this.outputDir = outputDir; this.workingDir = workingDir; this.outputSourceSubdir = outputSourceSubdir; @@ -75,6 +78,7 @@ protected override OptionContainer GetBoundValue(BindingContext bindingContext) { ThingFiles = bindingContext.ParseResult.GetValueForOption(this.thingFiles)!, ExtSchemaFiles = bindingContext.ParseResult.GetValueForOption(this.extSchemaFiles)!, + TypeNamerFile = bindingContext.ParseResult.GetValueForOption(this.typeNamerFile), OutputDir = outputDir, WorkingDir = Path.IsPathRooted(workingDir) ? new DirectoryInfo(workingDir) : new DirectoryInfo(Path.Combine(outputDir.FullName, workingDir)), OutputSourceSubdir = bindingContext.ParseResult.GetValueForOption(this.outputSourceSubdir)!, diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs index a68e0afd26..696db91bf5 100644 --- a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs @@ -50,11 +50,14 @@ public static int GenerateCode(OptionContainer options) ImportSchemas(extSchemaFiles, generatedSchemas); } + string? typeNameInfoText = options.TypeNamerFile?.OpenText()?.ReadToEnd(); + TypeNamer typeNamer = new TypeNamer(typeNameInfoText); + List generatedTypes = new(); foreach (KeyValuePair> schemaSet in generatedSchemas) { Dictionary schemaTextsByName = schemaSet.Value.ToDictionary(s => Path.GetFullPath(Path.Combine(options.WorkingDir.FullName, s.FolderPath, s.FileName)).Replace('\\', '/'), s => s.Content); - TypeGenerator typeGenerator = new TypeGenerator(schemaSet.Key, targetLanguage); + TypeGenerator typeGenerator = new TypeGenerator(schemaSet.Key, targetLanguage, typeNamer); generatedTypes.AddRange(typeGenerator.GenerateTypes(schemaTextsByName, new CodeName(options.GenNamespace), projectName, options.OutputSourceSubdir)); } WriteItems(generatedTypes, options.OutputDir); diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/OptionContainer.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/OptionContainer.cs index 3f1f4662a6..94d4856bb0 100644 --- a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/OptionContainer.cs +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/OptionContainer.cs @@ -13,6 +13,9 @@ public class OptionContainer /// Gets or sets the filespec(s) of files containing external schema definitions. public required string[] ExtSchemaFiles { get; set; } + /// Gets or sets the file containing JSON config for deriving type names from JSON Schema names. + public required FileInfo? TypeNamerFile { get; set; } + /// Gets or sets the directory for storing temporary files. public required DirectoryInfo WorkingDir { get; set; } diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/Program.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/Program.cs index aa69aba85c..d9faffd1ab 100644 --- a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/Program.cs +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/Program.cs @@ -22,6 +22,11 @@ static void Main(string[] args) description: "Filespec(s) of files containing external schema definitions (each may include wildcards).") { ArgumentHelpName = "FILESPEC ...", AllowMultipleArgumentsPerToken = true }; + var typeNamerOption = new Option( + name: "--typeNamer", + description: "File containing JSON config for deriving type names from JSON Schema names") + { ArgumentHelpName = "FILEPATH" }; + var outDirOption = new Option( name: "--outDir", getDefaultValue: () => new DirectoryInfo(DefaultOutDir), @@ -76,6 +81,7 @@ static void Main(string[] args) { thingFilesOption, extSchemasOption, + typeNamerOption, outDirOption, workingDirOption, srcSubdirOption, @@ -91,6 +97,7 @@ static void Main(string[] args) ArgBinder argBinder = new ArgBinder( thingFilesOption, extSchemasOption, + typeNamerOption, outDirOption, workingDirOption, srcSubdirOption, diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs index dca997c57b..78ca48d679 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs @@ -10,7 +10,14 @@ internal class JsonSchemaStandardizer : ISchemaStandardizer { - private readonly string[] InternalDefsKeys = new string[] { "$defs", "definitions" }; + private static readonly string[] InternalDefsKeys = new string[] { "$defs", "definitions" }; + + private readonly TypeNamer typeNamer; + + internal JsonSchemaStandardizer(TypeNamer typeNamer) + { + this.typeNamer = typeNamer; + } public SerializationFormat SerializationFormat { get => SerializationFormat.Json; } @@ -23,7 +30,7 @@ public List GetStandardizedSchemas(Dictionary schema foreach (KeyValuePair namedRootElt in rootElementsByName) { CollateAliasTypes(namedRootElt.Key, namedRootElt.Value, schemaTypes, rootElementsByName); - CollateSchemaTypes(namedRootElt.Key, namedRootElt.Value, schemaTypes, rootElementsByName); + CollateSchemaTypes(namedRootElt.Key, null, namedRootElt.Value, schemaTypes, rootElementsByName); foreach (string internalDefsKey in InternalDefsKeys) { @@ -31,7 +38,7 @@ public List GetStandardizedSchemas(Dictionary schema { foreach (JsonProperty defProp in defsElt.EnumerateObject()) { - CollateSchemaTypes(namedRootElt.Key, defProp.Value, schemaTypes, rootElementsByName); + CollateSchemaTypes(namedRootElt.Key, defProp.Name, defProp.Value, schemaTypes, rootElementsByName); } } } @@ -62,17 +69,20 @@ internal void CollateAliasTypes(string docName, JsonElement schemaElt, List schemaTypes, Dictionary rootElementsByName) + internal void CollateSchemaTypes(string docName, string? defKey, JsonElement schemaElt, List schemaTypes, Dictionary rootElementsByName) { if (!schemaElt.TryGetProperty("type", out JsonElement typeElt)) { @@ -82,17 +92,17 @@ internal void CollateSchemaTypes(string docName, JsonElement schemaElt, List indirectFields = schemaElt.TryGetProperty("x-indirect", out JsonElement indirectElt) ? indirectElt.EnumerateArray().Select(e => e.GetString()!).ToHashSet() : new HashSet(); @@ -123,42 +133,45 @@ internal void CollateSchemaTypes(string docName, JsonElement schemaElt, List indirectFields, HashSet requiredFields, Dictionary rootElementsByName) { return new ObjectType.FieldInfo( - GetSchemaTypeFromJsonElement(docName, schemaElt, rootElementsByName), + GetSchemaTypeFromJsonElement(docName, fieldName, schemaElt, rootElementsByName), indirectFields.Contains(fieldName), requiredFields.Contains(fieldName), schemaElt.TryGetProperty("description", out JsonElement descElt) ? descElt.GetString() : null, schemaElt.TryGetProperty("index", out JsonElement indexElt) ? indexElt.GetInt32() : null); } - private SchemaType GetSchemaTypeFromJsonElement(string docName, JsonElement schemaElt, Dictionary rootElementsByName) + private SchemaType GetSchemaTypeFromJsonElement(string docName, string keyName, JsonElement schemaElt, Dictionary rootElementsByName) { if (!schemaElt.TryGetProperty("$ref", out JsonElement referencingElt)) { - if (schemaElt.TryGetProperty("title", out JsonElement titleElt) && schemaElt.TryGetProperty("type", out JsonElement typeElt)) + if (schemaElt.TryGetProperty("type", out JsonElement typeElt)) { + string? title = schemaElt.TryGetProperty("title", out JsonElement titleElt) ? titleElt.GetString() : null; + CodeName schemaName = new CodeName(this.typeNamer.GenerateTypeName(docName, keyName, title)); + if (typeElt.GetString() == "object" && (!schemaElt.TryGetProperty("additionalProperties", out JsonElement addlPropsElt) || addlPropsElt.ValueKind == JsonValueKind.False)) { - return new ReferenceType(new CodeName(titleElt.GetString()!), isNullable: true); + return new ReferenceType(schemaName, isNullable: true); } else if (typeElt.GetString() == "string" && schemaElt.TryGetProperty("enum", out _)) { - return new ReferenceType(new CodeName(titleElt.GetString()!), isNullable: false); + return new ReferenceType(schemaName, isNullable: false); } } - return GetPrimitiveTypeFromJsonElement(docName, schemaElt, rootElementsByName); + return GetPrimitiveTypeFromJsonElement(docName, keyName, schemaElt, rootElementsByName); } - JsonElement referencedElt = GetReferencedElement(docName, referencingElt, rootElementsByName); + GetReferenceInfo(docName, referencingElt, rootElementsByName, out string refName, out string? refKey, out JsonElement refElt, out string? refTitle); + CodeName referencedName = new CodeName(this.typeNamer.GenerateTypeName(refName, refKey, refTitle)); - if (referencedElt.TryGetProperty("properties", out _) || referencedElt.TryGetProperty("enum", out _)) + if (refElt.TryGetProperty("properties", out _) || refElt.TryGetProperty("enum", out _)) { - string title = referencedElt.GetProperty("title").GetString()!; - string type = referencedElt.GetProperty("type").GetString()!; - return new ReferenceType(new CodeName(title), isNullable: type == "object"); + string type = refElt.GetProperty("type").GetString()!; + return new ReferenceType(referencedName, isNullable: type == "object"); } - return GetPrimitiveTypeFromJsonElement(docName, referencedElt, rootElementsByName); + return GetPrimitiveTypeFromJsonElement(docName, keyName, refElt, rootElementsByName); } private bool TryGetNestedNullableJsonElement(ref JsonElement jsonElement) @@ -180,16 +193,16 @@ private bool TryGetNestedNullableJsonElement(ref JsonElement jsonElement) return false; } - private SchemaType GetPrimitiveTypeFromJsonElement(string docName, JsonElement schemaElt, Dictionary rootElementsByName) + private SchemaType GetPrimitiveTypeFromJsonElement(string docName, string keyName, JsonElement schemaElt, Dictionary rootElementsByName) { switch (schemaElt.GetProperty("type").GetString()) { case "array": - return new ArrayType(GetSchemaTypeFromJsonElement(docName, schemaElt.GetProperty("items"), rootElementsByName)); + return new ArrayType(GetSchemaTypeFromJsonElement(docName, keyName, schemaElt.GetProperty("items"), rootElementsByName)); case "object": JsonElement typeAndAddendaElt = schemaElt.GetProperty("additionalProperties"); bool nullValues = TryGetNestedNullableJsonElement(ref typeAndAddendaElt); - return new MapType(GetSchemaTypeFromJsonElement(docName, typeAndAddendaElt, rootElementsByName), nullValues); + return new MapType(GetSchemaTypeFromJsonElement(docName, keyName, typeAndAddendaElt, rootElementsByName), nullValues); case "boolean": return new BooleanType(); case "number": @@ -244,9 +257,16 @@ private SchemaType GetPrimitiveTypeFromJsonElement(string docName, JsonElement s } } - private JsonElement GetReferencedElement(string docName, JsonElement referencingElt, Dictionary rootElementsByName) + private void GetReferenceInfo( + string docName, + JsonElement referencingElt, + Dictionary rootElementsByName, + out string referencedName, + out string? referencedKey, + out JsonElement referencedElt, + out string? referencedTitle) { - string refString = referencingElt.GetString()!; + string refString = Uri.UnescapeDataString(referencingElt.GetString()!); int fragIx = refString.IndexOf('#'); string baseRef = fragIx switch @@ -257,13 +277,15 @@ private JsonElement GetReferencedElement(string docName, JsonElement referencing }; string fragment = fragIx < 0 ? string.Empty : refString.Substring(fragIx + 2); - string refName = Path.GetFullPath(Path.Combine(Path.GetDirectoryName(docName)!, baseRef)).Replace('\\', '/'); - JsonElement rootElt = rootElementsByName[refName]; + referencedName = Path.GetFullPath(Path.Combine(Path.GetDirectoryName(docName)!, baseRef)).Replace('\\', '/'); + JsonElement rootElt = rootElementsByName[referencedName]; int sepIx = fragment.IndexOf('/'); - JsonElement referencedElt = sepIx > 0 ? rootElt.GetProperty(fragment.Substring(0, sepIx)).GetProperty(fragment.Substring(sepIx + 1)) : rootElt; + string? refCollection = sepIx > 0 ? fragment.Substring(0, sepIx) : null; + referencedKey = sepIx > 0 ? fragment.Substring(sepIx + 1) : null; - return referencedElt; + referencedElt = referencedKey != null ? rootElt.GetProperty(refCollection!).GetProperty(referencedKey) : rootElt; + referencedTitle = referencedElt.GetProperty("title").GetString()!; } } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/TypeGenerator.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/TypeGenerator.cs index 91db7b96c3..2b151f4e15 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/TypeGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/TypeGenerator.cs @@ -9,11 +9,11 @@ public class TypeGenerator private ISchemaStandardizer schemaStandardizer; private ITypeGenerator typeGenerator; - public TypeGenerator(SerializationFormat serializationFormat, TargetLanguage targetLanguage) + public TypeGenerator(SerializationFormat serializationFormat, TargetLanguage targetLanguage, TypeNamer typeNamer) { this.schemaStandardizer = serializationFormat switch { - SerializationFormat.Json => new JsonSchemaStandardizer(), + SerializationFormat.Json => new JsonSchemaStandardizer(typeNamer), _ => throw new NotSupportedException($"Serialization format {serializationFormat} is not supported."), }; diff --git a/codegen2/src/TypeTester/Program.cs b/codegen2/src/TypeTester/Program.cs index 251ede6428..37de6f041b 100644 --- a/codegen2/src/TypeTester/Program.cs +++ b/codegen2/src/TypeTester/Program.cs @@ -40,9 +40,11 @@ static void Main(string[] args) _ => throw new NotSupportedException($"Target language {args[3]} is not supported."), }; + TypeNamer typeNamer = new TypeNamer(null); + foreach (KeyValuePair formatFilter in FormatFilters) { - TypeGenerator typeGenerator = new TypeGenerator(formatFilter.Key, targetLanguage); + TypeGenerator typeGenerator = new TypeGenerator(formatFilter.Key, targetLanguage, typeNamer); Dictionary schemaTextsByName = schemaFolder.GetFiles(formatFilter.Value).ToDictionary(f => f.FullName.Replace('\\', '/'), f => File.ReadAllText(f.FullName)); From 40394e497ff147822cc7fb411c7d9a81a461377c Mon Sep 17 00:00:00 2001 From: Auto Gen Date: Thu, 6 Nov 2025 12:20:31 -0800 Subject: [PATCH 07/52] change JSON Schema suffix from .schema.json to .json --- codegen2/eval/.gitignore | 4 ++-- codegen2/eval/g1.sh | 4 ++-- codegen2/eval/gen.sh | 4 ++-- codegen2/eval/wot/ExternalSchemas.TD.json | 12 ++++++------ .../{AlephProp.schema.json => AlephProp.json} | 4 ++-- .../{BethData.schema.json => BethData.json} | 0 ...ethingInput.schema.json => DoSomethingInput.json} | 0 ...ethingOuput.schema.json => DoSomethingOuput.json} | 0 .../Azure.Iot.Operations.CodeGeneration/TypeNamer.cs | 5 ++++- .../CommandHandler.cs | 2 +- .../json/JsonSchemaSupport.cs | 2 +- .../json/code/AliasJsonSchema.cs | 2 +- .../json/code/EnumJsonSchema.cs | 2 +- .../json/code/ObjectJsonSchema.cs | 2 +- codegen2/src/TypeTester/Program.cs | 2 +- 15 files changed, 24 insertions(+), 21 deletions(-) rename codegen2/eval/wot/ExternalSchemas/{AlephProp.schema.json => AlephProp.json} (76%) rename codegen2/eval/wot/ExternalSchemas/{BethData.schema.json => BethData.json} (100%) rename codegen2/eval/wot/ExternalSchemas/{DoSomethingInput.schema.json => DoSomethingInput.json} (100%) rename codegen2/eval/wot/ExternalSchemas/{DoSomethingOuput.schema.json => DoSomethingOuput.json} (100%) diff --git a/codegen2/eval/.gitignore b/codegen2/eval/.gitignore index befad2cefa..0b42cea230 100644 --- a/codegen2/eval/.gitignore +++ b/codegen2/eval/.gitignore @@ -2,5 +2,5 @@ **/*.csproj **/*.rs **/Cargo.toml -**/*.schema.json -!wot/**/*.schema.json +**/*.json +!wot/**/*.json diff --git a/codegen2/eval/g1.sh b/codegen2/eval/g1.sh index ad3defc50c..c10e83a6a7 100644 --- a/codegen2/eval/g1.sh +++ b/codegen2/eval/g1.sh @@ -3,7 +3,7 @@ gen=../src/Azure.Iot.Operations.ProtocolCompiler/bin/Debug/net9.0/Azure.Iot.Operations.ProtocolCompiler.exe [[ -d dotnet/ExternalSchemasSample ]] && rm -r dotnet/ExternalSchemasSample -$gen --thingFiles wot/ExternalSchemas.TD.json --extSchemas wot/ExternalSchemas/*.schema.json --typeNamer wot/ExternalSchemas.TypeNames.json --outDir dotnet/ExternalSchemasSample --lang csharp --namespace ExternalSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol +$gen --thingFiles wot/ExternalSchemas.TD.json --extSchemas wot/ExternalSchemas/*.json --typeNamer wot/ExternalSchemas.TypeNames.json --outDir dotnet/ExternalSchemasSample --lang csharp --namespace ExternalSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/external_schemas_gen ]] && rm -r rust/external_schemas_gen -$gen --thingFiles wot/ExternalSchemas.TD.json --extSchemas wot/ExternalSchemas/*.schema.json --typeNamer wot/ExternalSchemas.TypeNames.json --outDir rust/external_schemas_gen --lang rust --namespace ExternalSchemas --sdkPath ../../rust --srcSubdir src +$gen --thingFiles wot/ExternalSchemas.TD.json --extSchemas wot/ExternalSchemas/*.json --typeNamer wot/ExternalSchemas.TypeNames.json --outDir rust/external_schemas_gen --lang rust --namespace ExternalSchemas --sdkPath ../../rust --srcSubdir src diff --git a/codegen2/eval/gen.sh b/codegen2/eval/gen.sh index 967f2498e1..8ea52de744 100644 --- a/codegen2/eval/gen.sh +++ b/codegen2/eval/gen.sh @@ -51,7 +51,7 @@ $gen --thingFiles wot/TwoThings.TD.json --outDir dotnet/TwoThingsSample --lang c $gen --thingFiles wot/TwoThings.TD.json --outDir rust/two_things_gen --lang rust --namespace TwoThings --sdkPath ../../rust --srcSubdir src [[ -d dotnet/ExternalSchemasSample ]] && rm -r dotnet/ExternalSchemasSample -$gen --thingFiles wot/ExternalSchemas.TD.json --extSchemas wot/ExternalSchemas/*.schema.json --outDir dotnet/ExternalSchemasSample --lang csharp --namespace ExternalSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol +$gen --thingFiles wot/ExternalSchemas.TD.json --extSchemas wot/ExternalSchemas/*\json --outDir dotnet/ExternalSchemasSample --lang csharp --namespace ExternalSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/external_schemas_gen ]] && rm -r rust/external_schemas_gen -$gen --thingFiles wot/ExternalSchemas.TD.json --extSchemas wot/ExternalSchemas/*.schema.json --outDir rust/external_schemas_gen --lang rust --namespace ExternalSchemas --sdkPath ../../rust --srcSubdir src +$gen --thingFiles wot/ExternalSchemas.TD.json --extSchemas wot/ExternalSchemas/*.json --outDir rust/external_schemas_gen --lang rust --namespace ExternalSchemas --sdkPath ../../rust --srcSubdir src diff --git a/codegen2/eval/wot/ExternalSchemas.TD.json b/codegen2/eval/wot/ExternalSchemas.TD.json index 2f6741f7d2..5cbb5e5b56 100644 --- a/codegen2/eval/wot/ExternalSchemas.TD.json +++ b/codegen2/eval/wot/ExternalSchemas.TD.json @@ -16,10 +16,10 @@ "actions": { "DoSomething": { "input": { - "dtv:ref": "./ExternalSchemas/DoSomethingInput.schema.json" + "dtv:ref": "./ExternalSchemas/DoSomethingInput.json" }, "output": { - "dtv:ref": "./ExternalSchemas/DoSomethingOuput.schema.json" + "dtv:ref": "./ExternalSchemas/DoSomethingOuput.json" }, "forms": [ { @@ -33,7 +33,7 @@ }, "properties": { "Aleph": { - "dtv:ref": "./ExternalSchemas/AlephProp.schema.json", + "dtv:ref": "./ExternalSchemas/AlephProp.json", "readOnly": false, "forms": [ { @@ -54,7 +54,7 @@ "events": { "Beth": { "data": { - "dtv:ref": "./ExternalSchemas/BethData.schema.json" + "dtv:ref": "./ExternalSchemas/BethData.json" }, "forms": [ { @@ -67,7 +67,7 @@ }, "Gimel": { "data": { - "dtv:ref": "./ExternalSchemas/BethData.schema.json#/definitions/Temperature" + "dtv:ref": "./ExternalSchemas/BethData.json#/definitions/Temperature" }, "forms": [ { @@ -80,7 +80,7 @@ }, "Dalet": { "data": { - "dtv:ref": "./ExternalSchemas/BethData.schema.json#/definitions/org.opcfoundation.UA.DateTime" + "dtv:ref": "./ExternalSchemas/BethData.json#/definitions/org.opcfoundation.UA.DateTime" }, "forms": [ { diff --git a/codegen2/eval/wot/ExternalSchemas/AlephProp.schema.json b/codegen2/eval/wot/ExternalSchemas/AlephProp.json similarity index 76% rename from codegen2/eval/wot/ExternalSchemas/AlephProp.schema.json rename to codegen2/eval/wot/ExternalSchemas/AlephProp.json index 1548371fd0..769a6e718b 100644 --- a/codegen2/eval/wot/ExternalSchemas/AlephProp.schema.json +++ b/codegen2/eval/wot/ExternalSchemas/AlephProp.json @@ -16,10 +16,10 @@ "maximum": 2147483647 }, "iota": { - "$ref": "./BethData.schema.json#/definitions/HeaterState" + "$ref": "./BethData.json#/definitions/HeaterState" }, "kappa": { - "$ref": "./BethData.schema.json#/definitions/org.opcfoundation.UA.Int32" + "$ref": "./BethData.json#/definitions/org.opcfoundation.UA.Int32" } } } diff --git a/codegen2/eval/wot/ExternalSchemas/BethData.schema.json b/codegen2/eval/wot/ExternalSchemas/BethData.json similarity index 100% rename from codegen2/eval/wot/ExternalSchemas/BethData.schema.json rename to codegen2/eval/wot/ExternalSchemas/BethData.json diff --git a/codegen2/eval/wot/ExternalSchemas/DoSomethingInput.schema.json b/codegen2/eval/wot/ExternalSchemas/DoSomethingInput.json similarity index 100% rename from codegen2/eval/wot/ExternalSchemas/DoSomethingInput.schema.json rename to codegen2/eval/wot/ExternalSchemas/DoSomethingInput.json diff --git a/codegen2/eval/wot/ExternalSchemas/DoSomethingOuput.schema.json b/codegen2/eval/wot/ExternalSchemas/DoSomethingOuput.json similarity index 100% rename from codegen2/eval/wot/ExternalSchemas/DoSomethingOuput.schema.json rename to codegen2/eval/wot/ExternalSchemas/DoSomethingOuput.json diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/TypeNamer.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/TypeNamer.cs index 3e7f2274ae..333a6d9e4b 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/TypeNamer.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/TypeNamer.cs @@ -29,7 +29,10 @@ public string GenerateTypeName(string schemaName, string? keyName, string? title if (keyName == null) { - return Capitalize(Path.GetFileName(schemaName).Replace(".schema", string.Empty).Replace(".json", string.Empty)); + string pathlessName = Path.GetFileName(schemaName); + int dotIx = pathlessName.IndexOf('.'); + string unsuffixedName = dotIx < 0 ? pathlessName : pathlessName.Substring(0, dotIx); + return Capitalize(unsuffixedName); } foreach (KeyValuePair rule in this.nameRules) diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs index 696db91bf5..03ddae8694 100644 --- a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs @@ -141,7 +141,7 @@ private static void ImportSchemas(FileInfo[] extSchemaFiles, Dictionary SerializationFormat.Json, + string n when n.EndsWith(".json", StringComparison.OrdinalIgnoreCase) => SerializationFormat.Json, _ => SerializationFormat.None, }; diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs index 36d2ea202b..505abb7507 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs @@ -42,7 +42,7 @@ internal string GetTypeAndAddenda(TDDataSchema tdSchema, string backupSchemaName if ((tdSchema.Type == TDValues.TypeObject && tdSchema.AdditionalProperties?.Boolean == false) || (tdSchema.Type == TDValues.TypeString && tdSchema.Enum != null)) { - return $"\"$ref\": \"{this.schemaNamer.ApplyBackupSchemaName(tdSchema.Title, backupSchemaName)}.schema.json\""; + return $"\"$ref\": \"{this.schemaNamer.ApplyBackupSchemaName(tdSchema.Title, backupSchemaName)}.json\""; } switch (tdSchema.Type ?? string.Empty) diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/AliasJsonSchema.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/AliasJsonSchema.cs index 883e8a529b..9f7e62616d 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/AliasJsonSchema.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/AliasJsonSchema.cs @@ -18,6 +18,6 @@ internal AliasJsonSchema(JsonSchemaSupport schemaSupport, string schemaName, Ali public SerializationFormat Format { get => SerializationFormat.Json; } - public string FileName { get => $"{this.schemaName}.schema.json"; } + public string FileName { get => $"{this.schemaName}.json"; } } } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/EnumJsonSchema.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/EnumJsonSchema.cs index d2cc16137a..7b82fa961b 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/EnumJsonSchema.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/EnumJsonSchema.cs @@ -15,6 +15,6 @@ internal EnumJsonSchema(string schemaName, EnumSpec enumSpec) public SerializationFormat Format { get => SerializationFormat.Json; } - public string FileName { get => $"{this.schemaName}.schema.json"; } + public string FileName { get => $"{this.schemaName}.json"; } } } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/ObjectJsonSchema.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/ObjectJsonSchema.cs index aefecb9483..e17c7b09ff 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/ObjectJsonSchema.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/ObjectJsonSchema.cs @@ -17,6 +17,6 @@ internal ObjectJsonSchema(JsonSchemaSupport schemaSupport, string schemaName, Ob public SerializationFormat Format { get => SerializationFormat.Json; } - public string FileName { get => $"{this.schemaName}.schema.json"; } + public string FileName { get => $"{this.schemaName}.json"; } } } diff --git a/codegen2/src/TypeTester/Program.cs b/codegen2/src/TypeTester/Program.cs index 37de6f041b..77e8bf6d43 100644 --- a/codegen2/src/TypeTester/Program.cs +++ b/codegen2/src/TypeTester/Program.cs @@ -11,7 +11,7 @@ internal class Program { static Dictionary FormatFilters = new() { - { SerializationFormat.Json, "*.schema.json" }, + { SerializationFormat.Json, "*.json" }, }; static void Main(string[] args) From 1c3aab067a5200005d4d279eb6f3e8b841d874ab Mon Sep 17 00:00:00 2001 From: Auto Gen Date: Mon, 10 Nov 2025 07:20:21 -0800 Subject: [PATCH 08/52] allow JSON Schema null in any object field, array item, or map value --- .../eval/wot/ExternalSchemas/AlephProp.json | 38 +++++++++- .../PropertySchemaGenerator.cs | 2 +- .../JsonSchemaStandardizer.cs | 76 +++++++++---------- .../common/AliasType.cs | 3 +- .../common/ArrayType.cs | 5 +- .../common/BooleanType.cs | 3 +- .../common/ByteType.cs | 3 +- .../common/BytesType.cs | 3 +- .../common/DateTimeType.cs | 3 +- .../common/DateType.cs | 3 +- .../common/DecimalType.cs | 3 +- .../common/DoubleType.cs | 3 +- .../common/DurationType.cs | 3 +- .../common/EnumType.cs | 3 +- .../common/FloatType.cs | 3 +- .../common/IntegerType.cs | 3 +- .../common/LongType.cs | 3 +- .../common/MapType.cs | 8 +- .../common/ObjectType.cs | 3 +- .../common/ReferenceType.cs | 6 +- .../common/SchemaType.cs | 7 ++ .../common/ShortType.cs | 3 +- .../common/StringType.cs | 3 +- .../common/TimeType.cs | 3 +- .../common/UnsignedByteType.cs | 3 +- .../common/UnsignedIntegerType.cs | 3 +- .../common/UnsignedLongType.cs | 3 +- .../common/UnsignedShortType.cs | 3 +- .../common/UuidType.cs | 3 +- .../dotnet/DotNetSchemaSupport.cs | 48 ++++++------ .../dotnet/code/DotNetObject.cs | 2 +- .../dotnet/t4/DotNetObject.tt | 6 +- .../rust/RustSchemaSupport.cs | 8 +- .../rust/t4/RustObject.tt | 6 +- 34 files changed, 170 insertions(+), 108 deletions(-) diff --git a/codegen2/eval/wot/ExternalSchemas/AlephProp.json b/codegen2/eval/wot/ExternalSchemas/AlephProp.json index 769a6e718b..0e68901d78 100644 --- a/codegen2/eval/wot/ExternalSchemas/AlephProp.json +++ b/codegen2/eval/wot/ExternalSchemas/AlephProp.json @@ -3,7 +3,7 @@ "title": "AlephProp", "type": "object", "additionalProperties": false, - "required": [ "epsilon", "zeta" ], + "required": [ "epsilon", "zeta", "mu", "nu" ], "properties": { "epsilon": { "description": "The 'epsilon' Field.", @@ -20,6 +20,42 @@ }, "kappa": { "$ref": "./BethData.json#/definitions/org.opcfoundation.UA.Int32" + }, + "lambda": { + "anyOf": [ + { "type": "null" }, + { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + } + ] + }, + "mu": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { "type": "null" }, + { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + } + ] + } + }, + "nu": { + "type": "array", + "items": { + "anyOf": [ + { "type": "null" }, + { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + } + ] + } } } } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/PropertySchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/PropertySchemaGenerator.cs index 386b986e38..aa1fcdef65 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/PropertySchemaGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/PropertySchemaGenerator.cs @@ -121,7 +121,7 @@ private static void ProcessProperty( { string propSchemaName = isRead ? schemaNamer.GetPropSchema(propName) : schemaNamer.GetWritablePropSchema(propName); ObjectSpec propObjectSpec = new( - tdProperty.Description ?? $"Container for{(isRead ? "" : "writing to")} the '{propName}' Property.", + tdProperty.Description ?? $"Container for{(isRead ? "" : " writing to")} the '{propName}' Property.", new Dictionary { { propName, propFieldSpec } }, propForm.Format, propSchemaName); diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs index 78ca48d679..2682ac3c7d 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs @@ -5,7 +5,6 @@ using System.IO; using System.Linq; using System.Text.Json; - using System.Text.RegularExpressions; using Azure.Iot.Operations.CodeGeneration; internal class JsonSchemaStandardizer : ISchemaStandardizer @@ -78,7 +77,7 @@ internal void CollateAliasTypes(string docName, JsonElement schemaElt, List new CodeName(p.Name), p => GetObjectTypeFieldInfo(docName, p.Name, p.Value, indirectFields, requiredFields, rootElementsByName)))); + propertiesElt.EnumerateObject().ToDictionary(p => new CodeName(p.Name), p => GetObjectTypeFieldInfo(docName, p.Name, p.Value, indirectFields, requiredFields, rootElementsByName)), orNull: false)); } else if (schemaElt.TryGetProperty("enum", out JsonElement enumElt)) { @@ -126,22 +125,27 @@ internal void CollateSchemaTypes(string docName, string? defKey, JsonElement sch schemaTypes.Add(new EnumType( schemaName, description, - enumValues)); + enumValues, + orNull: false)); } } private ObjectType.FieldInfo GetObjectTypeFieldInfo(string docName, string fieldName, JsonElement schemaElt, HashSet indirectFields, HashSet requiredFields, Dictionary rootElementsByName) { + bool isIndirect = indirectFields.Contains(fieldName); + bool isRequired = requiredFields.Contains(fieldName); return new ObjectType.FieldInfo( - GetSchemaTypeFromJsonElement(docName, fieldName, schemaElt, rootElementsByName), - indirectFields.Contains(fieldName), - requiredFields.Contains(fieldName), + GetSchemaTypeFromJsonElement(docName, fieldName, schemaElt, rootElementsByName, isOptional: !isRequired), + isIndirect, + isRequired, schemaElt.TryGetProperty("description", out JsonElement descElt) ? descElt.GetString() : null, schemaElt.TryGetProperty("index", out JsonElement indexElt) ? indexElt.GetInt32() : null); } - private SchemaType GetSchemaTypeFromJsonElement(string docName, string keyName, JsonElement schemaElt, Dictionary rootElementsByName) + private SchemaType GetSchemaTypeFromJsonElement(string docName, string keyName, JsonElement schemaElt, Dictionary rootElementsByName, bool isOptional) { + bool orNull = TryGetNestedNullableJsonElement(ref schemaElt) || isOptional; + if (!schemaElt.TryGetProperty("$ref", out JsonElement referencingElt)) { if (schemaElt.TryGetProperty("type", out JsonElement typeElt)) @@ -151,15 +155,15 @@ private SchemaType GetSchemaTypeFromJsonElement(string docName, string keyName, if (typeElt.GetString() == "object" && (!schemaElt.TryGetProperty("additionalProperties", out JsonElement addlPropsElt) || addlPropsElt.ValueKind == JsonValueKind.False)) { - return new ReferenceType(schemaName, isNullable: true); + return new ReferenceType(schemaName, isNullable: true, orNull: orNull); } else if (typeElt.GetString() == "string" && schemaElt.TryGetProperty("enum", out _)) { - return new ReferenceType(schemaName, isNullable: false); + return new ReferenceType(schemaName, isNullable: false, orNull: orNull); } } - return GetPrimitiveTypeFromJsonElement(docName, keyName, schemaElt, rootElementsByName); + return GetPrimitiveTypeFromJsonElement(docName, keyName, schemaElt, orNull, rootElementsByName); } GetReferenceInfo(docName, referencingElt, rootElementsByName, out string refName, out string? refKey, out JsonElement refElt, out string? refTitle); @@ -168,10 +172,10 @@ private SchemaType GetSchemaTypeFromJsonElement(string docName, string keyName, if (refElt.TryGetProperty("properties", out _) || refElt.TryGetProperty("enum", out _)) { string type = refElt.GetProperty("type").GetString()!; - return new ReferenceType(referencedName, isNullable: type == "object"); + return new ReferenceType(referencedName, type == "object", orNull); } - return GetPrimitiveTypeFromJsonElement(docName, keyName, refElt, rootElementsByName); + return GetPrimitiveTypeFromJsonElement(docName, keyName, refElt, orNull, rootElementsByName); } private bool TryGetNestedNullableJsonElement(ref JsonElement jsonElement) @@ -193,65 +197,61 @@ private bool TryGetNestedNullableJsonElement(ref JsonElement jsonElement) return false; } - private SchemaType GetPrimitiveTypeFromJsonElement(string docName, string keyName, JsonElement schemaElt, Dictionary rootElementsByName) + private SchemaType GetPrimitiveTypeFromJsonElement(string docName, string keyName, JsonElement schemaElt, bool orNull, Dictionary rootElementsByName) { switch (schemaElt.GetProperty("type").GetString()) { case "array": - return new ArrayType(GetSchemaTypeFromJsonElement(docName, keyName, schemaElt.GetProperty("items"), rootElementsByName)); + return new ArrayType(GetSchemaTypeFromJsonElement(docName, keyName, schemaElt.GetProperty("items"), rootElementsByName, isOptional: false), orNull); case "object": JsonElement typeAndAddendaElt = schemaElt.GetProperty("additionalProperties"); - bool nullValues = TryGetNestedNullableJsonElement(ref typeAndAddendaElt); - return new MapType(GetSchemaTypeFromJsonElement(docName, keyName, typeAndAddendaElt, rootElementsByName), nullValues); + return new MapType(GetSchemaTypeFromJsonElement(docName, keyName, typeAndAddendaElt, rootElementsByName, isOptional: false), orNull); case "boolean": - return new BooleanType(); + return new BooleanType(orNull); case "number": - return schemaElt.GetProperty("format").GetString() == "float" ? new FloatType() : new DoubleType(); + return schemaElt.GetProperty("format").GetString() == "float" ? new FloatType(orNull) : new DoubleType(orNull); case "integer": return schemaElt.GetProperty("maximum").GetUInt64() switch { - < 128 => new ByteType(), - < 256 => new UnsignedByteType(), - < 32768 => new ShortType(), - < 65536 => new UnsignedShortType(), - < 2147483648 => new IntegerType(), - < 4294967296 => new UnsignedIntegerType(), - < 9223372036854775808 => new LongType(), - _ => new UnsignedLongType(), + < 128 => new ByteType(orNull), + < 256 => new UnsignedByteType(orNull), + < 32768 => new ShortType(orNull), + < 65536 => new UnsignedShortType(orNull), + < 2147483648 => new IntegerType(orNull), + < 4294967296 => new UnsignedIntegerType(orNull), + < 9223372036854775808 => new LongType(orNull), + _ => new UnsignedLongType(orNull), }; case "string": if (schemaElt.TryGetProperty("format", out JsonElement formatElt)) { return formatElt.GetString() switch { - "date" => new DateType(), - "date-time" => new DateTimeType(), - "time" => new TimeType(), - "duration" => new DurationType(), - "uuid" => new UuidType(), + "date" => new DateType(orNull), + "date-time" => new DateTimeType(orNull), + "time" => new TimeType(orNull), + "duration" => new DurationType(orNull), + "uuid" => new UuidType(orNull), _ => throw new Exception($"unrecognized 'string' schema (format = {formatElt.GetString()})"), }; } - if (schemaElt.TryGetProperty("contentEncoding", out JsonElement encodingElt)) { return encodingElt.GetString() switch { - "base64" => new BytesType(), + "base64" => new BytesType(orNull), _ => throw new Exception($"unrecognized 'string' schema (contentEncoding = {encodingElt.GetString()})"), }; } - if (schemaElt.TryGetProperty("pattern", out JsonElement patternElt)) { return patternElt.GetString() switch { - "^(?:\\+|-)?(?:[1-9][0-9]*|0)(?:\\.[0-9]*)?$" => new DecimalType(), + "^(?:\\+|-)?(?:[1-9][0-9]*|0)(?:\\.[0-9]*)?$" => new DecimalType(orNull), _ => throw new Exception($"unrecognized 'string' schema (pattern = {patternElt.GetString()})"), }; } - - return new StringType(); + return new StringType(orNull); default: throw new Exception($"unrecognized schema (type = {schemaElt.GetProperty("type").GetString()})"); } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/AliasType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/AliasType.cs index efa323af68..31d9840088 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/AliasType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/AliasType.cs @@ -6,7 +6,8 @@ internal class AliasType : SchemaType { internal override SchemaKind Kind { get => SchemaKind.Alias; } - internal AliasType(CodeName schemaName, string? description, CodeName referencedName) + internal AliasType(CodeName schemaName, string? description, CodeName referencedName, bool orNull) + : base(orNull) { SchemaName = schemaName; Description = description; diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ArrayType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ArrayType.cs index da28581f71..0b47309aa1 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ArrayType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ArrayType.cs @@ -4,11 +4,12 @@ internal class ArrayType : SchemaType { internal override SchemaKind Kind { get => SchemaKind.Array; } - internal ArrayType(SchemaType elementSchema) + internal ArrayType(SchemaType elementSchema, bool orNull) + : base(orNull) { ElementSchema = elementSchema; } - internal SchemaType ElementSchema { get; set; } + internal SchemaType ElementSchema { get; } } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/BooleanType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/BooleanType.cs index 54330299b3..1532d62c54 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/BooleanType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/BooleanType.cs @@ -4,7 +4,8 @@ internal class BooleanType : SchemaType { internal override SchemaKind Kind { get => SchemaKind.Boolean; } - internal BooleanType() + internal BooleanType(bool orNull) + : base(orNull) { } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ByteType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ByteType.cs index 27f0a5e4c2..bdc8d70e20 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ByteType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ByteType.cs @@ -4,7 +4,8 @@ internal class ByteType : SchemaType { internal override SchemaKind Kind { get => SchemaKind.Byte; } - internal ByteType() + internal ByteType(bool orNull) + : base(orNull) { } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/BytesType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/BytesType.cs index 30da5a18a1..ab355c28f5 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/BytesType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/BytesType.cs @@ -4,7 +4,8 @@ internal class BytesType : SchemaType { internal override SchemaKind Kind { get => SchemaKind.Bytes; } - internal BytesType() + internal BytesType(bool orNull) + : base(orNull) { } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DateTimeType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DateTimeType.cs index 743c142e06..2325cdfd03 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DateTimeType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DateTimeType.cs @@ -4,7 +4,8 @@ internal class DateTimeType : SchemaType { internal override SchemaKind Kind { get => SchemaKind.DateTime; } - internal DateTimeType() + internal DateTimeType(bool orNull) + : base(orNull) { } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DateType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DateType.cs index 86e6b1638e..071c83d1a9 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DateType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DateType.cs @@ -4,7 +4,8 @@ internal class DateType : SchemaType { internal override SchemaKind Kind { get => SchemaKind.Date; } - internal DateType() + internal DateType(bool orNull) + : base(orNull) { } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DecimalType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DecimalType.cs index 98ed164eff..c1ea77d7bb 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DecimalType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DecimalType.cs @@ -4,7 +4,8 @@ internal class DecimalType : SchemaType { internal override SchemaKind Kind { get => SchemaKind.Decimal; } - internal DecimalType() + internal DecimalType(bool orNull) + : base(orNull) { } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DoubleType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DoubleType.cs index d8b404a12d..ad0bd4ac74 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DoubleType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DoubleType.cs @@ -4,7 +4,8 @@ internal class DoubleType : SchemaType { internal override SchemaKind Kind { get => SchemaKind.Double; } - internal DoubleType() + internal DoubleType(bool orNull) + : base(orNull) { } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DurationType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DurationType.cs index 244761dc93..4783fc96c3 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DurationType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/DurationType.cs @@ -4,7 +4,8 @@ internal class DurationType : SchemaType { internal override SchemaKind Kind { get => SchemaKind.Duration; } - internal DurationType() + internal DurationType(bool orNull) + : base(orNull) { } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/EnumType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/EnumType.cs index 740f1858b1..11f5729633 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/EnumType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/EnumType.cs @@ -6,7 +6,8 @@ internal class EnumType : SchemaType { internal override SchemaKind Kind { get => SchemaKind.Enum; } - internal EnumType(CodeName schemaName, string? description, CodeName[] enumValues) + internal EnumType(CodeName schemaName, string? description, CodeName[] enumValues, bool orNull) + : base(orNull) { SchemaName = schemaName; Description = description; diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/FloatType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/FloatType.cs index 8122e12234..bdd1184e12 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/FloatType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/FloatType.cs @@ -4,7 +4,8 @@ internal class FloatType : SchemaType { internal override SchemaKind Kind { get => SchemaKind.Float; } - internal FloatType() + internal FloatType(bool orNull) + : base(orNull) { } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/IntegerType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/IntegerType.cs index b0a1910ea8..291ec53dce 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/IntegerType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/IntegerType.cs @@ -4,7 +4,8 @@ internal class IntegerType : SchemaType { internal override SchemaKind Kind { get => SchemaKind.Integer; } - internal IntegerType() + internal IntegerType(bool orNull) + : base(orNull) { } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/LongType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/LongType.cs index f294b5f23f..e16abf9ebe 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/LongType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/LongType.cs @@ -4,7 +4,8 @@ internal class LongType : SchemaType { internal override SchemaKind Kind { get => SchemaKind.Long; } - internal LongType() + internal LongType(bool orNull) + : base(orNull) { } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/MapType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/MapType.cs index 1f74d15511..a02786a8ac 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/MapType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/MapType.cs @@ -4,14 +4,12 @@ internal class MapType : SchemaType { internal override SchemaKind Kind { get => SchemaKind.Map; } - internal MapType(SchemaType valueSchema, bool nullValues) + internal MapType(SchemaType valueSchema, bool orNull) + : base(orNull) { ValueSchema = valueSchema; - NullValues = nullValues; } - internal SchemaType ValueSchema { get; set; } - - internal bool NullValues { get; set; } + internal SchemaType ValueSchema { get; } } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ObjectType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ObjectType.cs index 7eeebba93e..3384b82473 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ObjectType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ObjectType.cs @@ -7,7 +7,8 @@ internal class ObjectType : SchemaType { internal override SchemaKind Kind { get => SchemaKind.Object; } - internal ObjectType(CodeName schemaName, string? description, Dictionary fieldInfos) + internal ObjectType(CodeName schemaName, string? description, Dictionary fieldInfos, bool orNull) + : base(orNull) { SchemaName = schemaName; Description = description; diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ReferenceType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ReferenceType.cs index 80858aa336..dbea0bbab1 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ReferenceType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ReferenceType.cs @@ -6,19 +6,17 @@ internal class ReferenceType : SchemaType { internal override SchemaKind Kind { get => SchemaKind.Reference; } - internal ReferenceType(CodeName schemaName, bool isNullable = true, bool isEnum = false) + internal ReferenceType(CodeName schemaName, bool isNullable = true, bool orNull = false) + : base(orNull) { SchemaName = schemaName; IsNullable = isNullable; - IsEnum = isEnum; } internal CodeName SchemaName { get; } internal bool IsNullable { get; } - internal bool IsEnum { get; } - public override bool Equals(object? obj) { return Equals(obj as ReferenceType); diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/SchemaType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/SchemaType.cs index 969dafa9e1..05fe440569 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/SchemaType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/SchemaType.cs @@ -2,6 +2,13 @@ namespace Azure.Iot.Operations.TypeGenerator { internal abstract class SchemaType { + internal SchemaType(bool orNull) + { + OrNull = orNull; + } + internal abstract SchemaKind Kind { get; } + + internal bool OrNull { get; } } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ShortType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ShortType.cs index 6d5e52c531..cbadc85da5 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ShortType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ShortType.cs @@ -4,7 +4,8 @@ internal class ShortType : SchemaType { internal override SchemaKind Kind { get => SchemaKind.Short; } - internal ShortType() + internal ShortType(bool orNull) + : base(orNull) { } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/StringType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/StringType.cs index 72fc46f560..939b5dce65 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/StringType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/StringType.cs @@ -4,7 +4,8 @@ internal class StringType : SchemaType { internal override SchemaKind Kind { get => SchemaKind.String; } - internal StringType() + internal StringType(bool orNull) + : base(orNull) { } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/TimeType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/TimeType.cs index a390fba072..2b6a15795f 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/TimeType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/TimeType.cs @@ -4,7 +4,8 @@ internal class TimeType : SchemaType { internal override SchemaKind Kind { get => SchemaKind.Time; } - internal TimeType() + internal TimeType(bool orNull) + : base(orNull) { } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedByteType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedByteType.cs index 5bc3875205..42eeb68b85 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedByteType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedByteType.cs @@ -4,7 +4,8 @@ internal class UnsignedByteType : SchemaType { internal override SchemaKind Kind { get => SchemaKind.UnsignedByte; } - internal UnsignedByteType() + internal UnsignedByteType(bool orNull) + : base(orNull) { } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedIntegerType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedIntegerType.cs index 6df92d8ae4..45950d2353 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedIntegerType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedIntegerType.cs @@ -4,7 +4,8 @@ internal class UnsignedIntegerType : SchemaType { internal override SchemaKind Kind { get => SchemaKind.UnsignedInteger; } - internal UnsignedIntegerType() + internal UnsignedIntegerType(bool orNull) + : base(orNull) { } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedLongType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedLongType.cs index 8b7ed7b5d5..9c92d6867e 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedLongType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedLongType.cs @@ -4,7 +4,8 @@ internal class UnsignedLongType : SchemaType { internal override SchemaKind Kind { get => SchemaKind.UnsignedLong; } - internal UnsignedLongType() + internal UnsignedLongType(bool orNull) + : base(orNull) { } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedShortType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedShortType.cs index 114b604b69..f7dbdff6de 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedShortType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UnsignedShortType.cs @@ -4,7 +4,8 @@ internal class UnsignedShortType : SchemaType { internal override SchemaKind Kind { get => SchemaKind.UnsignedShort; } - internal UnsignedShortType() + internal UnsignedShortType(bool orNull) + : base(orNull) { } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UuidType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UuidType.cs index 52998fbde1..09603f7572 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UuidType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/UuidType.cs @@ -4,7 +4,8 @@ internal class UuidType : SchemaType { internal override SchemaKind Kind { get => SchemaKind.Uuid; } - internal UuidType() + internal UuidType(bool orNull) + : base(orNull) { } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/DotNetSchemaSupport.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/DotNetSchemaSupport.cs index f214063f28..f97ab8fa01 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/DotNetSchemaSupport.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/DotNetSchemaSupport.cs @@ -9,30 +9,30 @@ internal static string GetType(SchemaType schemaType) { return schemaType switch { - ArrayType arrayType => $"List<{GetType(arrayType.ElementSchema)}>", - MapType mapType => $"Dictionary", - ObjectType objectType => objectType.SchemaName.GetTypeName(TargetLanguage.CSharp), - EnumType enumType => enumType.SchemaName.GetTypeName(TargetLanguage.CSharp), - BooleanType _ => "bool", - DoubleType _ => "double", - FloatType _ => "float", - IntegerType _ => "int", - LongType _ => "long", - ByteType _ => "sbyte", - ShortType _ => "short", - UnsignedIntegerType _ => "uint", - UnsignedLongType _ => "ulong", - UnsignedByteType _ => "byte", - UnsignedShortType _ => "ushort", - DateType _ => "DateOnly", - DateTimeType _ => "DateTime", - TimeType _ => "TimeOnly", - DurationType _ => "TimeSpan", - UuidType _ => "Guid", - StringType _ => "string", - BytesType _ => "byte[]", - DecimalType _ => "DecimalString", - ReferenceType referenceType => referenceType.SchemaName.GetTypeName(TargetLanguage.CSharp), + ArrayType arrayType => $"List<{GetType(arrayType.ElementSchema)}>{(schemaType.OrNull ? "?" : "")}", + MapType mapType => $"Dictionary{(schemaType.OrNull ? "?" : "")}", + ObjectType objectType => $"{objectType.SchemaName.GetTypeName(TargetLanguage.CSharp)}{(schemaType.OrNull ? "?" : "")}", + EnumType enumType => $"{enumType.SchemaName.GetTypeName(TargetLanguage.CSharp)}{(schemaType.OrNull ? "?" : "")}", + BooleanType _ => $"bool{(schemaType.OrNull ? "?" : "")}", + DoubleType _ => $"double{(schemaType.OrNull ? "?" : "")}", + FloatType _ => $"float{(schemaType.OrNull ? "?" : "")}", + IntegerType _ => $"int{(schemaType.OrNull ? "?" : "")}", + LongType _ => $"long{(schemaType.OrNull ? "?" : "")}", + ByteType _ => $"sbyte{(schemaType.OrNull ? "?" : "")}", + ShortType _ => $"short{(schemaType.OrNull ? "?" : "")}", + UnsignedIntegerType _ => $"uint{(schemaType.OrNull ? "?" : "")}", + UnsignedLongType _ => $"ulong{(schemaType.OrNull ? "?" : "")}", + UnsignedByteType _ => $"byte{(schemaType.OrNull ? "?" : "")}", + UnsignedShortType _ => $"ushort{(schemaType.OrNull ? "?" : "")}", + DateType _ => $"DateOnly{(schemaType.OrNull ? "?" : "")}", + DateTimeType _ => $"DateTime{(schemaType.OrNull ? "?" : "")}", + TimeType _ => $"TimeOnly{(schemaType.OrNull ? "?" : "")}", + DurationType _ => $"TimeSpan{(schemaType.OrNull ? "?" : "")}", + UuidType _ => $"Guid{(schemaType.OrNull ? "?" : "")}", + StringType _ => $"string{(schemaType.OrNull ? "?" : "")}", + BytesType _ => $"byte[]{(schemaType.OrNull ? "?" : "")}", + DecimalType _ => $"DecimalString{(schemaType.OrNull ? "?" : "")}", + ReferenceType referenceType => $"{referenceType.SchemaName.GetTypeName(TargetLanguage.CSharp)}{(schemaType.OrNull ? "?" : "")}", _ => throw new Exception($"unrecognized SchemaType type {schemaType.GetType()}"), }; } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/code/DotNetObject.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/code/DotNetObject.cs index 26c0cdd96b..bcc539e156 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/code/DotNetObject.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/code/DotNetObject.cs @@ -18,7 +18,7 @@ internal DotNetObject(string projectName, CodeName genNamespace, ObjectType obje this.genNamespace = genNamespace; this.objectType = objectType; this.serFormat = serFormat; - this.needsNullCheck = objectType.FieldInfos.Any(fi => fi.Value.IsRequired && DotNetSchemaSupport.IsNullable(fi.Value.SchemaType)); + this.needsNullCheck = objectType.FieldInfos.Any(fi => !fi.Value.SchemaType.OrNull && DotNetSchemaSupport.IsNullable(fi.Value.SchemaType)); } public string FileName { get => $"{this.objectType.SchemaName.GetFileName(TargetLanguage.CSharp)}.g.cs"; } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetObject.tt b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetObject.tt index 7f4f5ab8bf..309b81f380 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetObject.tt +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetObject.tt @@ -37,14 +37,14 @@ namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage. <# if (fieldInfo.Value.Index != null) { #> [Dahomey.Cbor.Attributes.CborPropertyAttribute(index: <#=fieldInfo.Value.Index#>)] <# } #> - public <#=DotNetSchemaSupport.GetType(fieldInfo.Value.SchemaType)#><#=fieldInfo.Value.IsRequired ? "" : "?"#> <#=fieldInfo.Key.GetFieldName(TargetLanguage.CSharp)#> { get; set; } = default<#=fieldInfo.Value.IsRequired ? "!" : ""#>; + public <#=DotNetSchemaSupport.GetType(fieldInfo.Value.SchemaType)#> <#=fieldInfo.Key.GetFieldName(TargetLanguage.CSharp)#> { get; set; } = default<#=fieldInfo.Value.SchemaType.OrNull ? "" : "!"#>; <# } #> <# if (this.serFormat == SerializationFormat.Json && this.needsNullCheck) { #> void IJsonOnDeserialized.OnDeserialized() { <# foreach (var fieldInfo in this.objectType.FieldInfos) { #> -<# if (fieldInfo.Value.IsRequired && DotNetSchemaSupport.IsNullable(fieldInfo.Value.SchemaType)) { #> +<# if (!fieldInfo.Value.SchemaType.OrNull && DotNetSchemaSupport.IsNullable(fieldInfo.Value.SchemaType)) { #> if (<#=fieldInfo.Key.GetFieldName(TargetLanguage.CSharp)#> is null) { throw new ArgumentNullException("<#=fieldInfo.Key.AsGiven#> field cannot be null"); @@ -56,7 +56,7 @@ namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage. void IJsonOnSerializing.OnSerializing() { <# foreach (var fieldInfo in this.objectType.FieldInfos) { #> -<# if (fieldInfo.Value.IsRequired && DotNetSchemaSupport.IsNullable(fieldInfo.Value.SchemaType)) { #> +<# if (!fieldInfo.Value.SchemaType.OrNull && DotNetSchemaSupport.IsNullable(fieldInfo.Value.SchemaType)) { #> if (<#=fieldInfo.Key.GetFieldName(TargetLanguage.CSharp)#> is null) { throw new ArgumentNullException("<#=fieldInfo.Key.AsGiven#> field cannot be null"); diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/RustSchemaSupport.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/RustSchemaSupport.cs index 9cf7a741b9..011fa908f4 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/RustSchemaSupport.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/RustSchemaSupport.cs @@ -5,12 +5,12 @@ namespace Azure.Iot.Operations.TypeGenerator internal static class RustSchemaSupport { - internal static string GetType(SchemaType schemaType, bool isIndirect, bool isRequired) + internal static string GetType(SchemaType schemaType, bool isIndirect) { string innerType = schemaType switch { - ArrayType arrayType => $"Vec<{GetType(arrayType.ElementSchema, false, true)}>", - MapType mapType => $"HashMap", + ArrayType arrayType => $"Vec<{GetType(arrayType.ElementSchema, false)}>", + MapType mapType => $"HashMap", ObjectType objectType => objectType.SchemaName.GetTypeName(TargetLanguage.Rust), EnumType enumType => enumType.SchemaName.GetTypeName(TargetLanguage.Rust), BooleanType _ => "bool", @@ -38,7 +38,7 @@ internal static string GetType(SchemaType schemaType, bool isIndirect, bool isRe string wrappedType = isIndirect ? $"Box<{innerType}>" : innerType; - return isRequired ? wrappedType : $"Option<{wrappedType}>"; + return schemaType.OrNull ? $"Option<{wrappedType}>" : wrappedType; } internal static bool HasNativeDefault(SchemaType schemaType) diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustObject.tt b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustObject.tt index b1edf48c71..5994c8622a 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustObject.tt +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustObject.tt @@ -33,14 +33,14 @@ pub struct <#=this.objectType.SchemaName.GetTypeName(TargetLanguage.Rust)#> { <# if (fieldInfo.Key.GetFieldName(TargetLanguage.Rust) != fieldInfo.Key.AsGiven) { #> #[serde(rename = "<#=fieldInfo.Key.AsGiven#>")] <# } #> -<# if (!fieldInfo.Value.IsRequired) { #> -<# if (this.allowSkipping) { #> +<# if (fieldInfo.Value.SchemaType.OrNull) { #> +<# if (this.allowSkipping && !fieldInfo.Value.IsRequired) { #> #[serde(skip_serializing_if = "Option::is_none")] <# } #> #[builder(default = "None")] <# } else if (RustSchemaSupport.HasNativeDefault(fieldInfo.Value.SchemaType)) { #> #[builder(default)] <# } #> - pub <#=fieldInfo.Key.GetFieldName(TargetLanguage.Rust)#>: <#=RustSchemaSupport.GetType(fieldInfo.Value.SchemaType, fieldInfo.Value.IsIndirect, fieldInfo.Value.IsRequired)#>, + pub <#=fieldInfo.Key.GetFieldName(TargetLanguage.Rust)#>: <#=RustSchemaSupport.GetType(fieldInfo.Value.SchemaType, fieldInfo.Value.IsIndirect)#>, <# firstField = false; } #> } From 768d5240ff2e3c54dac5305cdbb10d5efd21bd11 Mon Sep 17 00:00:00 2001 From: Auto Gen Date: Mon, 10 Nov 2025 08:30:25 -0800 Subject: [PATCH 09/52] auto-add indirections to break cycles in recursive definitions --- .../eval/wot/ExternalSchemas/BethData.json | 13 ++++ .../CycleBreaker.cs | 70 +++++++++++++++++++ .../DotNetTypeGenerator.cs | 2 + .../ITypeGenerator.cs | 3 +- .../JsonSchemaStandardizer.cs | 10 +-- .../RustTypeGenerator.cs | 2 + .../TypeGenerator.cs | 4 ++ .../common/ObjectType.cs | 11 ++- .../dotnet/t4/DotNetObject.tt | 3 - 9 files changed, 100 insertions(+), 18 deletions(-) create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/CycleBreaker.cs diff --git a/codegen2/eval/wot/ExternalSchemas/BethData.json b/codegen2/eval/wot/ExternalSchemas/BethData.json index aa2fcf33ec..1111c7eff4 100644 --- a/codegen2/eval/wot/ExternalSchemas/BethData.json +++ b/codegen2/eval/wot/ExternalSchemas/BethData.json @@ -97,6 +97,19 @@ } } } + }, + "Something": { + "type": "object", + "additionalProperties": false, + "properties": { + "pressure": { + "type": "number", + "format": "double" + }, + "temperature": { + "$ref": "#/definitions/Temperature" + } + } } } }, diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/CycleBreaker.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/CycleBreaker.cs new file mode 100644 index 0000000000..2a9051c857 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/CycleBreaker.cs @@ -0,0 +1,70 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + using System.Collections.Generic; + using Azure.Iot.Operations.CodeGeneration; + + internal class CycleBreaker + { + private static readonly HashSet LanguagesNeedingIndirection = new () + { + TargetLanguage.Rust, + }; + + private bool indirectionNeeded; + private readonly Dictionary> directEdges; + + internal CycleBreaker(TargetLanguage targetLanguage) + { + this.indirectionNeeded = LanguagesNeedingIndirection.Contains(targetLanguage); + this.directEdges = new Dictionary>(); + } + + internal void AddIndirectionAsNeeded(SchemaType schemaType) + { + if (!this.indirectionNeeded) + { + return; + } + + if (schemaType is ObjectType objectType) + { + List targets = new (); + foreach (ObjectType.FieldInfo fieldInfo in objectType.FieldInfos.Values) + { + if (!fieldInfo.IsIndirect && fieldInfo.SchemaType is ReferenceType referenceType) + { + if (referenceType.SchemaName.Equals(objectType.SchemaName) || CanReach(referenceType.SchemaName, objectType.SchemaName, new HashSet())) + { + fieldInfo.IsIndirect = true; + } + else + { + targets.Add(referenceType.SchemaName); + } + } + } + + if (targets.Count > 0) + { + this.directEdges[objectType.SchemaName] = targets; + } + } + } + + private bool CanReach(CodeName source, CodeName endpoint, HashSet visited) + { + if (this.directEdges.TryGetValue(source, out List? targets) && visited.Add(source)) + { + foreach (CodeName target in targets) + { + if (target.Equals(endpoint) || CanReach(target, endpoint, visited)) + { + return true; + } + } + } + + return false; + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/DotNetTypeGenerator.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/DotNetTypeGenerator.cs index 3ba2be6361..28a638ef43 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/DotNetTypeGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/DotNetTypeGenerator.cs @@ -6,6 +6,8 @@ internal class DotNetTypeGenerator : ITypeGenerator { + public TargetLanguage TargetLanguage { get => TargetLanguage.CSharp; } + public GeneratedItem GenerateTypeFromSchema(SchemaType schemaType, string projectName, CodeName genNamespace, SerializationFormat serFormat, string _) { ITypeTemplateTransform templateTransform = schemaType switch diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/ITypeGenerator.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/ITypeGenerator.cs index a5b13653ef..70cc795dd5 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/ITypeGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/ITypeGenerator.cs @@ -1,10 +1,11 @@ namespace Azure.Iot.Operations.TypeGenerator { - using System; using Azure.Iot.Operations.CodeGeneration; internal interface ITypeGenerator { + TargetLanguage TargetLanguage { get; } + GeneratedItem GenerateTypeFromSchema(SchemaType schemaType, string projectName, CodeName genNamespace, SerializationFormat serFormat, string srcSubdir); } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs index 2682ac3c7d..620b49fecc 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs @@ -112,12 +112,11 @@ internal void CollateSchemaTypes(string docName, string? defKey, JsonElement sch CollateSchemaTypes(docName, objProp.Name, objProp.Value, schemaTypes, rootElementsByName); } - HashSet indirectFields = schemaElt.TryGetProperty("x-indirect", out JsonElement indirectElt) ? indirectElt.EnumerateArray().Select(e => e.GetString()!).ToHashSet() : new HashSet(); HashSet requiredFields = schemaElt.TryGetProperty("required", out JsonElement requiredElt) ? requiredElt.EnumerateArray().Select(e => e.GetString()!).ToHashSet() : new HashSet(); schemaTypes.Add(new ObjectType( schemaName, description, - propertiesElt.EnumerateObject().ToDictionary(p => new CodeName(p.Name), p => GetObjectTypeFieldInfo(docName, p.Name, p.Value, indirectFields, requiredFields, rootElementsByName)), orNull: false)); + propertiesElt.EnumerateObject().ToDictionary(p => new CodeName(p.Name), p => GetObjectTypeFieldInfo(docName, p.Name, p.Value, requiredFields, rootElementsByName)), orNull: false)); } else if (schemaElt.TryGetProperty("enum", out JsonElement enumElt)) { @@ -130,16 +129,13 @@ internal void CollateSchemaTypes(string docName, string? defKey, JsonElement sch } } - private ObjectType.FieldInfo GetObjectTypeFieldInfo(string docName, string fieldName, JsonElement schemaElt, HashSet indirectFields, HashSet requiredFields, Dictionary rootElementsByName) + private ObjectType.FieldInfo GetObjectTypeFieldInfo(string docName, string fieldName, JsonElement schemaElt, HashSet requiredFields, Dictionary rootElementsByName) { - bool isIndirect = indirectFields.Contains(fieldName); bool isRequired = requiredFields.Contains(fieldName); return new ObjectType.FieldInfo( GetSchemaTypeFromJsonElement(docName, fieldName, schemaElt, rootElementsByName, isOptional: !isRequired), - isIndirect, isRequired, - schemaElt.TryGetProperty("description", out JsonElement descElt) ? descElt.GetString() : null, - schemaElt.TryGetProperty("index", out JsonElement indexElt) ? indexElt.GetInt32() : null); + schemaElt.TryGetProperty("description", out JsonElement descElt) ? descElt.GetString() : null); } private SchemaType GetSchemaTypeFromJsonElement(string docName, string keyName, JsonElement schemaElt, Dictionary rootElementsByName, bool isOptional) diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/RustTypeGenerator.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/RustTypeGenerator.cs index d94ba98b6a..2652ecad92 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/RustTypeGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/RustTypeGenerator.cs @@ -6,6 +6,8 @@ internal class RustTypeGenerator : ITypeGenerator { + public TargetLanguage TargetLanguage { get => TargetLanguage.Rust; } + public GeneratedItem GenerateTypeFromSchema(SchemaType schemaType, string projectName, CodeName genNamespace, SerializationFormat serFormat, string srcSubdir) { ITypeTemplateTransform templateTransform = schemaType switch diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/TypeGenerator.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/TypeGenerator.cs index 2b151f4e15..6b9e1a5140 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/TypeGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/TypeGenerator.cs @@ -29,8 +29,12 @@ public List GenerateTypes(Dictionary schemaTextsB { List generatedTypes = new(); + CycleBreaker cycleBreaker = new (this.typeGenerator.TargetLanguage); + foreach (SchemaType schemaType in schemaStandardizer.GetStandardizedSchemas(schemaTextsByName)) { + cycleBreaker.AddIndirectionAsNeeded(schemaType); + generatedTypes.Add(this.typeGenerator.GenerateTypeFromSchema(schemaType, projectName, genNamespace, schemaStandardizer.SerializationFormat, srcSubdir)); } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ObjectType.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ObjectType.cs index 3384b82473..895db00d52 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ObjectType.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/common/ObjectType.cs @@ -23,24 +23,21 @@ internal ObjectType(CodeName schemaName, string? description, Dictionary.<#=this.genNamespace.GetTypeName(TargetLanguage. <# if (fieldInfo.Value.IsRequired) { #> [JsonRequired] <# } #> -<# } #> -<# if (fieldInfo.Value.Index != null) { #> - [Dahomey.Cbor.Attributes.CborPropertyAttribute(index: <#=fieldInfo.Value.Index#>)] <# } #> public <#=DotNetSchemaSupport.GetType(fieldInfo.Value.SchemaType)#> <#=fieldInfo.Key.GetFieldName(TargetLanguage.CSharp)#> { get; set; } = default<#=fieldInfo.Value.SchemaType.OrNull ? "" : "!"#>; From afb60a47309d2b44095e00631e4c94a2bede7220 Mon Sep 17 00:00:00 2001 From: Auto Gen Date: Tue, 11 Nov 2025 14:39:54 -0800 Subject: [PATCH 10/52] add JSON Schema validation for TD with AIO binding --- codegen2/eval/wot/.vscode/settings.json | 9 + .../eval/wot/CommandComplexSchemas.TD.json | 3 - codegen2/eval/wot/CommandVariants.TD.json | 4 - codegen2/eval/wot/CounterCollection.TD.json | 7 - codegen2/eval/wot/PropertySeparate.TD.json | 2 - codegen2/eval/wot/PropertyTogether.TD.json | 2 - .../eval/wot/TelemetryComplexSchemas.TD.json | 1 - codegen2/schema/aio-td-json-schema.json | 660 +++++++++ .../schema/td-json-schema-validation.json | 1318 +++++++++++++++++ .../FieldSpec.cs | 1 - .../SchemaGenerator.cs | 6 +- .../SchemaSpec.cs | 2 +- .../json/JsonSchemaSupport.cs | 4 +- .../Model/TDAction.cs | 1 - .../Model/TDAdditionalPropSpecifier.cs | 71 - .../Model/TDDataSchema.cs | 2 +- .../Azure.Iot.Operations.TDParser/TDParser.cs | 1 - 17 files changed, 1994 insertions(+), 100 deletions(-) create mode 100644 codegen2/eval/wot/.vscode/settings.json create mode 100644 codegen2/schema/aio-td-json-schema.json create mode 100644 codegen2/schema/td-json-schema-validation.json delete mode 100644 codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAdditionalPropSpecifier.cs diff --git a/codegen2/eval/wot/.vscode/settings.json b/codegen2/eval/wot/.vscode/settings.json new file mode 100644 index 0000000000..f6b9a56011 --- /dev/null +++ b/codegen2/eval/wot/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + "json.schemaDownload.enable": true, + "json.schemas": [ + { + "fileMatch": [ "**/*.TD.json" ], + "url": "../../schema/aio-td-json-schema.json" + } + ] +} diff --git a/codegen2/eval/wot/CommandComplexSchemas.TD.json b/codegen2/eval/wot/CommandComplexSchemas.TD.json index b816e0a788..18562e1c9a 100644 --- a/codegen2/eval/wot/CommandComplexSchemas.TD.json +++ b/codegen2/eval/wot/CommandComplexSchemas.TD.json @@ -41,13 +41,11 @@ "input": { "title": "DoSomethingRequestPayload", "type": "object", - "dtv:additionalProperties": false, "required": [ "input" ], "properties": { "input": { "type": "object", "title": "DoSomethingRequestSchema", - "dtv:additionalProperties": false, "properties": { "actions": { "type": "array", @@ -68,7 +66,6 @@ "title": "SomeResponseInfo", "type": "object", "description": "The result of the doSomething command.", - "dtv:additionalProperties": false, "properties": { "details": { "type": "object", diff --git a/codegen2/eval/wot/CommandVariants.TD.json b/codegen2/eval/wot/CommandVariants.TD.json index dc7598eab5..f59b37e123 100644 --- a/codegen2/eval/wot/CommandVariants.TD.json +++ b/codegen2/eval/wot/CommandVariants.TD.json @@ -35,7 +35,6 @@ "peek": { "output": { "type": "object", - "dtv:additionalProperties": false, "required": [ "outVal" ], "properties": { "outVal": { @@ -59,7 +58,6 @@ "poke": { "input": { "type": "object", - "dtv:additionalProperties": false, "required": [ "inVal" ], "properties": { "inVal": { @@ -82,7 +80,6 @@ "setColor": { "input": { "type": "object", - "dtv:additionalProperties": false, "required": [ "newColor" ], "properties": { "newColor": { @@ -92,7 +89,6 @@ }, "output": { "type": "object", - "dtv:additionalProperties": false, "required": [ "oldColor" ], "properties": { "oldColor": { diff --git a/codegen2/eval/wot/CounterCollection.TD.json b/codegen2/eval/wot/CounterCollection.TD.json index c70c96c7a9..066cd372e8 100644 --- a/codegen2/eval/wot/CounterCollection.TD.json +++ b/codegen2/eval/wot/CounterCollection.TD.json @@ -40,7 +40,6 @@ "availableCounters": { "title": "CounterList", "type": "object", - "dtv:additionalProperties": false, "properties": { "counterNames": { "type": "array", @@ -58,7 +57,6 @@ "title": "CounterError", "description": "The requested counter operation could not be completed.", "type": "object", - "dtv:additionalProperties": false, "dtv:errorMessage": "explanation", "properties": { "explanation": { @@ -71,7 +69,6 @@ "increment": { "input": { "type": "object", - "dtv:additionalProperties": false, "required": [ "counterName" ], "properties": { "counterName": { @@ -81,7 +78,6 @@ }, "output": { "type": "object", - "dtv:additionalProperties": false, "required": [ "counterValue" ], "properties": { "counterValue": { @@ -110,7 +106,6 @@ "getLocation": { "input": { "type": "object", - "dtv:additionalProperties": false, "required": [ "counterName" ], "properties": { "counterName": { @@ -121,13 +116,11 @@ }, "output": { "type": "object", - "dtv:additionalProperties": false, "properties": { "counterLocation": { "title": "CounterLocation", "description": "Location of counter, null if not deployed", "type": "object", - "dtv:additionalProperties": false, "required": [ "latitude", "longitude" ], "properties": { "latitude": { diff --git a/codegen2/eval/wot/PropertySeparate.TD.json b/codegen2/eval/wot/PropertySeparate.TD.json index 8ca97a97e9..8eb5f7568f 100644 --- a/codegen2/eval/wot/PropertySeparate.TD.json +++ b/codegen2/eval/wot/PropertySeparate.TD.json @@ -24,7 +24,6 @@ "PropertyError": { "description": "The requested property read/write could not be completed.", "type": "object", - "dtv:additionalProperties": false, "dtv:errorMessage": "explanation", "properties": { "explanation": { @@ -39,7 +38,6 @@ "title": "MultiWriteError", "description": "The requested multiple property write could not be completed.", "type": "object", - "dtv:additionalProperties": false, "dtv:errorMessage": "explanation", "properties": { "explanation": { diff --git a/codegen2/eval/wot/PropertyTogether.TD.json b/codegen2/eval/wot/PropertyTogether.TD.json index ad4dc39b12..636254c3bd 100644 --- a/codegen2/eval/wot/PropertyTogether.TD.json +++ b/codegen2/eval/wot/PropertyTogether.TD.json @@ -24,7 +24,6 @@ "PropertyError": { "description": "The requested property read/write could not be completed.", "type": "object", - "dtv:additionalProperties": false, "dtv:errorMessage": "explanation", "properties": { "explanation": { @@ -39,7 +38,6 @@ "title": "MultiWriteError", "description": "The requested multiple property write could not be completed.", "type": "object", - "dtv:additionalProperties": false, "dtv:errorMessage": "explanation", "properties": { "explanation": { diff --git a/codegen2/eval/wot/TelemetryComplexSchemas.TD.json b/codegen2/eval/wot/TelemetryComplexSchemas.TD.json index de1931b532..e9c41980cf 100644 --- a/codegen2/eval/wot/TelemetryComplexSchemas.TD.json +++ b/codegen2/eval/wot/TelemetryComplexSchemas.TD.json @@ -47,7 +47,6 @@ "coordinates": { "data": { "type": "object", - "dtv:additionalProperties": false, "properties": { "latitude": { "type": "number", diff --git a/codegen2/schema/aio-td-json-schema.json b/codegen2/schema/aio-td-json-schema.json new file mode 100644 index 0000000000..2c64a504a7 --- /dev/null +++ b/codegen2/schema/aio-td-json-schema.json @@ -0,0 +1,660 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Foo", + "type": "object", + "definitions": { + "title": { + "type": "string", + "pattern": "^[A-Z][A-Za-z0-9]*$", + "description": "Title is used as a codegen type name, so it should start with an uppercase letter and contain only alphanumeric characters" + }, + "dataSchema_boolean": { + "type": "object", + "properties": { + "title": { + "$ref": "#/definitions/title" + }, + "type": { + "type": "string", + "const": "boolean" + }, + "const": { + "type": "boolean" + } + } + }, + "dataSchema_integer": { + "type": "object", + "properties": { + "title": { + "$ref": "#/definitions/title" + }, + "type": { + "type": "string", + "const": "integer" + }, + "const": { + "type": "integer" + }, + "minimum": { + "type": "integer" + }, + "maximum": { + "type": "integer" + } + }, + "defaultSnippets": [ + { + "description": "byte type", + "body": { + "type": "integer", + "minimum": 0, + "maximum": 255 + } + }, + { + "description": "unsigned int type", + "body": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "description": "signed int type", + "body": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + } + } + ] + }, + "dataSchema_number": { + "type": "object", + "properties": { + "title": { + "$ref": "#/definitions/title" + }, + "type": { + "type": "string", + "const": "number" + }, + "const": { + "type": "number" + }, + "minimum": { + "type": "number", + "defautSnippets": [ + { + "description": "minimum float value", + "body": -3.40e+38 + }, + { + "description": "minimum double value", + "body": -1.80e+308 + } + ] + }, + "maximum": { + "type": "number", + "defautSnippets": [ + { + "description": "maximum float value", + "body": 3.40e+38 + }, + { + "description": "maximum double value", + "body": 1.80e+308 + } + ] + } + }, + "defaultSnippets": [ + { + "description": "float type", + "body": { + "type": "number", + "minimum": -3.40e+38, + "maximum": 3.40e+38 + } + }, + { + "description": "double type", + "body": { + "type": "number", + "minimum": -1.80e+308, + "maximum": 1.80e+308 + } + } + ] + }, + "dataSchema_string": { + "type": "object", + "properties": { + "title": { + "$ref": "#/definitions/title" + }, + "type": { + "type": "string", + "const": "string" + }, + "enum": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "uniqueItems": true + }, + "format": { + "type": "string", + "enum": [ "date-time", "date", "time", "uuid" ] + }, + "pattern": { + "type": "string", + "description": "regular expression that expresses either an ISO 8601 duration or a decimal string", + "defaultSnippets": [ + { + "description": "ISO 8601 duration pattern", + "body": "^P(\\\\\\\\d+Y)?(\\\\\\\\d+M)?(\\\\\\\\d+W)?(\\\\\\\\d+D)?(T(\\\\\\\\d+H)?(\\\\\\\\d+M)?(\\\\\\\\d+S)?)?$" + }, + { + "description": "decimal string pattern", + "body": "^(?:\\\\\\\\+|-)?(?:[1-9][0-9]*|0)(?:\\\\\\\\.[0-9]*)?$" + } + ] + }, + "contentEncoding": { + "type": "string", + "const": "base64" + }, + "const": { + "type": "string" + } + } + }, + "dataSchema_object": { + "type": "object", + "properties": { + "title": { + "$ref": "#/definitions/title" + }, + "type": { + "type": "string", + "const": "object" + }, + "dtv:additionalProperties": { + "description": "either 'false' to indicate that this object is a structure, or a schema definition to define the value type of a map", + "oneOf": [ + { + "type": "boolean", + "const": false + }, + { + "$ref": "#/definitions/dataSchema" + } + ], + "defaultSnippets": [ + { + "description": "indicate that the object is a structure with a fixed set of fields defined by 'properties'", + "body": false + }, + { + "description": "indicate that the object is a map whose values have this defined type (e.g. string)", + "body": { "type": "string" } + } + ] + }, + "properties": { + "additionalProperties": { + "$ref": "#/definitions/dataSchema" + } + }, + "required": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "not": { + "allOf": [ + { + "required": [ "dtv:additionalProperties" ] + }, + { + "required": [ "properties" ] + } + ] + } + }, + "dataSchema_array": { + "type": "object", + "properties": { + "title": { + "$ref": "#/definitions/title" + }, + "type": { + "type": "string", + "const": "array" + }, + "items": { + "$ref": "#/definitions/dataSchema" + } + } + }, + "dataSchema_base": { + "type": "object", + "oneOf": [ + { "$ref": "#/definitions/dataSchema_boolean" }, + { "$ref": "#/definitions/dataSchema_integer" }, + { "$ref": "#/definitions/dataSchema_number" }, + { "$ref": "#/definitions/dataSchema_string" }, + { "$ref": "#/definitions/dataSchema_object" }, + { "$ref": "#/definitions/dataSchema_array" } + ] + }, + "dataSchema": { + "allOf": [ { "$ref": "#/definitions/dataSchema_base" } ], + "type": "object", + "required": [ "type" ], + "not": { + "anyOf": [ + { + "required": [ "dtv:ref" ] + }, + { + "required": [ "dtv:errorMessage" ] + } + ] + } + }, + "dataSchema_affordance": { + "type": "object", + "oneOf": [ + { + "$ref": "#/definitions/dataSchema_base", + "required": [ "type" ], + "not": { + "anyOf": [ + { + "required": [ "dtv:ref" ] + } + ] + } + }, + { + "properties": { + "dtv:ref": { + "type": "string", + "description": "reference to an external schema definition to be used in place of an inline type definition" + } + }, + "required": [ "dtv:ref" ], + "not": { + "anyOf": [ + { + "required": [ "type" ] + } + ] + } + } + ], + "not": { + "anyOf": [ + { + "required": [ "dtv:errorMessage" ] + } + ] + } + }, + "dataSchema_action": { + "type": "object", + "oneOf": [ + { + "$ref": "#/definitions/dataSchema_object", + "required": [ "type" ], + "not": { + "anyOf": [ + { + "required": [ "dtv:ref" ] + } + ] + } + }, + { + "properties": { + "dtv:ref": { + "type": "string", + "description": "reference to an external schema definition to be used in place of an inline type definition" + } + }, + "required": [ "dtv:ref" ], + "not": { + "anyOf": [ + { + "required": [ "type" ] + } + ] + } + } + ], + "not": { + "anyOf": [ + { + "required": [ "dtv:errorMessage" ] + } + ] + } + }, + "form_element_base": { + "type": "object", + "properties": { + "dtv:topic": { + "type": "string", + "pattern": "^(?:(?:[!$-*,-.0-z|~]+|(?:{(?:[A-Za-z]+:)?(?:[A-Za-z]+)})))(?:\/(?:[!$-*,-.0-z|~]+|(?:{(?:[A-Za-z]+:)?(?:[A-Za-z]+)})))*$", + "description": "slash-separated sequence of labels, each of which is a non-empty string of restricted characters or a brace-enclosed token", + "defaultSnippets": [ + { + "description": "MQTT topic pattern used for publishes and subscribes", + "body": "sample/action/noop/{modelId}" + } + ] + } + } + }, + "form_element_property": { + "allOf": [ { "$ref": "#/definitions/form_element_base" } ], + "type": "object", + "properties": { + "op": { + "oneOf": [ + { + "type": "string", + "enum": [ "readproperty", "writeproperty" ] + }, + { + "type": "array", + "items": { + "type": "string", + "enum": [ "readproperty", "writeproperty" ] + }, + "minItems": 1 + } + ] + } + }, + "not": { + "anyOf": [ + { + "required": [ "dtv:serviceGroupId" ] + }, + { + "required": [ "dtv:headerCode" ] + }, + { + "required": [ "dtv:headerInfo" ] + } + ], + "description": "dtv:serviceGroupId, dtv:headerCode, and dtv:headerInfo are not allowed in property forms" + } + }, + "form_element_action": { + "allOf": [ { "$ref": "#/definitions/form_element_base" } ], + "type": "object", + "properties": { + "op": { + "oneOf": [ + { + "type": "string", + "enum": [ "invokeaction", "queryaction" ] + }, + { + "type": "array", + "items": { + "type": "string", + "enum": [ "invokeaction", "queryaction" ] + }, + "minItems": 1 + } + ] + }, + "dtv:serviceGroupId": { + "type": "string" + }, + "dtv:headerCode": { + "type": "string", + "description": "reference to a key in the 'schemaDefinitions' property object, whose value is an object defining a string enum" + }, + "dtv:headerInfo": { + "type": "array", + "items": { + "type": "object", + "properties": { + "contentType": { + "type": "string" + }, + "schema": { + "type": "string", + "description": "reference to a key in the 'schemaDefinitions' property object" + }, + "success": { + "type": "boolean" + } + } + } + } + } + }, + "form_element_event": { + "allOf": [ { "$ref": "#/definitions/form_element_base" } ], + "type": "object", + "properties": { + "op": { + "oneOf": [ + { + "type": "string", + "enum": [ "subscribeevent" ] + }, + { + "type": "array", + "items": { + "type": "string", + "enum": [ "subscribeevent" ] + }, + "minItems": 1 + } + ] + }, + "dtv:serviceGroupId": { + "type": "string" + } + }, + "not": { + "anyOf": [ + { + "required": [ "additionalResponses" ] + }, + { + "required": [ "dtv:headerCode" ] + }, + { + "required": [ "dtv:headerInfo" ] + } + ], + "description": "dtv:headerCode and dtv:headerInfo are not allowed in event forms" + } + }, + "form_element_root": { + "allOf": [ { "$ref": "#/definitions/form_element_base" } ], + "type": "object", + "properties": { + "op": { + "oneOf": [ + { + "type": "string", + "enum": [ + "readallproperties", + "writemultipleproperties", + "subscribeallevents" + ] + }, + { + "type": "array", + "items": { + "type": "string", + "enum": [ + "readallproperties", + "writemultipleproperties", + "subscribeallevents" + ] + }, + "minItems": 1 + } + ] + } + }, + "required": [ "op" ], + "not": { + "anyOf": [ + { + "required": [ "dtv:headerCode" ] + }, + { + "required": [ "dtv:headerInfo" ] + } + ], + "description": "dtv:headerCode and dtv:headerInfo are not allowed in root forms" + } + } + }, + "allOf": [ + { + "$ref": "./td-json-schema-validation.json" + }, + { + "properties": { + "@context": { + "type": "array", + "contains": { + "type": "object", + "required": [ "dtv" ], + "properties": { + "dtv": { + "type": "string", + "const": "http://azure.com/DigitalTwins/dtmi#" + } + } + }, + "description": "Must include WoT TD context string \"https://www.w3.org/2022/wot/td/v1.1\" and local context object with key \"dtv\" and value \"http://azure.com/DigitalTwins/dtmi#\"" + }, + "title": { + "$ref": "#/definitions/title" + }, + "schemaDefinitions": { + "type": "object", + "additionalProperties": { + "allOf": [ { "$ref": "#/definitions/dataSchema_base" } ], + "type": "object", + "required": [ "type" ], + "properties": { + "dtv:errorMessage": { + "type": "string", + "description": "name of a property whose value will hold an error message when this object is used as an error value" + } + }, + "not": { + "anyOf": [ + { + "required": [ "dtv:ref" ] + } + ] + } + } + }, + "forms": { + "type": "array", + "items": { + "$ref": "#/definitions/form_element_root" + } + }, + "properties": { + "type": "object", + "additionalProperties": { + "allOf": [ { "$ref": "#/definitions/dataSchema_affordance" } ], + "type": "object", + "properties": { + "readOnly": { + "type": "boolean", + "description": "true if the property is read-only" + }, + "dtv:placeholder": { + "type": "boolean", + "description": "true if the property is a placeholder for a dynamic collection of properties" + }, + "forms": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/form_element_property" + } + } + } + } + }, + "actions": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "input": { + "$ref": "#/definitions/dataSchema_action" + }, + "output": { + "$ref": "#/definitions/dataSchema_action" + }, + "idempotent": { + "type": "boolean", + "description": "true if the action is idempotent" + }, + "safe": { + "type": "boolean", + "description": "true if caching the action's output is safe" + }, + "forms": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/form_element_action" + } + } + } + } + }, + "events": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "data": { + "$ref": "#/definitions/dataSchema_affordance" + }, + "dtv:placeholder": { + "type": "boolean", + "description": "true if the event is a placeholder for a dynamic collection of events" + }, + "forms": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/form_element_event" + } + } + } + } + } + } + } + ] +} diff --git a/codegen2/schema/td-json-schema-validation.json b/codegen2/schema/td-json-schema-validation.json new file mode 100644 index 0000000000..9dc9d2591c --- /dev/null +++ b/codegen2/schema/td-json-schema-validation.json @@ -0,0 +1,1318 @@ +{ + "title": "Thing Description", + "version": "1.1-12-March-2025", + "description": "JSON Schema for validating TD instances against the TD information model. TD instances can be with or without terms that have default values", + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://raw.githubusercontent.com/w3c/wot-thing-description/main/validation/td-json-schema-validation.json", + "definitions": { + "anyUri": { + "type": "string" + }, + "description": { + "type": "string" + }, + "descriptions": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "title": { + "type": "string" + }, + "titles": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "security": { + "oneOf": [ + { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + { + "type": "string" + } + ] + }, + "scopes": { + "oneOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "subprotocol": { + "type": "string", + "examples": ["longpoll", "websub", "sse"] + }, + "thing-context-td-uri-v1": { + "type": "string", + "const": "https://www.w3.org/2019/wot/td/v1" + }, + "thing-context-td-uri-v1.1": { + "type": "string", + "const": "https://www.w3.org/2022/wot/td/v1.1" + }, + "thing-context-td-uri-temp": { + "type": "string", + "const": "http://www.w3.org/ns/td" + }, + "thing-context": { + "anyOf": [ + { + "$comment": "New context URI with other vocabularies after it but not the old one", + "type": "array", + "items": [ + { + "$ref": "#/definitions/thing-context-td-uri-v1.1" + } + ], + "additionalItems": { + "anyOf": [ + { + "$ref": "#/definitions/anyUri" + }, + { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + ], + "not": { + "$ref": "#/definitions/thing-context-td-uri-v1" + } + } + }, + { + "$comment": "Only the new context URI", + "$ref": "#/definitions/thing-context-td-uri-v1.1" + }, + { + "$comment": "Old context URI, followed by the new one and possibly other vocabularies. minItems and contains are required since prefixItems does not say all items should be provided", + "type": "array", + "items": [ + { + "$ref": "#/definitions/thing-context-td-uri-v1" + }, + { + "$ref": "#/definitions/thing-context-td-uri-v1.1" + } + ], + "minItems": 2, + "additionalItems": { + "anyOf": [ + { + "$ref": "#/definitions/anyUri" + }, + { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + ] + } + }, + { + "$comment": "Old context URI, followed by possibly other vocabularies. minItems and contains are required since prefixItems does not say all items should be provided", + "type": "array", + "items": [ + { + "$ref": "#/definitions/thing-context-td-uri-v1" + } + ], + "minItems": 1, + "additionalItems": { + "anyOf": [ + { + "$ref": "#/definitions/anyUri" + }, + { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + ] + } + }, + { + "$comment": "Only the old context URI", + "$ref": "#/definitions/thing-context-td-uri-v1" + } + ] + }, + "bcp47_string": { + "type": "string", + "pattern": "^(((([A-Za-z]{2,3}(-([A-Za-z]{3}(-[A-Za-z]{3}){0,2}))?)|[A-Za-z]{4}|[A-Za-z]{5,8})(-([A-Za-z]{4}))?(-([A-Za-z]{2}|[0-9]{3}))?(-([A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3}))*(-([0-9A-WY-Za-wy-z](-[A-Za-z0-9]{2,8})+))*(-(x(-[A-Za-z0-9]{1,8})+))?)|(x(-[A-Za-z0-9]{1,8})+)|((en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE)|(art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang)))$" + }, + "type_declaration": { + "oneOf": [ + { + "type": "string", + "not": { + "const": "tm:ThingModel" + } + }, + { + "type": "array", + "items": { + "type": "string", + "not": { + "const": "tm:ThingModel" + } + } + } + ] + }, + "dataSchema-type": { + "type": "string", + "enum": ["boolean", "integer", "number", "string", "object", "array", "null"] + }, + "dataSchema": { + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "title": { + "$ref": "#/definitions/title" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "titles": { + "$ref": "#/definitions/titles" + }, + "writeOnly": { + "type": "boolean" + }, + "readOnly": { + "type": "boolean" + }, + "oneOf": { + "type": "array", + "items": { + "$ref": "#/definitions/dataSchema" + } + }, + "unit": { + "type": "string" + }, + "enum": { + "type": "array", + "minItems": 1, + "uniqueItems": true + }, + "format": { + "type": "string" + }, + "const": {}, + "default": {}, + "contentEncoding": { + "type": "string" + }, + "contentMediaType": { + "type": "string" + }, + "type": { + "$ref": "#/definitions/dataSchema-type" + }, + "items": { + "oneOf": [ + { + "$ref": "#/definitions/dataSchema" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/dataSchema" + } + } + ] + }, + "maxItems": { + "type": "integer", + "minimum": 0 + }, + "minItems": { + "type": "integer", + "minimum": 0 + }, + "minimum": { + "type": "number" + }, + "maximum": { + "type": "number" + }, + "exclusiveMinimum": { + "type": "number" + }, + "exclusiveMaximum": { + "type": "number" + }, + "minLength": { + "type": "integer", + "minimum": 0 + }, + "maxLength": { + "type": "integer", + "minimum": 0 + }, + "multipleOf": { + "$ref": "#/definitions/multipleOfDefinition" + }, + "properties": { + "additionalProperties": { + "$ref": "#/definitions/dataSchema" + } + }, + "required": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "additionalResponsesDefinition": { + "type": "array", + "items": { + "type": "object", + "properties": { + "contentType": { + "type": "string" + }, + "schema": { + "type": "string" + }, + "success": { + "type": "boolean" + } + } + } + }, + "multipleOfDefinition": { + "type": ["integer", "number"], + "exclusiveMinimum": 0 + }, + "expectedResponse": { + "type": "object", + "properties": { + "contentType": { + "type": "string" + } + }, + "required": ["contentType"] + }, + "form_element_base": { + "type": "object", + "properties": { + "op": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "href": { + "$ref": "#/definitions/anyUri" + }, + "contentType": { + "type": "string" + }, + "contentCoding": { + "type": "string" + }, + "subprotocol": { + "$ref": "#/definitions/subprotocol" + }, + "security": { + "$ref": "#/definitions/security" + }, + "scopes": { + "$ref": "#/definitions/scopes" + }, + "response": { + "$ref": "#/definitions/expectedResponse" + }, + "additionalResponses": { + "$ref": "#/definitions/additionalResponsesDefinition" + } + }, + "required": ["href"], + "additionalProperties": true + }, + "form_element_property": { + "allOf": [{ "$ref": "#/definitions/form_element_base" }], + "type": "object", + "properties": { + "op": { + "oneOf": [ + { + "type": "string", + "enum": ["readproperty", "writeproperty", "observeproperty", "unobserveproperty"] + }, + { + "type": "array", + "items": { + "type": "string", + "enum": ["readproperty", "writeproperty", "observeproperty", "unobserveproperty"] + }, + "minItems": 1 + } + ] + } + }, + "additionalProperties": true + }, + "form_element_action": { + "allOf": [{ "$ref": "#/definitions/form_element_base" }], + "type": "object", + "properties": { + "op": { + "oneOf": [ + { + "type": "string", + "enum": ["invokeaction", "queryaction", "cancelaction"] + }, + { + "type": "array", + "items": { + "type": "string", + "enum": ["invokeaction", "queryaction", "cancelaction"] + }, + "minItems": 1 + } + ] + } + }, + "additionalProperties": true + }, + "form_element_event": { + "allOf": [{ "$ref": "#/definitions/form_element_base" }], + "type": "object", + "properties": { + "op": { + "oneOf": [ + { + "type": "string", + "enum": ["subscribeevent", "unsubscribeevent"] + }, + { + "type": "array", + "items": { + "type": "string", + "enum": ["subscribeevent", "unsubscribeevent"] + }, + "minItems": 1 + } + ] + } + }, + "additionalProperties": true + }, + "form_element_root": { + "allOf": [{ "$ref": "#/definitions/form_element_base" }], + "type": "object", + "properties": { + "op": { + "oneOf": [ + { + "type": "string", + "enum": [ + "readallproperties", + "writeallproperties", + "readmultipleproperties", + "writemultipleproperties", + "observeallproperties", + "unobserveallproperties", + "queryallactions", + "subscribeallevents", + "unsubscribeallevents" + ] + }, + { + "type": "array", + "items": { + "type": "string", + "enum": [ + "readallproperties", + "writeallproperties", + "readmultipleproperties", + "writemultipleproperties", + "observeallproperties", + "unobserveallproperties", + "queryallactions", + "subscribeallevents", + "unsubscribeallevents" + ] + }, + "minItems": 1 + } + ] + } + }, + "additionalProperties": true, + "required": ["op"] + }, + "form": { + "$comment": "This is NOT for validation purposes but for automatic generation of TS types. For more info, please see: https://github.com/w3c/wot-thing-description/pull/1319#issuecomment-994950057", + "oneOf": [ + { "$ref": "#/definitions/form_element_property" }, + { "$ref": "#/definitions/form_element_action" }, + { "$ref": "#/definitions/form_element_event" }, + { "$ref": "#/definitions/form_element_root" } + ] + }, + "property_element": { + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "title": { + "$ref": "#/definitions/title" + }, + "titles": { + "$ref": "#/definitions/titles" + }, + "forms": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/form_element_property" + } + }, + "uriVariables": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/dataSchema" + } + }, + "observable": { + "type": "boolean" + }, + "writeOnly": { + "type": "boolean" + }, + "readOnly": { + "type": "boolean" + }, + "oneOf": { + "type": "array", + "items": { + "$ref": "#/definitions/dataSchema" + } + }, + "unit": { + "type": "string" + }, + "enum": { + "type": "array", + "minItems": 1, + "uniqueItems": true + }, + "format": { + "type": "string" + }, + "const": {}, + "default": {}, + "type": { + "$ref": "#/definitions/dataSchema-type" + }, + "items": { + "oneOf": [ + { + "$ref": "#/definitions/dataSchema" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/dataSchema" + } + } + ] + }, + "maxItems": { + "type": "integer", + "minimum": 0 + }, + "minItems": { + "type": "integer", + "minimum": 0 + }, + "minimum": { + "type": "number" + }, + "maximum": { + "type": "number" + }, + "exclusiveMinimum": { + "type": "number" + }, + "exclusiveMaximum": { + "type": "number" + }, + "minLength": { + "type": "integer", + "minimum": 0 + }, + "maxLength": { + "type": "integer", + "minimum": 0 + }, + "multipleOf": { + "$ref": "#/definitions/multipleOfDefinition" + }, + "properties": { + "additionalProperties": { + "$ref": "#/definitions/dataSchema" + } + }, + "required": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": ["forms"], + "additionalProperties": true + }, + "action_element": { + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "title": { + "$ref": "#/definitions/title" + }, + "titles": { + "$ref": "#/definitions/titles" + }, + "forms": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/form_element_action" + } + }, + "uriVariables": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/dataSchema" + } + }, + "input": { + "$ref": "#/definitions/dataSchema" + }, + "output": { + "$ref": "#/definitions/dataSchema" + }, + "safe": { + "type": "boolean" + }, + "idempotent": { + "type": "boolean" + }, + "synchronous": { + "type": "boolean" + } + }, + "required": ["forms"], + "additionalProperties": true + }, + "event_element": { + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "title": { + "$ref": "#/definitions/title" + }, + "titles": { + "$ref": "#/definitions/titles" + }, + "forms": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/form_element_event" + } + }, + "uriVariables": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/dataSchema" + } + }, + "subscription": { + "$ref": "#/definitions/dataSchema" + }, + "data": { + "$ref": "#/definitions/dataSchema" + }, + "dataResponse": { + "$ref": "#/definitions/dataSchema" + }, + "cancellation": { + "$ref": "#/definitions/dataSchema" + } + }, + "required": ["forms"], + "additionalProperties": true + }, + "base_link_element": { + "type": "object", + "properties": { + "href": { + "$ref": "#/definitions/anyUri" + }, + "type": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "anchor": { + "$ref": "#/definitions/anyUri" + }, + "hreflang": { + "anyOf": [ + { "$ref": "#/definitions/bcp47_string" }, + { + "type": "array", + "items": { + "$ref": "#/definitions/bcp47_string" + } + } + ] + } + }, + "required": ["href"], + "additionalProperties": true + }, + "link_element": { + "allOf": [ + { + "$ref": "#/definitions/base_link_element" + }, + { + "not": { + "description": "A basic link element should not contain sizes", + "type": "object", + "properties": { + "sizes": {} + }, + "required": ["sizes"] + } + }, + { + "not": { + "description": "A basic link element should not contain icon or tm:extends", + "properties": { + "rel": { + "enum": ["icon", "tm:extends"] + } + }, + "required": ["rel"] + } + } + ] + }, + "icon_link_element": { + "allOf": [ + { + "$ref": "#/definitions/base_link_element" + }, + { + "properties": { + "rel": { + "const": "icon" + }, + "sizes": { + "type": "string", + "pattern": "[0-9]*x[0-9]+" + } + }, + "required": ["rel"] + } + ] + }, + "additionalSecurityScheme": { + "description": "Applies to additional SecuritySchemes not defined in the WoT TD specification.", + "$comment": "Additional SecuritySchemes should always be defined via a context extension, using a prefixed value for the scheme. This prefix (e.g. 'ace', see the example below) must contain at least one character in order to reference a valid JSON-LD context extension.", + "examples": [ + { + "scheme": "ace:ACESecurityScheme", + "ace:as": "coaps://as.example.com/token", + "ace:audience": "coaps://rs.example.com", + "ace:scopes": ["limited", "special"], + "ace:cnonce": true + } + ], + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "proxy": { + "$ref": "#/definitions/anyUri" + }, + "scheme": { + "type": "string", + "pattern": ".+:.*" + } + }, + "required": ["scheme"], + "additionalProperties": true + }, + "noSecurityScheme": { + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "proxy": { + "$ref": "#/definitions/anyUri" + }, + "scheme": { + "type": "string", + "enum": ["nosec"] + } + }, + "required": ["scheme"], + "additionalProperties": true + }, + "autoSecurityScheme": { + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "proxy": { + "$ref": "#/definitions/anyUri" + }, + "scheme": { + "type": "string", + "enum": ["auto"] + } + }, + "not": { + "required": ["name"] + }, + "required": ["scheme"], + "additionalProperties": true + }, + "comboSecurityScheme": { + "oneOf": [ + { + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "proxy": { + "$ref": "#/definitions/anyUri" + }, + "scheme": { + "type": "string", + "enum": ["combo"] + }, + "oneOf": { + "type": "array", + "minItems": 2, + "items": { + "type": "string" + } + } + }, + "required": ["scheme", "oneOf"], + "additionalProperties": true + }, + { + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "proxy": { + "$ref": "#/definitions/anyUri" + }, + "scheme": { + "type": "string", + "enum": ["combo"] + }, + "allOf": { + "type": "array", + "minItems": 2, + "items": { + "type": "string" + } + } + }, + "required": ["scheme", "allOf"], + "additionalProperties": true + } + ] + }, + "basicSecurityScheme": { + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "proxy": { + "$ref": "#/definitions/anyUri" + }, + "scheme": { + "type": "string", + "enum": ["basic"] + }, + "in": { + "type": "string", + "enum": ["header", "query", "body", "cookie", "auto"] + }, + "name": { + "type": "string" + } + }, + "required": ["scheme"], + "additionalProperties": true + }, + "digestSecurityScheme": { + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "proxy": { + "$ref": "#/definitions/anyUri" + }, + "scheme": { + "type": "string", + "enum": ["digest"] + }, + "qop": { + "type": "string", + "enum": ["auth", "auth-int"] + }, + "in": { + "type": "string", + "enum": ["header", "query", "body", "cookie", "auto"] + }, + "name": { + "type": "string" + } + }, + "required": ["scheme"], + "additionalProperties": true + }, + "apiKeySecurityScheme": { + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "proxy": { + "$ref": "#/definitions/anyUri" + }, + "scheme": { + "type": "string", + "enum": ["apikey"] + }, + "in": { + "type": "string", + "enum": ["header", "query", "body", "cookie", "uri", "auto"] + }, + "name": { + "type": "string" + } + }, + "required": ["scheme"], + "additionalProperties": true + }, + "bearerSecurityScheme": { + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "proxy": { + "$ref": "#/definitions/anyUri" + }, + "scheme": { + "type": "string", + "enum": ["bearer"] + }, + "authorization": { + "$ref": "#/definitions/anyUri" + }, + "alg": { + "type": "string" + }, + "format": { + "type": "string" + }, + "in": { + "type": "string", + "enum": ["header", "query", "body", "cookie", "auto"] + }, + "name": { + "type": "string" + } + }, + "required": ["scheme"], + "additionalProperties": true + }, + "pskSecurityScheme": { + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "proxy": { + "$ref": "#/definitions/anyUri" + }, + "scheme": { + "type": "string", + "enum": ["psk"] + }, + "identity": { + "type": "string" + } + }, + "required": ["scheme"], + "additionalProperties": true + }, + "oAuth2SecurityScheme": { + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "proxy": { + "$ref": "#/definitions/anyUri" + }, + "scheme": { + "type": "string", + "enum": ["oauth2"] + }, + "authorization": { + "$ref": "#/definitions/anyUri" + }, + "token": { + "$ref": "#/definitions/anyUri" + }, + "refresh": { + "$ref": "#/definitions/anyUri" + }, + "scopes": { + "oneOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "flow": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "string", + "enum": ["code", "client"] + } + ] + } + }, + "required": ["scheme"], + "additionalProperties": true + }, + "securityScheme": { + "oneOf": [ + { + "$ref": "#/definitions/noSecurityScheme" + }, + { + "$ref": "#/definitions/autoSecurityScheme" + }, + { + "$ref": "#/definitions/comboSecurityScheme" + }, + { + "$ref": "#/definitions/basicSecurityScheme" + }, + { + "$ref": "#/definitions/digestSecurityScheme" + }, + { + "$ref": "#/definitions/apiKeySecurityScheme" + }, + { + "$ref": "#/definitions/bearerSecurityScheme" + }, + { + "$ref": "#/definitions/pskSecurityScheme" + }, + { + "$ref": "#/definitions/oAuth2SecurityScheme" + }, + { + "$ref": "#/definitions/additionalSecurityScheme" + } + ] + } + }, + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uri" + }, + "title": { + "$ref": "#/definitions/title" + }, + "titles": { + "$ref": "#/definitions/titles" + }, + "properties": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/property_element" + } + }, + "actions": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/action_element" + } + }, + "events": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/event_element" + } + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "version": { + "type": "object", + "properties": { + "instance": { + "type": "string" + } + }, + "required": ["instance"] + }, + "links": { + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "#/definitions/link_element" + }, + { + "$ref": "#/definitions/icon_link_element" + } + ] + } + }, + "forms": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/form_element_root" + } + }, + "base": { + "$ref": "#/definitions/anyUri" + }, + "securityDefinitions": { + "type": "object", + "minProperties": 1, + "additionalProperties": { + "$ref": "#/definitions/securityScheme" + } + }, + "schemaDefinitions": { + "type": "object", + "minProperties": 1, + "additionalProperties": { + "$ref": "#/definitions/dataSchema" + } + }, + "support": { + "$ref": "#/definitions/anyUri" + }, + "created": { + "type": "string", + "format": "date-time" + }, + "modified": { + "type": "string", + "format": "date-time" + }, + "profile": { + "oneOf": [ + { + "$ref": "#/definitions/anyUri" + }, + { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/anyUri" + } + } + ] + }, + "security": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + } + ] + }, + "uriVariables": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/dataSchema" + } + }, + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "@context": { + "$ref": "#/definitions/thing-context" + } + }, + "required": ["title", "security", "securityDefinitions", "@context"], + "additionalProperties": true +} diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/FieldSpec.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/FieldSpec.cs index 3a8b56852a..34ca48b14f 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/FieldSpec.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/FieldSpec.cs @@ -13,7 +13,6 @@ internal static FieldSpec CreateFixed(string title, string description, string b { Title = title, Type = TDValues.TypeObject, - AdditionalProperties = new TDAdditionalPropSpecifier { Boolean = false }, }, Require: false, backupSchemaName, diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs index 50d488d3e4..789569b8a5 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs @@ -118,15 +118,15 @@ private static void ComputeClosureOfDataSchema(SchemaNamer schemaNamer, string b { ComputeClosureOfDataSchema(schemaNamer, backupName, dataSchema.Items, format, closedSchemaSpecs); } - else if (dataSchema.AdditionalProperties?.DataSchema != null) + else if (dataSchema.AdditionalProperties != null) { - ComputeClosureOfDataSchema(schemaNamer, backupName, dataSchema.AdditionalProperties.DataSchema, format, closedSchemaSpecs); + ComputeClosureOfDataSchema(schemaNamer, backupName, dataSchema.AdditionalProperties, format, closedSchemaSpecs); } } private static bool IsProxy(TDDataSchema dataSchema) { - return (dataSchema.Type == TDValues.TypeObject && (dataSchema.AdditionalProperties == null || dataSchema.AdditionalProperties.Boolean == false) && dataSchema.Properties == null) || + return (dataSchema.Type == TDValues.TypeObject && (dataSchema.AdditionalProperties == null || dataSchema.AdditionalProperties == null) && dataSchema.Properties == null) || (dataSchema.Type == TDValues.TypeArray && dataSchema.Items == null); } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaSpec.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaSpec.cs index f4ddd00b0f..360403120e 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaSpec.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaSpec.cs @@ -8,7 +8,7 @@ internal record SchemaSpec(SerializationFormat Format) { internal static bool TryCreateFromDataSchema(SchemaNamer schemaNamer, TDDataSchema dataSchema, SerializationFormat format, string backupName, [NotNullWhen(true)] out SchemaSpec? schemaSpec) { - if (dataSchema.Type == TDValues.TypeObject && dataSchema.AdditionalProperties?.Boolean == false) + if (dataSchema.Type == TDValues.TypeObject && dataSchema.AdditionalProperties == null) { schemaSpec = ObjectSpec.CreateFromDataSchema(schemaNamer, dataSchema, format, backupName); return true; diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs index 505abb7507..2272fe5550 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs @@ -39,7 +39,7 @@ internal string GetTypeAndAddenda(TDDataSchema tdSchema, string backupSchemaName return $"\"$ref\": \"{GetReferencePath(tdSchema.Ref, refBase)}\""; } - if ((tdSchema.Type == TDValues.TypeObject && tdSchema.AdditionalProperties?.Boolean == false) || + if ((tdSchema.Type == TDValues.TypeObject && tdSchema.AdditionalProperties == null) || (tdSchema.Type == TDValues.TypeString && tdSchema.Enum != null)) { return $"\"$ref\": \"{this.schemaNamer.ApplyBackupSchemaName(tdSchema.Title, backupSchemaName)}.json\""; @@ -48,7 +48,7 @@ internal string GetTypeAndAddenda(TDDataSchema tdSchema, string backupSchemaName switch (tdSchema.Type ?? string.Empty) { case TDValues.TypeObject: - return $"\"type\": \"object\", \"additionalProperties\": {{ {GetTypeAndAddenda(tdSchema.AdditionalProperties!.DataSchema!, backupSchemaName, refBase)} }}"; + return $"\"type\": \"object\", \"additionalProperties\": {{ {GetTypeAndAddenda(tdSchema.AdditionalProperties!, backupSchemaName, refBase)} }}"; case TDValues.TypeArray: string itemsProp = tdSchema.Items != null ? $", \"items\": {{ {GetTypeAndAddenda(tdSchema.Items, backupSchemaName, refBase)} }}" : string.Empty; return $"\"type\": \"array\"{itemsProp}"; diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAction.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAction.cs index 838619ada0..d105c6f6dc 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAction.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAction.cs @@ -1,6 +1,5 @@ namespace Azure.Iot.Operations.TDParser.Model { - using System.Collections.Generic; using System.Text.Json.Serialization; public class TDAction diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAdditionalPropSpecifier.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAdditionalPropSpecifier.cs deleted file mode 100644 index de876b881a..0000000000 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAdditionalPropSpecifier.cs +++ /dev/null @@ -1,71 +0,0 @@ -namespace Azure.Iot.Operations.TDParser.Model -{ - using System; - using System.Text.Json; - using System.Text.Json.Serialization; - - public class TDAdditionalPropSpecifier - { - public bool? Boolean { get; set; } - - public TDDataSchema? DataSchema { get; set; } - - public override string ToString() - { - if (Boolean.HasValue) - { - return Boolean.Value.ToString(); - } - else if (DataSchema != null) - { - return DataSchema.Type ?? string.Empty; - } - else - { - return string.Empty; - } - } - - public virtual bool Equals(TDAdditionalPropSpecifier? other) - { - if (other == null) - { - return false; - } - - return Boolean == other.Boolean && - ((DataSchema == null && other.DataSchema == null) || (DataSchema?.Equals(other.DataSchema) ?? false)); - } - } - - public sealed class AdditionalPropSpecifierJsonConverter : JsonConverter - { - public override TDAdditionalPropSpecifier Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) - { - return new TDAdditionalPropSpecifier - { - Boolean = reader.TokenType == JsonTokenType.True ? true : reader.TokenType == JsonTokenType.False ? false : (bool?)null, - DataSchema = reader.TokenType == JsonTokenType.StartObject ? JsonSerializer.Deserialize(ref reader, options) : null - }; - } - - public override void Write( - Utf8JsonWriter writer, - TDAdditionalPropSpecifier amount, - JsonSerializerOptions options) - { - if (amount.Boolean.HasValue) - { - writer.WriteBooleanValue(amount.Boolean.Value); - } - else if (amount.DataSchema != null) - { - JsonSerializer.Serialize(writer, amount.DataSchema, options); - } - else - { - writer.WriteNullValue(); - } - } - } -} diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs index b82b83a3a9..439d99d8ec 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs @@ -37,7 +37,7 @@ public class TDDataSchema public string? ContentEncoding { get; set; } [JsonPropertyName("dtv:additionalProperties")] - public TDAdditionalPropSpecifier? AdditionalProperties { get; set; } + public TDDataSchema? AdditionalProperties { get; set; } [JsonPropertyName("enum")] public string[]? Enum { get; set; } diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/TDParser.cs b/codegen2/src/Azure.Iot.Operations.TDParser/TDParser.cs index 29e63e7232..ac34597e35 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/TDParser.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/TDParser.cs @@ -13,7 +13,6 @@ public class TDParser Converters = { new ContextSpecifierJsonConverter(), - new AdditionalPropSpecifierJsonConverter(), new TDStringArrayJsonConverter(), } }; From 8330f78bf1f95a6e92a3b6646fc5981b7fa23d55 Mon Sep 17 00:00:00 2001 From: Auto Gen Date: Tue, 11 Nov 2025 15:54:02 -0800 Subject: [PATCH 11/52] support bool consts and numbers without min/max --- .../eval/wot/CommandComplexSchemas.TD.json | 8 ++++++ .../EnvoyGenerator.cs | 3 ++- .../dotnet/Constants/code/DotNetConstants.cs | 14 ++++++++++ .../dotnet/Constants/t4/DotNetConstants.tt | 2 +- .../rust/Constants/code/RustConstants.cs | 13 +++++++++ .../rust/Constants/t4/RustConstants.tt | 2 +- .../JsonSchemaStandardizer.cs | 27 ++++++++++++------- 7 files changed, 56 insertions(+), 13 deletions(-) diff --git a/codegen2/eval/wot/CommandComplexSchemas.TD.json b/codegen2/eval/wot/CommandComplexSchemas.TD.json index 18562e1c9a..801a5623c3 100644 --- a/codegen2/eval/wot/CommandComplexSchemas.TD.json +++ b/codegen2/eval/wot/CommandComplexSchemas.TD.json @@ -34,6 +34,14 @@ "Hello": { "type": "string", "const": "Hello, World!" + }, + "Raining": { + "type": "boolean", + "const": true + }, + "Sunny": { + "type": "boolean", + "const": false } }, "actions": { diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs index 03dbd6db77..ce895ce25b 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs @@ -81,7 +81,7 @@ private static void CollectNamedConstants(TDThing tdThing, SchemaNamer schemaNam foreach (var constDef in constDefs) { - if (constDef.Value.Type == TDValues.TypeString || constDef.Value.Type == TDValues.TypeNumber || constDef.Value.Type == TDValues.TypeInteger) + if (constDef.Value.Type == TDValues.TypeString || constDef.Value.Type == TDValues.TypeNumber || constDef.Value.Type == TDValues.TypeInteger || constDef.Value.Type == TDValues.TypeBoolean) { JsonElement constElt = (JsonElement)constDef.Value.Const!; object constValue = constDef.Value.Type switch @@ -89,6 +89,7 @@ private static void CollectNamedConstants(TDThing tdThing, SchemaNamer schemaNam TDValues.TypeString => constElt.GetString()!, TDValues.TypeNumber => constElt.GetDouble(), TDValues.TypeInteger => constElt.GetInt32(), + TDValues.TypeBoolean => constElt.GetBoolean(), _ => null!, }; diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Constants/code/DotNetConstants.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Constants/code/DotNetConstants.cs index 97c987a8bc..71cd7b9c64 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Constants/code/DotNetConstants.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Constants/code/DotNetConstants.cs @@ -1,6 +1,7 @@ namespace Azure.Iot.Operations.EnvoyGenerator { using System.Collections.Generic; + using System.Globalization; using System.Linq; using Azure.Iot.Operations.CodeGeneration; @@ -32,8 +33,21 @@ private static string GetDotNetType(string type) TDValues.TypeString => "string", TDValues.TypeNumber => "double", TDValues.TypeInteger => "int", + TDValues.TypeBoolean => "bool", _ => throw new System.ArgumentException($"Unsupported constant type: {type}"), }; } + + private static string GetDotNetValue(object value) + { + return value switch + { + string s => $"\"{s}\"", + double d => d.ToString(CultureInfo.InvariantCulture), + int i => i.ToString(CultureInfo.InvariantCulture), + bool b => b ? "true" : "false", + _ => throw new System.ArgumentException($"Unsupported constant value type: {value.GetType()}"), + }; + } } } diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Constants/t4/DotNetConstants.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Constants/t4/DotNetConstants.tt index 54034a5f8d..8ca501fa18 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Constants/t4/DotNetConstants.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Constants/t4/DotNetConstants.tt @@ -13,7 +13,7 @@ namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage. <# if (constant.Description != null) { #> /// <#=constant.Description#> <# } #> - public const <#=GetDotNetType(constant.Type)#> <#=constant.Name.GetConstantName(TargetLanguage.CSharp)#> = <#=constant.Type == TDValues.TypeString ? $"\"{constant.Value}\"" : $"{constant.Value}"#>; + public const <#=GetDotNetType(constant.Type)#> <#=constant.Name.GetConstantName(TargetLanguage.CSharp)#> = <#=GetDotNetValue(constant.Value)#>; <# if (this.anyDescriptions && ix < this.constants.Count) { #> <# } #> diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Constants/code/RustConstants.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Constants/code/RustConstants.cs index bf7d48cc35..63be283afc 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Constants/code/RustConstants.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Constants/code/RustConstants.cs @@ -31,8 +31,21 @@ private static string GetRustType(string type) TDValues.TypeString => "&str", TDValues.TypeNumber => "f64", TDValues.TypeInteger => "i32", + TDValues.TypeBoolean => "bool", _ => throw new System.ArgumentException($"Unsupported constant type: {type}"), }; } + + private static string GetRustValue(object value) + { + return value switch + { + string s => $"\"{s}\"", + double d => d.ToString(CultureInfo.InvariantCulture), + int i => i.ToString(CultureInfo.InvariantCulture), + bool b => b ? "true" : "false", + _ => throw new System.ArgumentException($"Unsupported constant value type: {value.GetType()}"), + }; + } } } diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Constants/t4/RustConstants.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Constants/t4/RustConstants.tt index 900d69a7a6..9b5890661d 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Constants/t4/RustConstants.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Constants/t4/RustConstants.tt @@ -6,5 +6,5 @@ <# if (constant.Description != null) { #> /// <#=constant.Description#> <# } #> -pub const <#=constant.Name.GetConstantName(TargetLanguage.Rust)#>: <#=GetRustType(constant.Type)#> = <#=constant.Type == TDValues.TypeString ? $"\"{constant.Value}\"" : $"{constant.Value}"#>; +pub const <#=constant.Name.GetConstantName(TargetLanguage.Rust)#>: <#=GetRustType(constant.Type)#> = <#=GetRustValue(constant.Value)#>; <# } #> diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs index 620b49fecc..51f684249f 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs @@ -207,17 +207,24 @@ private SchemaType GetPrimitiveTypeFromJsonElement(string docName, string keyNam case "number": return schemaElt.GetProperty("format").GetString() == "float" ? new FloatType(orNull) : new DoubleType(orNull); case "integer": - return schemaElt.GetProperty("maximum").GetUInt64() switch + if (schemaElt.TryGetProperty("maximum", out JsonElement maxElt)) { - < 128 => new ByteType(orNull), - < 256 => new UnsignedByteType(orNull), - < 32768 => new ShortType(orNull), - < 65536 => new UnsignedShortType(orNull), - < 2147483648 => new IntegerType(orNull), - < 4294967296 => new UnsignedIntegerType(orNull), - < 9223372036854775808 => new LongType(orNull), - _ => new UnsignedLongType(orNull), - }; + return maxElt.GetUInt64() switch + { + < 128 => new ByteType(orNull), + < 256 => new UnsignedByteType(orNull), + < 32768 => new ShortType(orNull), + < 65536 => new UnsignedShortType(orNull), + < 2147483648 => new IntegerType(orNull), + < 4294967296 => new UnsignedIntegerType(orNull), + < 9223372036854775808 => new LongType(orNull), + _ => new UnsignedLongType(orNull), + }; + } + else + { + return schemaElt.TryGetProperty("minimum", out JsonElement minElt) && minElt.GetInt64() >= 0 ? new UnsignedLongType(orNull) : new LongType(orNull); + } case "string": if (schemaElt.TryGetProperty("format", out JsonElement formatElt)) { From 745644cdd5da7795b960279f1e72ee241d409b2b Mon Sep 17 00:00:00 2001 From: Auto Gen Date: Tue, 11 Nov 2025 16:08:27 -0800 Subject: [PATCH 12/52] allow serviceGroupId in root form iff op is subscribeallevents --- codegen2/schema/aio-td-json-schema.json | 80 ++++++++++++++++++------- 1 file changed, 58 insertions(+), 22 deletions(-) diff --git a/codegen2/schema/aio-td-json-schema.json b/codegen2/schema/aio-td-json-schema.json index 2c64a504a7..98c3b6752e 100644 --- a/codegen2/schema/aio-td-json-schema.json +++ b/codegen2/schema/aio-td-json-schema.json @@ -489,32 +489,68 @@ "form_element_root": { "allOf": [ { "$ref": "#/definitions/form_element_base" } ], "type": "object", - "properties": { - "op": { - "oneOf": [ - { - "type": "string", - "enum": [ - "readallproperties", - "writemultipleproperties", - "subscribeallevents" + "oneOf": [ + { + "properties": { + "op": { + "oneOf": [ + { + "type": "string", + "enum": [ + "subscribeallevents" + ] + }, + { + "type": "array", + "items": { + "type": "string", + "enum": [ + "subscribeallevents" + ] + }, + "minItems": 1 + } ] }, - { - "type": "array", - "items": { - "type": "string", - "enum": [ - "readallproperties", - "writemultipleproperties", - "subscribeallevents" - ] - }, - "minItems": 1 + "dtv:serviceGroupId": { + "type": "string" } - ] + } + }, + { + "properties": { + "op": { + "oneOf": [ + { + "type": "string", + "enum": [ + "readallproperties", + "writemultipleproperties" + ] + }, + { + "type": "array", + "items": { + "type": "string", + "enum": [ + "readallproperties", + "writemultipleproperties" + ] + }, + "minItems": 1 + } + ] + } + }, + "not": { + "anyOf": [ + { + "required": [ "dtv:serviceGroupId" ] + } + ] + } } - }, + ], "required": [ "op" ], "not": { "anyOf": [ From d7d01d6c0e4a0c732573a3a12b60a8235f3257b2 Mon Sep 17 00:00:00 2001 From: Auto Gen Date: Thu, 13 Nov 2025 12:55:31 -0800 Subject: [PATCH 13/52] add more descriptions and snippets to JSON Schema --- codegen2/eval/wot/CommandVariants.TD.json | 4 - codegen2/eval/wot/CounterCollection.TD.json | 14 +- codegen2/eval/wot/PropertySeparate.TD.json | 4 - codegen2/eval/wot/PropertyTogether.TD.json | 4 - codegen2/schema/aio-td-json-schema.json | 770 ++++++++++++++++---- 5 files changed, 628 insertions(+), 168 deletions(-) diff --git a/codegen2/eval/wot/CommandVariants.TD.json b/codegen2/eval/wot/CommandVariants.TD.json index f59b37e123..adb4acdd46 100644 --- a/codegen2/eval/wot/CommandVariants.TD.json +++ b/codegen2/eval/wot/CommandVariants.TD.json @@ -105,9 +105,5 @@ } ] } - }, - "properties": { - }, - "events": { } } diff --git a/codegen2/eval/wot/CounterCollection.TD.json b/codegen2/eval/wot/CounterCollection.TD.json index 066cd372e8..7e0bcb4fbe 100644 --- a/codegen2/eval/wot/CounterCollection.TD.json +++ b/codegen2/eval/wot/CounterCollection.TD.json @@ -51,7 +51,15 @@ }, "extantCounters": { "title": "CounterList", - "type": "object" + "type": "object", + "properties": { + "counterNames": { + "type": "array", + "items": { + "type": "string" + } + } + } }, "locationError": { "title": "CounterError", @@ -159,9 +167,5 @@ } ] } - }, - "properties": { - }, - "events": { } } diff --git a/codegen2/eval/wot/PropertySeparate.TD.json b/codegen2/eval/wot/PropertySeparate.TD.json index 8eb5f7568f..2d8d1732b4 100644 --- a/codegen2/eval/wot/PropertySeparate.TD.json +++ b/codegen2/eval/wot/PropertySeparate.TD.json @@ -56,8 +56,6 @@ } } }, - "actions": { - }, "properties": { "Alpha": { "type": "integer", @@ -199,7 +197,5 @@ } ] } - }, - "events": { } } diff --git a/codegen2/eval/wot/PropertyTogether.TD.json b/codegen2/eval/wot/PropertyTogether.TD.json index 636254c3bd..23b157ead4 100644 --- a/codegen2/eval/wot/PropertyTogether.TD.json +++ b/codegen2/eval/wot/PropertyTogether.TD.json @@ -80,8 +80,6 @@ "op": "readallproperties" } ], - "actions": { - }, "properties": { "Alpha": { "type": "integer", @@ -203,7 +201,5 @@ } ] } - }, - "events": { } } diff --git a/codegen2/schema/aio-td-json-schema.json b/codegen2/schema/aio-td-json-schema.json index 98c3b6752e..57100f6ad9 100644 --- a/codegen2/schema/aio-td-json-schema.json +++ b/codegen2/schema/aio-td-json-schema.json @@ -1,12 +1,14 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Foo", + "title": "Thing Description with AIO Protocol Binding", + "version": "0.1", + "description": "JSON Schema for validating TD instances that employ the AIO WoT Protocol Binding", "type": "object", "definitions": { "title": { "type": "string", "pattern": "^[A-Z][A-Za-z0-9]*$", - "description": "Title is used as a codegen type name, so it should start with an uppercase letter and contain only alphanumeric characters" + "description": "The 'title' value is used as a codegen type name, so it should start with an uppercase letter and contain only alphanumeric characters" }, "dataSchema_boolean": { "type": "object", @@ -37,38 +39,70 @@ "type": "integer" }, "minimum": { - "type": "integer" + "type": "integer", + "description": "inclusive minimum integer value", + "defaultSnippets": [ + { + "description": "minimum unsigned value", + "body": 0 + }, + { + "description": "minimum signed 1-byte value", + "body": -128 + }, + { + "description": "minimum signed 2-byte value", + "body": -32768 + }, + { + "description": "minimum signed 4-byte value", + "body": -2147483648 + }, + { + "description": "minimum signed 8-byte value", + "body": -9223372036854775808 + } + ] }, "maximum": { - "type": "integer" - } - }, - "defaultSnippets": [ - { - "description": "byte type", - "body": { - "type": "integer", - "minimum": 0, - "maximum": 255 - } - }, - { - "description": "unsigned int type", - "body": { - "type": "integer", - "minimum": 0, - "maximum": 4294967295 - } - }, - { - "description": "signed int type", - "body": { - "type": "integer", - "minimum": -2147483648, - "maximum": 2147483647 - } + "type": "integer", + "description": "inclusive maximum integer value", + "defaultSnippets": [ + { + "description": "maximum unsigned 1-byte value", + "body": 256 + }, + { + "description": "maximum unsigned 2-byte value", + "body": 65535 + }, + { + "description": "maximum unsigned 4-byte value", + "body": 4294967295 + }, + { + "description": "maximum unsigned 8-byte value", + "body": 9223372036854775807 + }, + { + "description": "maximum signed 1-byte value", + "body": 127 + }, + { + "description": "maximum signed 2-byte value", + "body": 32767 + }, + { + "description": "maximum signed 4-byte value", + "body": 2147483647 + }, + { + "description": "maximum signed 8-byte value", + "body": 18446744073709551615 + } + ] } - ] + } }, "dataSchema_number": { "type": "object", @@ -85,49 +119,33 @@ }, "minimum": { "type": "number", - "defautSnippets": [ + "description": "inclusive minimum numeric value", + "defaultSnippets": [ { - "description": "minimum float value", + "description": "minimum single-precision floating-point value", "body": -3.40e+38 }, { - "description": "minimum double value", - "body": -1.80e+308 + "description": "minimum double-precision floating-point value", + "body": -1.70e+308 } ] }, "maximum": { "type": "number", - "defautSnippets": [ + "description": "inclusive maximum numeric value", + "defaultSnippets": [ { - "description": "maximum float value", + "description": "maximum single-precision floating-point value", "body": 3.40e+38 }, { - "description": "maximum double value", - "body": 1.80e+308 + "description": "maximum double-precision floating-point value", + "body": 1.70e+308 } ] } - }, - "defaultSnippets": [ - { - "description": "float type", - "body": { - "type": "number", - "minimum": -3.40e+38, - "maximum": 3.40e+38 - } - }, - { - "description": "double type", - "body": { - "type": "number", - "minimum": -1.80e+308, - "maximum": 1.80e+308 - } - } - ] + } }, "dataSchema_string": { "type": "object", @@ -176,6 +194,7 @@ }, "dataSchema_object": { "type": "object", + "required": [ "properties" ], "properties": { "title": { "$ref": "#/definitions/title" @@ -184,34 +203,14 @@ "type": "string", "const": "object" }, - "dtv:additionalProperties": { - "description": "either 'false' to indicate that this object is a structure, or a schema definition to define the value type of a map", - "oneOf": [ - { - "type": "boolean", - "const": false - }, - { - "$ref": "#/definitions/dataSchema" - } - ], - "defaultSnippets": [ - { - "description": "indicate that the object is a structure with a fixed set of fields defined by 'properties'", - "body": false - }, - { - "description": "indicate that the object is a map whose values have this defined type (e.g. string)", - "body": { "type": "string" } - } - ] - }, "properties": { + "description": "use 'properties' to indicate an object type and define fields for the object", "additionalProperties": { "$ref": "#/definitions/dataSchema" } }, "required": { + "description": "array of 'properties' keys that indicate properties required to be included in any instance of the object", "type": "array", "items": { "type": "string" @@ -219,18 +218,43 @@ } }, "not": { - "allOf": [ + "anyOf": [ { "required": [ "dtv:additionalProperties" ] - }, + } + ] + } + }, + "dataSchema_map": { + "type": "object", + "required": [ "dtv:additionalProperties" ], + "properties": { + "title": { + "$ref": "#/definitions/title" + }, + "type": { + "type": "string", + "const": "object" + }, + "dtv:additionalProperties": { + "description": "use 'dtv:additionalProperties' to indicate a map type and specify the data schema for the values therein", + "$ref": "#/definitions/dataSchema" + } + }, + "not": { + "anyOf": [ { "required": [ "properties" ] + }, + { + "required": [ "required" ] } ] } }, "dataSchema_array": { "type": "object", + "required": [ "items" ], "properties": { "title": { "$ref": "#/definitions/title" @@ -240,6 +264,7 @@ "const": "array" }, "items": { + "description": "use 'items' to specify the data schema for the values in the array", "$ref": "#/definitions/dataSchema" } } @@ -252,7 +277,200 @@ { "$ref": "#/definitions/dataSchema_number" }, { "$ref": "#/definitions/dataSchema_string" }, { "$ref": "#/definitions/dataSchema_object" }, + { "$ref": "#/definitions/dataSchema_map" }, { "$ref": "#/definitions/dataSchema_array" } + ], + "defaultSnippets": [ + { + "description": "Boolean type", + "body": { + "type": "boolean" + } + }, + { + "description": "signed 1-byte type", + "body": { + "type": "integer", + "minimum": -128, + "maximum": 127 + } + }, + { + "description": "unsigned 1-byte type", + "body": { + "type": "integer", + "minimum": 0, + "maximum": 255 + } + }, + { + "description": "signed 2-byte type", + "body": { + "type": "integer", + "minimum": -32768, + "maximum": 32767 + } + }, + { + "description": "unsigned 2-byte type", + "body": { + "type": "integer", + "minimum": 0, + "maximum": 65535 + } + }, + { + "description": "signed 4-byte type", + "body": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + } + }, + { + "description": "unsigned 4-byte type", + "body": { + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + } + }, + { + "description": "signed 8-byte type", + "body": { + "type": "integer", + "minimum": -9223372036854775808, + "maximum": 9223372036854775807 + } + }, + { + "description": "unsigned 8-byte type", + "body": { + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + }, + { + "description": "single-precision floating-point type", + "body": { + "type": "number", + "minimum": -3.40e+38, + "maximum": 3.40e+38 + } + }, + { + "description": "double-precision floating-point type", + "body": { + "type": "number", + "minimum": -1.70e+308, + "maximum": 1.70e+308 + } + }, + { + "description": "string type", + "body": { + "type": "string" + } + }, + { + "description": "enumerated type (with example values)", + "body": { + "type": "string", + "enum": [ "red", "green", "blue" ] + } + }, + { + "description": "date-time type", + "body": { + "type": "string", + "format": "date-time" + } + }, + { + "description": "date type", + "body": { + "type": "string", + "format": "date" + } + }, + { + "description": "time type", + "body": { + "type": "string", + "format": "time" + } + }, + { + "description": "UUID type", + "body": { + "type": "string", + "format": "uuid" + } + }, + { + "description": "byte stream type", + "body": { + "type": "string", + "contentEncoding": "base64" + } + }, + { + "description": "ISO 8601 duration string type", + "body": { + "type": "string", + "pattern": "^P(\\\\\\\\d+Y)?(\\\\\\\\d+M)?(\\\\\\\\d+W)?(\\\\\\\\d+D)?(T(\\\\\\\\d+H)?(\\\\\\\\d+M)?(\\\\\\\\d+S)?)?$" + } + }, + { + "description": "decimal string type", + "body": { + "type": "string", + "pattern": "^(?:\\\\\\\\+|-)?(?:[1-9][0-9]*|0)(?:\\\\\\\\.[0-9]*)?$" + } + }, + { + "description": "array type (example with string values)", + "body": { + "type": "array", + "items": { "type": "string" } + } + }, + { + "description": "object type (3 example float properties, 2 required)", + "body": { + "type": "object", + "required": [ "lat", "lon" ], + "properties": { + "lat": { + "type": "number", + "minimum": -3.40e+38, + "maximum": 3.40e+38 + }, + "lon": { + "type": "number", + "minimum": -3.40e+38, + "maximum": 3.40e+38 + }, + "alt": { + "type": "number", + "minimum": -3.40e+38, + "maximum": 3.40e+38 + } + } + } + }, + { + "description": "map type (example values are signed integers)", + "body": { + "type": "object", + "dtv:additionalProperties": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + } + } + } ] }, "dataSchema": { @@ -307,7 +525,13 @@ "required": [ "dtv:errorMessage" ] } ] - } + }, + "defaultSnippets": [ + { + "description": "reference to an external schema definition", + "body": { "dtv:ref": "./EXAMPLESCHEMA.json" } + } + ] }, "dataSchema_action": { "type": "object", @@ -351,10 +575,18 @@ "form_element_base": { "type": "object", "properties": { + "href": { + "description": "an 'href' property is required by WoT TD schema, but not processed by AIO ProtocolCompiler" + }, + "contentType": { + "type": "string", + "description": "content type for communicated values, only 'application/json' supported at present", + "enum": [ "application/json" ] + }, "dtv:topic": { "type": "string", "pattern": "^(?:(?:[!$-*,-.0-z|~]+|(?:{(?:[A-Za-z]+:)?(?:[A-Za-z]+)})))(?:\/(?:[!$-*,-.0-z|~]+|(?:{(?:[A-Za-z]+:)?(?:[A-Za-z]+)})))*$", - "description": "slash-separated sequence of labels, each of which is a non-empty string of restricted characters or a brace-enclosed token", + "description": "MQTT topic pattern -- slash-separated sequence of labels, each of which is a non-empty string of restricted characters or a brace-enclosed token", "defaultSnippets": [ { "description": "MQTT topic pattern used for publishes and subscribes", @@ -421,19 +653,23 @@ ] }, "dtv:serviceGroupId": { + "description": "string to use for shared subscriptions when receiving server-side action requests", "type": "string" }, "dtv:headerCode": { - "type": "string", - "description": "reference to a key in the 'schemaDefinitions' property object, whose value is an object defining a string enum" + "description": "reference to a key in the 'schemaDefinitions' property object, whose value is an object defining a string enum for a MQTT header value", + "type": "string" }, "dtv:headerInfo": { + "description": "schema for content embedded in a MQTT user header value", "type": "array", "items": { "type": "object", "properties": { "contentType": { - "type": "string" + "description": "content type for data embedded in header info value, only 'application/json' supported at present", + "type": "string", + "enum": [ "application/json" ] }, "schema": { "type": "string", @@ -468,6 +704,7 @@ ] }, "dtv:serviceGroupId": { + "description": "string to use for shared subscriptions when receiving client-side events", "type": "string" } }, @@ -489,68 +726,45 @@ "form_element_root": { "allOf": [ { "$ref": "#/definitions/form_element_base" } ], "type": "object", - "oneOf": [ - { - "properties": { - "op": { - "oneOf": [ - { - "type": "string", - "enum": [ - "subscribeallevents" - ] - }, - { - "type": "array", - "items": { - "type": "string", - "enum": [ - "subscribeallevents" - ] - }, - "minItems": 1 - } + "properties": { + "op": { + "oneOf": [ + { + "type": "string", + "enum": [ + "subscribeallevents", + "readallproperties", + "writemultipleproperties" ] }, - "dtv:serviceGroupId": { - "type": "string" + { + "type": "array", + "items": { + "type": "string", + "enum": [ + "subscribeallevents" + ] + }, + "minItems": 1 + }, + { + "type": "array", + "items": { + "type": "string", + "enum": [ + "readallproperties", + "writemultipleproperties" + ] + }, + "minItems": 1 } - } + ] }, - { - "properties": { - "op": { - "oneOf": [ - { - "type": "string", - "enum": [ - "readallproperties", - "writemultipleproperties" - ] - }, - { - "type": "array", - "items": { - "type": "string", - "enum": [ - "readallproperties", - "writemultipleproperties" - ] - }, - "minItems": 1 - } - ] - } - }, - "not": { - "anyOf": [ - { - "required": [ "dtv:serviceGroupId" ] - } - ] - } + "dtv:serviceGroupId": { + "description": "string to use for shared subscriptions when receiving client-side events", + "type": "string" } - ], + }, "required": [ "op" ], "not": { "anyOf": [ @@ -590,6 +804,7 @@ }, "schemaDefinitions": { "type": "object", + "description": "definitions of schemas that can be referenced via 'additionalResponses', 'dtv:headerCode', and 'dtv:headerInfo' properties in 'forms' elements", "additionalProperties": { "allOf": [ { "$ref": "#/definitions/dataSchema_base" } ], "type": "object", @@ -609,14 +824,82 @@ } } }, + "securityDefinitions": { + "description": "a 'securityDefinitions' property is required by WoT TD schema, but not processed by AIO ProtocolCompiler" + }, + "security": { + "description": "a 'security' property is required by WoT TD schema, but not processed by AIO ProtocolCompiler" + }, + "links": { + "type": "array", + "description": "Use a value with \"rel\": \"service-desc\" to specify a JSON file of rules for generating schema names", + "items": { + "type": "object", + "required": [ "rel", "href", "type" ], + "properties": { + "rel": { + "type": "string", + "description": "A 'rel' value of 'service-desc' indicates that the target file contains rules for generating schema names", + "const": "service-desc" + }, + "href": { + "type": "string", + "description": "path to a JSON file that specifies rules for generating schema names" + }, + "type": { + "type": "string", + "description": "schema definition rules must be written in JSON format", + "const": "application/json" + } + } + }, + "defaultSnippets": [ + { + "description": "example 'links' value -- replace './EXAMPLE.SchemaNames.json' with path to your own schema names declaration file", + "body": [ + { + "rel": "service-desc", + "href": "./EXAMPLE.SchemaNames.json", + "type": "application/json" + } + ] + } + ] + }, "forms": { "type": "array", "items": { "$ref": "#/definitions/form_element_root" - } + }, + "defaultSnippets": [ + { + "description": "example root-level 'forms' values for interacting with all properties and events", + "body": [ + { + "href": "dtmi:test:SomeURI;1", + "contentType": "application/json", + "dtv:topic": "example/SomeTopic/write", + "op": "writemultipleproperties" + }, + { + "href": "dtmi:test:SomeURI;1", + "contentType": "application/json", + "dtv:topic": "example/SomeTopic/read", + "op": "readallproperties" + }, + { + "href": "dtmi:test:SomeURI;1", + "contentType": "application/json", + "dtv:topic": "example/SomeTopic/AllEvents", + "op": "subscribeallevents" + } + ] + } + ] }, "properties": { "type": "object", + "description": "properties are values stored on a server that can be read or written by clients", "additionalProperties": { "allOf": [ { "$ref": "#/definitions/dataSchema_affordance" } ], "type": "object", @@ -634,21 +917,112 @@ "minItems": 1, "items": { "$ref": "#/definitions/form_element_property" + }, + "defaultSnippets": [ + { + "description": "example 'forms' values for properties", + "body": [ + { + "href": "dtmi:test:SomeURI;1", + "contentType": "application/json", + "dtv:topic": "example/SomeTopic/MyProp1/write", + "op": "writeproperty" + }, + { + "href": "dtmi:test:SomeURI;1", + "contentType": "application/json", + "dtv:topic": "example/SomeTopic/MyProp1/read", + "op": "readproperty" + } + ] + } + ] + } + } + }, + "defaultSnippets": [ + { + "description": "example 'properties' value", + "body": { + "MyProperty": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647, + "readOnly": false, + "forms": [ + { + "href": "dtmi:test:SomeURI;1", + "contentType": "application/json", + "dtv:topic": "example/SomeTopic/MyProp1/write", + "op": "writeproperty" + }, + { + "href": "dtmi:test:SomeURI;1", + "contentType": "application/json", + "dtv:topic": "example/SomeTopic/MyProp1/read", + "op": "readproperty" + } + ] } } } - } + ] }, "actions": { "type": "object", + "description": "actions are round-trip messages initiated by clients to request a server to perform an operation and return the result to the client", "additionalProperties": { "type": "object", "properties": { "input": { - "$ref": "#/definitions/dataSchema_action" + "description": "input arguments as properties in object type", + "$ref": "#/definitions/dataSchema_action", + "defaultSnippets": [ + { + "body": { + "type": "object", + "properties": { + "arg1": { + "type": "string" + }, + "arg2": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + } + } + } + }, + { + "description": "reference to an external schema definition (must be an object)", + "body": { "dtv:ref": "./EXAMPLESCHEMA.json" } + } + ] }, "output": { - "$ref": "#/definitions/dataSchema_action" + "description": "output values as properties in object type", + "$ref": "#/definitions/dataSchema_action", + "defaultSnippets": [ + { + "body": { + "type": "object", + "properties": { + "status": { + "type": "string" + }, + "result": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + } + } + } + }, + { + "description": "reference to an external schema definition (must be an object)", + "body": { "dtv:ref": "./EXAMPLESCHEMA.json" } + } + ] }, "idempotent": { "type": "boolean", @@ -663,18 +1037,77 @@ "minItems": 1, "items": { "$ref": "#/definitions/form_element_action" + }, + "defaultSnippets": [ + { + "description": "example 'forms' value for actions", + "body": [ + { + "href": "dtmi:test:SomeURI;1", + "contentType": "application/json", + "dtv:topic": "example/SomeTopic/DoSomething", + "op": "invokeaction" + } + ] + } + ] + } + } + }, + "defaultSnippets": [ + { + "description": "example 'actions' value", + "body": { + "MyAction": { + "input": { + "type": "object", + "properties": { + "arg1": { + "type": "string" + }, + "arg2": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + } + } + }, + "output": { + "type": "object", + "properties": { + "status": { + "type": "string" + }, + "result": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + } + } + }, + "forms": [ + { + "href": "dtmi:test:SomeURI;1", + "contentType": "application/json", + "dtv:topic": "example/SomeTopic/DoSomething", + "op": "invokeaction" + } + ] } } } - } + ] }, "events": { "type": "object", + "description": "events are one-way messages sent from servers to clients to indicate occurrences and status changes", "additionalProperties": { "type": "object", + "required": [ "data" ], "properties": { "data": { - "$ref": "#/definitions/dataSchema_affordance" + "$ref": "#/definitions/dataSchema_affordance", + "description": "the data schema of the event" }, "dtv:placeholder": { "type": "boolean", @@ -685,10 +1118,45 @@ "minItems": 1, "items": { "$ref": "#/definitions/form_element_event" + }, + "defaultSnippets": [ + { + "description": "example 'forms' value for events", + "body": [ + { + "href": "dtmi:test:SomeURI;1", + "contentType": "application/json", + "dtv:topic": "example/SomeTopic/MyEvent", + "op": "subscribeevent" + } + ] + } + ] + } + } + }, + "defaultSnippets": [ + { + "description": "example 'events' value", + "body": { + "MyEvent": { + "data": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + }, + "forms": [ + { + "href": "dtmi:test:SomeURI;1", + "contentType": "application/json", + "dtv:topic": "example/SomeTopic/MyEvent", + "op": "subscribeevent" + } + ] } } } - } + ] } } } From 4a30eb430d310ee1ea5484518190f572d5ec9521 Mon Sep 17 00:00:00 2001 From: Auto Gen Date: Fri, 14 Nov 2025 07:42:16 -0800 Subject: [PATCH 14/52] support use of ProtocolCompiler with no TDs --- codegen2/eval/g1.sh | 8 ++++---- codegen2/eval/gen.sh | 10 ++++++++-- .../ArgBinder.cs | 10 +++++----- .../CommandHandler.cs | 13 ++++++++----- .../OptionContainer.cs | 4 ++-- .../Program.cs | 10 +++++----- 6 files changed, 32 insertions(+), 23 deletions(-) diff --git a/codegen2/eval/g1.sh b/codegen2/eval/g1.sh index c10e83a6a7..5f7ee0214e 100644 --- a/codegen2/eval/g1.sh +++ b/codegen2/eval/g1.sh @@ -2,8 +2,8 @@ gen=../src/Azure.Iot.Operations.ProtocolCompiler/bin/Debug/net9.0/Azure.Iot.Operations.ProtocolCompiler.exe -[[ -d dotnet/ExternalSchemasSample ]] && rm -r dotnet/ExternalSchemasSample -$gen --thingFiles wot/ExternalSchemas.TD.json --extSchemas wot/ExternalSchemas/*.json --typeNamer wot/ExternalSchemas.TypeNames.json --outDir dotnet/ExternalSchemasSample --lang csharp --namespace ExternalSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol +[[ -d dotnet/ExternalSchemasOnlySample ]] && rm -r dotnet/ExternalSchemasOnlySample +$gen --schemas wot/ExternalSchemas/*.json --outDir dotnet/ExternalSchemasOnlySample --lang csharp --namespace ExternalSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol -[[ -d rust/external_schemas_gen ]] && rm -r rust/external_schemas_gen -$gen --thingFiles wot/ExternalSchemas.TD.json --extSchemas wot/ExternalSchemas/*.json --typeNamer wot/ExternalSchemas.TypeNames.json --outDir rust/external_schemas_gen --lang rust --namespace ExternalSchemas --sdkPath ../../rust --srcSubdir src +[[ -d rust/external_schemas_only_gen ]] && rm -r rust/external_schemas_only_gen +$gen --schemas wot/ExternalSchemas/*.json --outDir rust/external_schemas_only_gen --lang rust --namespace ExternalSchemas --sdkPath ../../rust --srcSubdir src diff --git a/codegen2/eval/gen.sh b/codegen2/eval/gen.sh index 8ea52de744..ad88a68293 100644 --- a/codegen2/eval/gen.sh +++ b/codegen2/eval/gen.sh @@ -51,7 +51,13 @@ $gen --thingFiles wot/TwoThings.TD.json --outDir dotnet/TwoThingsSample --lang c $gen --thingFiles wot/TwoThings.TD.json --outDir rust/two_things_gen --lang rust --namespace TwoThings --sdkPath ../../rust --srcSubdir src [[ -d dotnet/ExternalSchemasSample ]] && rm -r dotnet/ExternalSchemasSample -$gen --thingFiles wot/ExternalSchemas.TD.json --extSchemas wot/ExternalSchemas/*\json --outDir dotnet/ExternalSchemasSample --lang csharp --namespace ExternalSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol +$gen --thingFiles wot/ExternalSchemas.TD.json --schemas wot/ExternalSchemas/*.json --outDir dotnet/ExternalSchemasSample --lang csharp --namespace ExternalSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/external_schemas_gen ]] && rm -r rust/external_schemas_gen -$gen --thingFiles wot/ExternalSchemas.TD.json --extSchemas wot/ExternalSchemas/*.json --outDir rust/external_schemas_gen --lang rust --namespace ExternalSchemas --sdkPath ../../rust --srcSubdir src +$gen --thingFiles wot/ExternalSchemas.TD.json --schemas wot/ExternalSchemas/*.json --outDir rust/external_schemas_gen --lang rust --namespace ExternalSchemas --sdkPath ../../rust --srcSubdir src + +[[ -d dotnet/ExternalSchemasOnlySample ]] && rm -r dotnet/ExternalSchemasOnlySample +$gen --schemas wot/ExternalSchemas/*.json --outDir dotnet/ExternalSchemasOnlySample --lang csharp --namespace ExternalSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol + +[[ -d rust/external_schemas_only_gen ]] && rm -r rust/external_schemas_only_gen +$gen --schemas wot/ExternalSchemas/*.json --outDir rust/external_schemas_only_gen --lang rust --namespace ExternalSchemas --sdkPath ../../rust --srcSubdir src diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/ArgBinder.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/ArgBinder.cs index f21d71ada9..584843e48f 100644 --- a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/ArgBinder.cs +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/ArgBinder.cs @@ -10,7 +10,7 @@ public class ArgBinder : BinderBase { private readonly Option thingFiles; - private readonly Option extSchemaFiles; + private readonly Option schemaFiles; private readonly Option typeNamerFile; private readonly Option outputDir; private readonly Option workingDir; @@ -27,7 +27,7 @@ public class ArgBinder : BinderBase /// Initializes a new instance of the class. /// /// File(s) containing WoT Thing Description(s) to process. - /// Filespec(s) of files containing external schema definitions. + /// Filespec(s) of files containing schema definitions. /// Directory for receiving generated code. /// Directory for storing temporary files (relative to outDir unless path is rooted). /// Subdirectory under outputDir for generated source code. @@ -40,7 +40,7 @@ public class ArgBinder : BinderBase /// Generate default (empty) implementations of callbacks. public ArgBinder( Option thingFiles, - Option extSchemaFiles, + Option schemaFiles, Option typeNamerFile, Option outputDir, Option workingDir, @@ -54,7 +54,7 @@ public ArgBinder( Option defaultImpl) { this.thingFiles = thingFiles; - this.extSchemaFiles = extSchemaFiles; + this.schemaFiles = schemaFiles; this.typeNamerFile = typeNamerFile; this.outputDir = outputDir; this.workingDir = workingDir; @@ -77,7 +77,7 @@ protected override OptionContainer GetBoundValue(BindingContext bindingContext) return new OptionContainer() { ThingFiles = bindingContext.ParseResult.GetValueForOption(this.thingFiles)!, - ExtSchemaFiles = bindingContext.ParseResult.GetValueForOption(this.extSchemaFiles)!, + SchemaFiles = bindingContext.ParseResult.GetValueForOption(this.schemaFiles)!, TypeNamerFile = bindingContext.ParseResult.GetValueForOption(this.typeNamerFile), OutputDir = outputDir, WorkingDir = Path.IsPathRooted(workingDir) ? new DirectoryInfo(workingDir) : new DirectoryInfo(Path.Combine(outputDir.FullName, workingDir)), diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs index 03ddae8694..8421443887 100644 --- a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs @@ -44,10 +44,10 @@ public static int GenerateCode(OptionContainer options) WriteItems(schemas, options.WorkingDir); } - FileInfo[] extSchemaFiles = options.ExtSchemaFiles.SelectMany(fs => Directory.GetFiles(Path.GetDirectoryName(fs) ?? string.Empty, Path.GetFileName(fs)), (_, f) => new FileInfo(f)).ToArray(); - if (extSchemaFiles.Length > 0) + FileInfo[] schemaFiles = options.SchemaFiles.SelectMany(fs => Directory.GetFiles(Path.GetDirectoryName(fs) ?? string.Empty, Path.GetFileName(fs)), (_, f) => new FileInfo(f)).ToArray(); + if (schemaFiles.Length > 0) { - ImportSchemas(extSchemaFiles, generatedSchemas); + ImportSchemas(schemaFiles, generatedSchemas); } string? typeNameInfoText = options.TypeNamerFile?.OpenText()?.ReadToEnd(); @@ -162,9 +162,12 @@ private static string LegalizeProjectName(string fsName) private static bool TryConfirmValidOptions(OptionContainer options) { - if (options.ThingFiles.Length == 0) + bool anyThingFiles = options.ThingFiles.Length > 0; + bool anySchemaFiles = options.SchemaFiles.Any(fs => Directory.GetFiles(Path.GetDirectoryName(fs) ?? string.Empty, Path.GetFileName(fs)).Any()); + + if (!anyThingFiles && !anySchemaFiles) { - Console.WriteLine("No Thing Description files specified."); + Console.WriteLine($"No Thing Description files specified, and no schema files {(options.SchemaFiles.Length > 0 ? "found" : "specified")}."); Console.WriteLine("Use option --help for CLI usage and options."); return false; } diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/OptionContainer.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/OptionContainer.cs index 94d4856bb0..3b182faaa6 100644 --- a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/OptionContainer.cs +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/OptionContainer.cs @@ -10,8 +10,8 @@ public class OptionContainer /// Gets or sets the file(s) containing WoT Thing Description(s) to process. public required FileInfo[] ThingFiles { get; set; } - /// Gets or sets the filespec(s) of files containing external schema definitions. - public required string[] ExtSchemaFiles { get; set; } + /// Gets or sets the filespec(s) of files containing schema definitions. + public required string[] SchemaFiles { get; set; } /// Gets or sets the file containing JSON config for deriving type names from JSON Schema names. public required FileInfo? TypeNamerFile { get; set; } diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/Program.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/Program.cs index d9faffd1ab..31f370a3fc 100644 --- a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/Program.cs +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/Program.cs @@ -17,9 +17,9 @@ static void Main(string[] args) description: "File(s) containing WoT Thing Description(s) to process") { ArgumentHelpName = "FILEPATH ...", AllowMultipleArgumentsPerToken = true }; - var extSchemasOption = new Option( - name: "--extSchemas", - description: "Filespec(s) of files containing external schema definitions (each may include wildcards).") + var schemasOption = new Option( + name: "--schemas", + description: "Filespec(s) of files containing schema definitions (each may include wildcards).") { ArgumentHelpName = "FILESPEC ...", AllowMultipleArgumentsPerToken = true }; var typeNamerOption = new Option( @@ -80,7 +80,7 @@ static void Main(string[] args) var rootCommand = new RootCommand("Akri MQTT code generation tool for WoT Thing Descriptions") { thingFilesOption, - extSchemasOption, + schemasOption, typeNamerOption, outDirOption, workingDirOption, @@ -96,7 +96,7 @@ static void Main(string[] args) ArgBinder argBinder = new ArgBinder( thingFilesOption, - extSchemasOption, + schemasOption, typeNamerOption, outDirOption, workingDirOption, From b1d4895c9286caa0cec24d0b56cdbc92c3b3fc10 Mon Sep 17 00:00:00 2001 From: Auto Gen Date: Mon, 17 Nov 2025 09:54:42 -0800 Subject: [PATCH 15/52] add and integrate tracker classes --- codegen2/codegen.sln | 18 - .../ErrorLevel.cs | 9 + .../ErrorLog.cs | 103 ++ .../ErrorRecord.cs | 4 + .../ErrorReporter.cs | 96 ++ .../ExternalReference.cs | 4 + .../FormInfo.cs | 41 +- .../ParsedThing.cs | 2 +- .../SchemaNamer.cs | 7 +- .../TargetLanguage.cs | 3 +- .../ThingSupport.cs | 75 +- .../TypeNamer.cs | 7 +- .../ActionEnvoyGenerator.cs | 45 +- .../ActionSpec.cs | 5 +- .../EnvoyGenerator.cs | 33 +- .../EnvoyTransformFactory.cs | 5 +- .../EventEnvoyGenerator.cs | 16 +- .../PropertyEnvoyGenerator.cs | 37 +- .../CommandHandler.cs | 186 +++- .../ActionSchemaGenerator.cs | 49 +- .../AliasSpec.cs | 2 +- .../EnumSpec.cs | 21 +- .../EventSchemaGenerator.cs | 33 +- .../FieldSpec.cs | 14 +- .../ObjectSpec.cs | 23 +- .../PropertySchemaGenerator.cs | 57 +- .../SchemaGenerator.cs | 103 +- .../SchemaSpec.cs | 13 +- .../SchemaTransformFactory.cs | 63 +- .../json/JsonSchemaSupport.cs | 38 +- .../ArrayTracker.cs | 135 +++ .../BaseHolder.cs | 64 ++ .../BoolHolder.cs | 36 + .../IDeserializable.cs | 10 + .../ISourceTracker.cs | 12 + .../ITraversable.cs | 9 + .../MapTracker.cs | 137 +++ .../Model/TDAction.cs | 175 +++- .../Model/TDContextSpecifier.cs | 105 +- .../Model/TDDataSchema.cs | 322 +++++- .../Model/TDEvent.cs | 146 ++- .../Model/TDForm.cs | 203 +++- .../Model/TDLink.cs | 131 ++- .../Model/TDProperty.cs | 142 ++- .../Model/TDSchemaReference.cs | 131 ++- .../Model/TDStringArray.cs | 50 - .../Model/TDThing.cs | 216 +++- .../NumberHolder.cs | 36 + .../ObjectHolder.cs | 87 ++ .../StringHolder.cs | 36 + .../Azure.Iot.Operations.TDParser/TDParser.cs | 37 +- .../ValueTracker.cs | 116 +++ .../ISchemaStandardizer.cs | 2 +- .../JsonSchemaStandardizer.cs | 971 +++++++++++++++--- .../JsonSchemaValues.cs | 45 + .../JsonTracker.cs | 194 ++++ .../SchemaRoot.cs | 7 + .../TypeGenerator.cs | 14 +- codegen2/src/EnvoyTester/EnvoyTester.csproj | 13 - codegen2/src/EnvoyTester/Program.cs | 78 -- codegen2/src/SchemaTester/Program.cs | 68 -- codegen2/src/SchemaTester/SchemaTester.csproj | 14 - codegen2/src/TDParse/Program.cs | 44 +- codegen2/src/TypeTester/Program.cs | 66 -- codegen2/src/TypeTester/TypeTester.csproj | 13 - 65 files changed, 3982 insertions(+), 995 deletions(-) create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLevel.cs create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorRecord.cs create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/ExternalReference.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TDParser/ArrayTracker.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TDParser/BaseHolder.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TDParser/BoolHolder.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TDParser/IDeserializable.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TDParser/ISourceTracker.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TDParser/ITraversable.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TDParser/MapTracker.cs delete mode 100644 codegen2/src/Azure.Iot.Operations.TDParser/Model/TDStringArray.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TDParser/NumberHolder.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TDParser/ObjectHolder.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TDParser/StringHolder.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TDParser/ValueTracker.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaValues.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonTracker.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/SchemaRoot.cs delete mode 100644 codegen2/src/EnvoyTester/EnvoyTester.csproj delete mode 100644 codegen2/src/EnvoyTester/Program.cs delete mode 100644 codegen2/src/SchemaTester/Program.cs delete mode 100644 codegen2/src/SchemaTester/SchemaTester.csproj delete mode 100644 codegen2/src/TypeTester/Program.cs delete mode 100644 codegen2/src/TypeTester/TypeTester.csproj diff --git a/codegen2/codegen.sln b/codegen2/codegen.sln index 6c33a0953b..e36056f259 100644 --- a/codegen2/codegen.sln +++ b/codegen2/codegen.sln @@ -11,16 +11,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Azure.Iot.Operations.CodeGe EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Azure.Iot.Operations.TypeGenerator", "src\Azure.Iot.Operations.TypeGenerator\Azure.Iot.Operations.TypeGenerator.csproj", "{6C3D81EA-5950-4AFA-AA0F-75EBFB5C1732}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TypeTester", "src\TypeTester\TypeTester.csproj", "{F6C35677-73FE-4AAC-BF96-E1AA9641AC9A}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Azure.Iot.Operations.SchemaGenerator", "src\Azure.Iot.Operations.SchemaGenerator\Azure.Iot.Operations.SchemaGenerator.csproj", "{AED5A5DA-CA6D-4FC6-B806-050603EF5416}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SchemaTester", "src\SchemaTester\SchemaTester.csproj", "{372B32CC-898F-434B-9BFC-40C90E29DF2F}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Azure.Iot.Operations.EnvoyGenerator", "src\Azure.Iot.Operations.EnvoyGenerator\Azure.Iot.Operations.EnvoyGenerator.csproj", "{7A0261EF-4C5B-009B-1F89-A78993646A3D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EnvoyTester", "src\EnvoyTester\EnvoyTester.csproj", "{E710D7E8-D341-4F41-80EE-EA4D2D82E0C6}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Azure.Iot.Operations.ProtocolCompiler", "src\Azure.Iot.Operations.ProtocolCompiler\Azure.Iot.Operations.ProtocolCompiler.csproj", "{5A83D072-8E7F-424C-B009-4A6011A13CA5}" EndProject Global @@ -45,26 +39,14 @@ Global {6C3D81EA-5950-4AFA-AA0F-75EBFB5C1732}.Debug|Any CPU.Build.0 = Debug|Any CPU {6C3D81EA-5950-4AFA-AA0F-75EBFB5C1732}.Release|Any CPU.ActiveCfg = Release|Any CPU {6C3D81EA-5950-4AFA-AA0F-75EBFB5C1732}.Release|Any CPU.Build.0 = Release|Any CPU - {F6C35677-73FE-4AAC-BF96-E1AA9641AC9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F6C35677-73FE-4AAC-BF96-E1AA9641AC9A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F6C35677-73FE-4AAC-BF96-E1AA9641AC9A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F6C35677-73FE-4AAC-BF96-E1AA9641AC9A}.Release|Any CPU.Build.0 = Release|Any CPU {AED5A5DA-CA6D-4FC6-B806-050603EF5416}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AED5A5DA-CA6D-4FC6-B806-050603EF5416}.Debug|Any CPU.Build.0 = Debug|Any CPU {AED5A5DA-CA6D-4FC6-B806-050603EF5416}.Release|Any CPU.ActiveCfg = Release|Any CPU {AED5A5DA-CA6D-4FC6-B806-050603EF5416}.Release|Any CPU.Build.0 = Release|Any CPU - {372B32CC-898F-434B-9BFC-40C90E29DF2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {372B32CC-898F-434B-9BFC-40C90E29DF2F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {372B32CC-898F-434B-9BFC-40C90E29DF2F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {372B32CC-898F-434B-9BFC-40C90E29DF2F}.Release|Any CPU.Build.0 = Release|Any CPU {7A0261EF-4C5B-009B-1F89-A78993646A3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7A0261EF-4C5B-009B-1F89-A78993646A3D}.Debug|Any CPU.Build.0 = Debug|Any CPU {7A0261EF-4C5B-009B-1F89-A78993646A3D}.Release|Any CPU.ActiveCfg = Release|Any CPU {7A0261EF-4C5B-009B-1F89-A78993646A3D}.Release|Any CPU.Build.0 = Release|Any CPU - {E710D7E8-D341-4F41-80EE-EA4D2D82E0C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E710D7E8-D341-4F41-80EE-EA4D2D82E0C6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E710D7E8-D341-4F41-80EE-EA4D2D82E0C6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E710D7E8-D341-4F41-80EE-EA4D2D82E0C6}.Release|Any CPU.Build.0 = Release|Any CPU {5A83D072-8E7F-424C-B009-4A6011A13CA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5A83D072-8E7F-424C-B009-4A6011A13CA5}.Debug|Any CPU.Build.0 = Debug|Any CPU {5A83D072-8E7F-424C-B009-4A6011A13CA5}.Release|Any CPU.ActiveCfg = Release|Any CPU diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLevel.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLevel.cs new file mode 100644 index 0000000000..86e0ff12f1 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLevel.cs @@ -0,0 +1,9 @@ +namespace Azure.Iot.Operations.CodeGeneration +{ + public enum ErrorLevel + { + Warning, + Error, + Fatal, + } +} diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs new file mode 100644 index 0000000000..deb9602a82 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs @@ -0,0 +1,103 @@ +namespace Azure.Iot.Operations.CodeGeneration +{ + using System.Collections.Generic; + using System.IO; + + public class ErrorLog + { + private readonly Dictionary> registeredNames; + private readonly Dictionary> registeredReferences; + private readonly string defaultFolder; + + public HashSet Warnings { get; init; } + + public HashSet Errors { get; init; } + + public ErrorRecord? FatalError { get; private set; } + + public bool HasErrors => Errors.Count > 0 || FatalError != null; + + public ErrorLog(string defaultFolder) + { + this.registeredNames = new Dictionary>(); + this.registeredReferences = new Dictionary>(); + this.defaultFolder = defaultFolder; + + Errors = new HashSet(); + Warnings = new HashSet(); + FatalError = null; + } + + public void CheckForDuplicates() + { + foreach (var (name, registrations) in registeredNames) + { + if (registrations.Count > 1) + { + foreach (var (filename, lineNumber) in registrations) + { + AddError(ErrorLevel.Error, $"Duplicate use of generated name '{name}' across Thing Descriptions.", filename, lineNumber, crossRef: name); + } + } + } + } + + public void RegisterName(string name, string filename, int lineNumber) + { + if (!registeredNames.TryGetValue(name, out Dictionary? registrations)) + { + registrations = new(); + registeredNames[name] = registrations; + } + + if (!registrations.TryGetValue(filename, out int extantLineNumber) || extantLineNumber < 0) + { + registrations[filename] = lineNumber; + } + } + + public void RegisterReference(string refPath, string filename, int lineNumber, string refValue) + { + string fullPath = Path.GetFullPath(Path.Combine(this.defaultFolder, refValue)).Replace('\\', '/'); + if (!registeredReferences.TryGetValue(refPath, out List? references)) + { + references = new(); + registeredReferences[refPath] = references; + } + + references.Add(new ExternalReference(filename, lineNumber, refValue)); + } + + public void AddError(ErrorLevel level, string message, string filename, int lineNumber, int cfLineNumber = -1, string crossRef = "") + { + ErrorRecord errorRecord = new(message, filename, lineNumber, cfLineNumber, crossRef); + switch (level) + { + case ErrorLevel.Warning: + this.Warnings.Add(errorRecord); + break; + case ErrorLevel.Error: + this.Errors.Add(errorRecord); + break; + case ErrorLevel.Fatal: + FatalError = errorRecord; + break; + } + } + + public void AddReferenceError(string refPath, string description, string reason, string filename, int lineNumber, string refValue) + { + if (registeredReferences.TryGetValue(refPath, out List? references)) + { + foreach (ExternalReference reference in references) + { + AddError(ErrorLevel.Error, $"External schema reference \"{reference.RefValue}\" not resolvable; {reason}", reference.Filename, reference.LineNumber); + } + } + else + { + AddError(ErrorLevel.Error, $"{description} \"{refValue}\" not resolvable; {reason}", filename, lineNumber); + } + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorRecord.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorRecord.cs new file mode 100644 index 0000000000..825294ef8b --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorRecord.cs @@ -0,0 +1,4 @@ +namespace Azure.Iot.Operations.CodeGeneration +{ + public record ErrorRecord(string Message, string Filename, int LineNumber, int CfLineNumber, string CrossRef); +} diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs new file mode 100644 index 0000000000..58d444b59d --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs @@ -0,0 +1,96 @@ +namespace Azure.Iot.Operations.CodeGeneration +{ + using System; + using System.IO; + using System.Text.RegularExpressions; + + public class ErrorReporter + { + private static readonly Regex JsonMessageRegex = new(@"(.+)\. LineNumber: (\d+) \| BytePositionInLine: \d+\.", RegexOptions.Compiled); + + private ErrorLog errorLog; + private string filename; + private string basePath; + private byte[]? byteStream; + + public ErrorReporter(ErrorLog errorLog, string filePath, byte[]? byteStream = null) + { + this.errorLog = errorLog; + this.filename = Path.GetFileName(filePath); + this.basePath = Path.GetDirectoryName(filePath)!; + this.byteStream = byteStream; + } + + public void RegisterName(string name, long byteIndex) + { + this.errorLog.RegisterName(name, this.filename, GetLineNumber(byteIndex)); + } + + public void RegisterReference(long byteIndex, string refValue) + { + string refPath = Path.GetDirectoryName(refValue) == string.Empty ? refValue : Path.GetFullPath(Path.Combine(this.basePath, refValue)).Replace('\\', '/'); + this.errorLog.RegisterReference(refPath, this.filename, GetLineNumber(byteIndex), refValue); + } + + public void ReportError(string message, long byteIndex, long cfByteIndex = -1, ErrorLevel level = ErrorLevel.Error) + { + this.errorLog.AddError(level, message, this.filename, GetLineNumber(byteIndex), GetLineNumber(cfByteIndex)); + } + + public void ReportWarning(string message, long byteIndex, long cfByteIndex = -1) + { + ReportError(message, byteIndex, cfByteIndex, ErrorLevel.Warning); + } + + public void ReportFatal(string message, long byteIndex, long cfByteIndex = -1) + { + ReportError(message, byteIndex, cfByteIndex, ErrorLevel.Fatal); + } + + public void ReportReferenceError(string description, string reason, string refValue, long byteIndex) + { + string refPath = Path.GetFullPath(Path.Combine(this.basePath, refValue)).Replace('\\', '/'); + this.errorLog.AddReferenceError(refPath, description, reason, this.filename, GetLineNumber(byteIndex), refValue); + } + + public void ReportJsonException(Exception ex) + { + Match? match = JsonMessageRegex.Match(ex.Message); + if (match.Success) + { + string innerMessage = match.Groups[1].Captures[0].Value; + string message = $"JSON syntax error: {innerMessage}."; + int lineNumber = int.Parse(match.Groups[2].Captures[0].Value) + 1; + this.errorLog.AddError(ErrorLevel.Fatal, message, this.filename, lineNumber); + } + else + { + this.errorLog.AddError(ErrorLevel.Fatal, ex.Message, this.filename, -1); + } + } + + private int GetLineNumber(long byteIndex) + { + if (this.byteStream == null) + { + return byteIndex < 0 ? -1 : 0; + } + + if (byteIndex < 0 || byteIndex >= this.byteStream.Length) + { + return -1; + } + + int lineNum = 1; + for (long ix = 0; ix < byteIndex; ++ix) + { + if (this.byteStream[ix] == '\n') + { + ++lineNum; + } + } + + return lineNum; + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ExternalReference.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ExternalReference.cs new file mode 100644 index 0000000000..c9b265ae5a --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ExternalReference.cs @@ -0,0 +1,4 @@ +namespace Azure.Iot.Operations.CodeGeneration +{ + public record ExternalReference(string Filename, int LineNumber, string RefValue); +} diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/FormInfo.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/FormInfo.cs index 31610a708c..fcfb4eb507 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/FormInfo.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/FormInfo.cs @@ -2,40 +2,41 @@ { using System.Collections.Generic; using System.Linq; + using Azure.Iot.Operations.TDParser; using Azure.Iot.Operations.TDParser.Model; public record FormInfo( SerializationFormat Format, bool HasErrorResponse, string? ErrorRespName, - TDDataSchema? ErrorRespSchema, + ValueTracker? ErrorRespSchema, SerializationFormat ErrorRespFormat, string? HeaderInfoName, - TDDataSchema? HeaderInfoSchema, + ValueTracker? HeaderInfoSchema, SerializationFormat HeaderInfoFormat, string? HeaderCodeName, - TDDataSchema? HeaderCodeSchema, + ValueTracker? HeaderCodeSchema, string? ServiceGroupId, string? TopicPattern) { - public static FormInfo? CreateFromForm(TDForm? form, Dictionary? schemaDefinitions) + public static FormInfo? CreateFromForm(ErrorReporter errorReporter, TDForm? form, Dictionary>? schemaDefinitions) { if (form == null) { return null; } - SerializationFormat format = ThingSupport.ContentTypeToFormat(form.ContentType); + SerializationFormat format = ThingSupport.ContentTypeToFormat(errorReporter, form.ContentType); - bool hasErrorResponse = form.AdditionalResponses?.Any(r => !r.Success) ?? false; + bool hasErrorResponse = form.AdditionalResponses?.Elements?.Any(r => !(r.Value.Success?.Value.Value ?? false)) ?? false; - TDSchemaReference? errorSchemaRef = form.AdditionalResponses?.FirstOrDefault(r => !r.Success && r.Schema != null); - var (errorRespName, errorRespSchema, errorRespFormat) = GetSchemaAndFormat(errorSchemaRef, form, schemaDefinitions); + ValueTracker? errorSchemaRef = form.AdditionalResponses?.Elements?.FirstOrDefault(r => !(r.Value.Success?.Value.Value ?? false) && r.Value.Schema != null); + var (errorRespName, errorRespSchema, errorRespFormat) = GetSchemaAndFormat(errorReporter, errorSchemaRef?.Value, form, schemaDefinitions); - TDSchemaReference? headerSchemaRef = form.HeaderInfo?.FirstOrDefault(r => r.Schema != null); - var (headerInfoName, headerInfoSchema, headerInfoFormat) = GetSchemaAndFormat(headerSchemaRef, form, schemaDefinitions); + ValueTracker? headerSchemaRef = form.HeaderInfo?.Elements?.FirstOrDefault(r => r.Value.Schema != null); + var (headerInfoName, headerInfoSchema, headerInfoFormat) = GetSchemaAndFormat(errorReporter, headerSchemaRef?.Value, form, schemaDefinitions); - TDDataSchema? headerCodeSchema = GetSchema(form.HeaderCode, schemaDefinitions); + ValueTracker? headerCodeSchema = GetSchema(form.HeaderCode?.Value?.Value, schemaDefinitions); return new FormInfo( format, @@ -46,26 +47,26 @@ public record FormInfo( headerInfoName, headerInfoSchema, headerInfoFormat, - form.HeaderCode, + form.HeaderCode?.Value?.Value, headerCodeSchema, - form.ServiceGroupId, - form.Topic); + form.ServiceGroupId?.Value?.Value, + form.Topic?.Value?.Value); } - private static (string?, TDDataSchema?, SerializationFormat) GetSchemaAndFormat(TDSchemaReference? schemaRef, TDForm? form, Dictionary? schemaDefinitions) + private static (string?, ValueTracker?, SerializationFormat) GetSchemaAndFormat(ErrorReporter errorReporter, TDSchemaReference? schemaRef, TDForm? form, Dictionary>? schemaDefinitions) { - string? schemaName = schemaRef?.Schema; - SerializationFormat schemaFormat = ThingSupport.ContentTypeToFormat(schemaRef?.ContentType ?? form?.ContentType); + string? schemaName = schemaRef?.Schema?.Value?.Value; + SerializationFormat schemaFormat = ThingSupport.ContentTypeToFormat(errorReporter, schemaRef?.ContentType ?? form?.ContentType); - TDDataSchema? schema = null; + ValueTracker? schema = null; schemaDefinitions?.TryGetValue(schemaName ?? string.Empty, out schema); return (schemaName, schema, schemaFormat); } - private static TDDataSchema? GetSchema(string? schemaName, Dictionary? schemaDefinitions) + private static ValueTracker? GetSchema(string? schemaName, Dictionary>? schemaDefinitions) { - return schemaDefinitions?.TryGetValue(schemaName ?? string.Empty, out TDDataSchema? schema) ?? false ? schema : null; + return schemaDefinitions?.TryGetValue(schemaName ?? string.Empty, out ValueTracker? schema) ?? false ? schema : null; } } } diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ParsedThing.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ParsedThing.cs index 6d63d55bfe..90034641fc 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ParsedThing.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ParsedThing.cs @@ -2,5 +2,5 @@ { using Azure.Iot.Operations.TDParser.Model; - public record ParsedThing(TDThing Thing, string DirectoryName, SchemaNamer SchemaNamer); + public record ParsedThing(TDThing Thing, string FileName, string DirectoryName, SchemaNamer SchemaNamer, ErrorReporter ErrorReporter); } diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNamer.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNamer.cs index 8f288d28d8..f0e23e5906 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNamer.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNamer.cs @@ -1,7 +1,6 @@ namespace Azure.Iot.Operations.CodeGeneration { using System.Diagnostics.CodeAnalysis; - using System.IO; using System.Linq; using System.Text.Json; using Azure.Iot.Operations.TDParser.Model; @@ -11,7 +10,7 @@ public class SchemaNamer private SchemaNameInfo? schemaNameInfo; private bool suppressTitles; - public SchemaNamer(string? schemaNameInfoText) + public SchemaNamer(string? schemaNameInfoText = null) { this.schemaNameInfo = schemaNameInfoText != null ? JsonSerializer.Deserialize(schemaNameInfoText) : null; this.suppressTitles = this.schemaNameInfo?.SuppressTitles ?? false; @@ -100,9 +99,9 @@ public SchemaNamer(string? schemaNameInfoText) private string Expand(TDDataSchema? dataSchema, FuncInfo? funcInfo, string defaultOut, params string[] args) { - if (!this.suppressTitles && dataSchema?.Ref == null && dataSchema?.Title != null) + if (!this.suppressTitles && dataSchema?.Ref == null && dataSchema?.Title?.Value != null) { - return dataSchema.Title; + return dataSchema.Title.Value.Value; } if (funcInfo == null || funcInfo.Output == null || funcInfo.Input == null || funcInfo.Input.Length < args.Length) diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/TargetLanguage.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/TargetLanguage.cs index 3bb15ed6b8..b244acc13b 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/TargetLanguage.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/TargetLanguage.cs @@ -3,6 +3,7 @@ namespace Azure.Iot.Operations.CodeGeneration public enum TargetLanguage { CSharp, - Rust + Rust, + None, } } diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingSupport.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingSupport.cs index 79c142d793..884bc79469 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingSupport.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingSupport.cs @@ -2,40 +2,44 @@ { using System.Collections.Generic; using System.Linq; + using Azure.Iot.Operations.TDParser; using Azure.Iot.Operations.TDParser.Model; public static class ThingSupport { - public static List GetSerializationFormats(List things) + public static List GetSerializationFormats(ErrorReporter errorReporter, List things) { HashSet formats = new(); foreach (TDThing thing in things) { - AddFormatsFromLinks(thing.Links, formats); - AddFormatsFromForms(thing.Forms, formats); + AddFormatsFromLinks(errorReporter, thing.Links?.Elements, formats); + AddFormatsFromForms(errorReporter, thing.Forms?.Elements, formats); - if (thing.Actions != null) + foreach (KeyValuePair> actionKvp in thing.Actions?.Entries ?? new()) { - foreach (TDAction action in thing.Actions.Values) + TDAction? action = actionKvp.Value.Value; + if (action != null) { - AddFormatsFromForms(action.Forms, formats); + AddFormatsFromForms(errorReporter, action.Forms?.Elements, formats); } } - if (thing.Properties != null) + foreach (KeyValuePair> propKvp in thing.Properties?.Entries ?? new()) { - foreach (TDProperty property in thing.Properties.Values) + TDProperty? property = propKvp.Value.Value; + if (property != null) { - AddFormatsFromForms(property.Forms, formats); + AddFormatsFromForms(errorReporter, property.Forms?.Elements, formats); } } - if (thing.Events != null) + foreach (KeyValuePair> eventKvp in thing.Events?.Entries ?? new()) { - foreach (TDEvent evt in thing.Events.Values) + TDEvent? eachEvent = eventKvp.Value.Value; + if (eachEvent != null) { - AddFormatsFromForms(evt.Forms, formats); + AddFormatsFromForms(errorReporter, eachEvent.Forms?.Elements, formats); } } } @@ -43,57 +47,66 @@ public static List GetSerializationFormats(List th return formats.ToList(); } - public static SerializationFormat ContentTypeToFormat(string? contentType) + public static SerializationFormat ContentTypeToFormat(ErrorReporter errorReporter, ValueTracker? contentType) { - return contentType switch + if (contentType?.Value == null) { - TDValues.ContentTypeJson => SerializationFormat.Json, - _ => SerializationFormat.None, - }; + return SerializationFormat.None; + } + + switch (contentType.Value.Value) + { + case TDValues.ContentTypeJson: + return SerializationFormat.Json; + } + + errorReporter.ReportError($"Unsupported content type '{contentType.Value.Value}'.", contentType.TokenIndex); + + return SerializationFormat.None; } - private static void AddFormatsFromForms(IEnumerable? forms, HashSet formats) + private static void AddFormatsFromForms(ErrorReporter errorReporter, IEnumerable>? forms, HashSet formats) { if (forms == null) { return; } - foreach (TDForm form in forms) + foreach (ValueTracker form in forms) { - AddFormatFromContentType(form.ContentType, formats); - AddFormatsFromSchemaReferences(form.AdditionalResponses, formats); - AddFormatsFromSchemaReferences(form.HeaderInfo, formats); + AddFormatFromContentType(errorReporter, form.Value.ContentType, formats); + AddFormatsFromSchemaReferences(errorReporter, form.Value.AdditionalResponses?.Elements, formats); + AddFormatsFromSchemaReferences(errorReporter, form.Value.HeaderInfo?.Elements, formats); } } - private static void AddFormatsFromLinks(IEnumerable? links, HashSet formats) + private static void AddFormatsFromLinks(ErrorReporter errorReporter, IEnumerable>? links, HashSet formats) { if (links != null) { - foreach (TDLink link in links) + foreach (ValueTracker link in links) { - AddFormatFromContentType(link.ContentType, formats); + AddFormatFromContentType(errorReporter, link.Value.ContentType, formats); } } } - private static void AddFormatsFromSchemaReferences(IEnumerable? schemaRefs, HashSet formats) + private static void AddFormatsFromSchemaReferences(ErrorReporter errorReporter, IEnumerable>? schemaRefs, HashSet formats) { if (schemaRefs != null) { - foreach (TDSchemaReference resp in schemaRefs) + foreach (ValueTracker resp in schemaRefs) { - AddFormatFromContentType(resp.ContentType, formats); + AddFormatFromContentType(errorReporter, resp.Value.ContentType, formats); } } } - private static void AddFormatFromContentType(string? contentType, HashSet formats) + private static void AddFormatFromContentType(ErrorReporter errorReporter, ValueTracker? contentType, HashSet formats) { - if (contentType != null) + if (contentType?.Value != null) { - formats.Add(ContentTypeToFormat(contentType)); + formats.Add(ContentTypeToFormat(errorReporter, contentType)); } } } diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/TypeNamer.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/TypeNamer.cs index 333a6d9e4b..bb5d2dbece 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/TypeNamer.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/TypeNamer.cs @@ -8,21 +8,22 @@ public class TypeNamer { private TypeNameInfo? typeNameInfo; - private bool suppressTitles; private Dictionary nameRules; private bool capitalizeCaptures; + public bool SuppressTitles { get; } + public TypeNamer(string? typeNameInfoText) { this.typeNameInfo = typeNameInfoText != null ? JsonSerializer.Deserialize(typeNameInfoText) : null; - this.suppressTitles = this.typeNameInfo?.SuppressTitles ?? false; + this.SuppressTitles = this.typeNameInfo?.SuppressTitles ?? false; this.nameRules = this.typeNameInfo?.NameRules ?? new(); this.capitalizeCaptures = this.typeNameInfo?.CapitalizeCaptures ?? false; } public string GenerateTypeName(string schemaName, string? keyName, string? title) { - if (title != null && !this.suppressTitles) + if (title != null && !this.SuppressTitles) { return title; } diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs index 4b0b0b0a0a..9f2c2b144d 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs @@ -3,30 +3,37 @@ using System.Collections.Generic; using System.Linq; using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser; using Azure.Iot.Operations.TDParser.Model; internal static class ActionEnvoyGenerator { - internal static List GenerateActionEnvoys(TDThing tdThing, SchemaNamer schemaNamer, CodeName serviceName, EnvoyTransformFactory envoyFactory, Dictionary transforms, Dictionary errorSpecs, HashSet typesToSerialize) + internal static List GenerateActionEnvoys(ErrorReporter errorReporter, TDThing tdThing, SchemaNamer schemaNamer, CodeName serviceName, EnvoyTransformFactory envoyFactory, Dictionary transforms, Dictionary errorSpecs, HashSet typesToSerialize) { List actionSpecs = new(); - foreach (KeyValuePair actionKvp in tdThing.Actions ?? new()) + foreach (KeyValuePair> actionKvp in tdThing.Actions?.Entries ?? new()) { - FormInfo? actionForm = FormInfo.CreateFromForm(actionKvp.Value.Forms?.FirstOrDefault(f => (f.Op?.Values.Contains(TDValues.OpInvokeAction) ?? false) || (f.Op?.Values.Contains(TDValues.OpQueryAction) ?? false)), tdThing.SchemaDefinitions); - actionForm ??= FormInfo.CreateFromForm(actionKvp.Value.Forms?.FirstOrDefault(f => f.Op == null), tdThing.SchemaDefinitions); + TDAction? action = actionKvp.Value.Value; + if (action == null) + { + continue; + } + + FormInfo? actionForm = FormInfo.CreateFromForm(errorReporter, action.Forms?.Elements?.FirstOrDefault(f => (f.Value.Op?.Elements?.Any(e => e.Value.Value == TDValues.OpInvokeAction) ?? false) || (f.Value.Op?.Elements?.Any(e => e.Value.Value == TDValues.OpQueryAction) ?? false))?.Value, tdThing.SchemaDefinitions?.Entries); + actionForm ??= FormInfo.CreateFromForm(errorReporter, action.Forms?.Elements?.FirstOrDefault(f => f.Value.Op == null)?.Value, tdThing.SchemaDefinitions?.Entries); if (actionForm?.TopicPattern != null && actionForm.Format != SerializationFormat.None) { - string? inputSchemaType = actionKvp.Value.Input != null ? schemaNamer.GetActionInSchema(actionKvp.Value.Input, actionKvp.Key) : null; - string? outArgsType = actionKvp.Value.Output != null ? schemaNamer.GetActionOutSchema(actionKvp.Value.Output, actionKvp.Key) : null; + string? inputSchemaType = action.Input != null ? schemaNamer.GetActionInSchema(action.Input?.Value, actionKvp.Key) : null; + string? outArgsType = action.Output != null ? schemaNamer.GetActionOutSchema(action.Output?.Value, actionKvp.Key) : null; string? outputSchemaType = actionForm.ErrorRespSchema != null ? schemaNamer.GetActionRespSchema(actionKvp.Key) : outArgsType; - string? errSchemaName = schemaNamer.ChooseTitleOrName(actionForm.ErrorRespSchema?.Title, actionForm.ErrorRespName); + string? errSchemaName = schemaNamer.ChooseTitleOrName(actionForm.ErrorRespSchema?.Value.Title?.Value?.Value, actionForm.ErrorRespName); - List normalResultNames = actionKvp.Value.Output?.Properties?.Keys?.ToList() ?? new(); - List normalRequiredNames = actionKvp.Value.Output?.Required?.ToList() ?? new(); - string? headerCodeSchema = schemaNamer.ChooseTitleOrName(actionForm.HeaderCodeSchema?.Title, actionForm.HeaderCodeName); - string? headerInfoSchema = schemaNamer.ChooseTitleOrName(actionForm.HeaderInfoSchema?.Title, actionForm.HeaderInfoName); + List normalResultNames = action.Output?.Value?.Properties?.Entries?.Keys?.ToList() ?? new(); + List> normalRequiredNames = action.Output?.Value?.Required?.Elements?.ToList() ?? new(); + string? headerCodeSchema = schemaNamer.ChooseTitleOrName(actionForm.HeaderCodeSchema?.Value.Title?.Value?.Value, actionForm.HeaderCodeName); + string? headerInfoSchema = schemaNamer.ChooseTitleOrName(actionForm.HeaderInfoSchema?.Value.Title?.Value?.Value, actionForm.HeaderInfoName); bool doesTargetExecutor = DoesTopicReferToExecutor(actionForm.TopicPattern); @@ -49,7 +56,7 @@ internal static List GenerateActionEnvoys(TDThing tdThing, SchemaNam foreach (IEnvoyTemplateTransform transform in envoyFactory.GetActionTransforms( schemaNamer, - tdThing.Id!, + tdThing.Id!.Value!.Value, serviceName, actionKvp.Key, inputSchemaType, @@ -57,7 +64,7 @@ internal static List GenerateActionEnvoys(TDThing tdThing, SchemaNam actionForm.Format, actionForm.ServiceGroupId, actionForm.TopicPattern, - actionKvp.Value.Idempotent, + action.Idempotent?.Value.Value ?? false, normalResultNames, normalRequiredNames, outArgsType, @@ -67,7 +74,7 @@ internal static List GenerateActionEnvoys(TDThing tdThing, SchemaNam headerCodeSchema, actionForm.HeaderInfoName, headerInfoSchema, - actionForm.HeaderCodeSchema?.Enum?.ToList(), + actionForm.HeaderCodeSchema?.Value.Enum?.Elements?.Select(e => e.Value.Value).ToList(), doesTargetExecutor)) { transforms[transform.FileName] = transform; @@ -94,13 +101,13 @@ internal static List GenerateActionEnvoys(TDThing tdThing, SchemaNam ErrorSpec errorSpec = new ErrorSpec( errSchemaName!, - actionForm.ErrorRespSchema.Description ?? "The action could not be completed", - actionForm.ErrorRespSchema.ErrorMessage, - actionForm.ErrorRespSchema.Required?.Contains(actionForm.ErrorRespSchema.ErrorMessage ?? string.Empty) ?? false, + actionForm.ErrorRespSchema.Value.Description?.Value.Value ?? "The action could not be completed", + actionForm.ErrorRespSchema.Value.ErrorMessage?.Value.Value, + actionForm.ErrorRespSchema.Value.Required?.Elements?.Any(e => e.Value.Value == (actionForm.ErrorRespSchema.Value.ErrorMessage?.Value?.Value ?? string.Empty)) ?? false, actionForm.HeaderCodeName, - schemaNamer.ChooseTitleOrName(actionForm.HeaderCodeSchema?.Title, actionForm.HeaderCodeName), + schemaNamer.ChooseTitleOrName(actionForm.HeaderCodeSchema?.Value.Title?.Value.Value, actionForm.HeaderCodeName), actionForm.HeaderInfoName, - schemaNamer.ChooseTitleOrName(actionForm.HeaderInfoSchema?.Title, actionForm.HeaderInfoName)); + schemaNamer.ChooseTitleOrName(actionForm.HeaderInfoSchema?.Value.Title?.Value.Value, actionForm.HeaderInfoName)); errorSpecs[errSchemaName!] = errorSpec; } diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionSpec.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionSpec.cs index a1b1ab3c9c..8afb250dd3 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionSpec.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionSpec.cs @@ -2,6 +2,7 @@ { using System.Collections.Generic; using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser; public record ActionSpec( CodeName Name, @@ -29,7 +30,7 @@ public ActionSpec( string? outputSchemaType, SerializationFormat format, List normalResultNames, - List normalRequiredNames, + List> normalRequiredNames, string? normalResultSchema, string? errorResultName, string? errorResultSchema, @@ -46,7 +47,7 @@ public ActionSpec( outputSchemaType != null ? new CodeName(outputSchemaType) : null, format.GetEmptyTypeName(), normalResultNames.ConvertAll(name => new CodeName(name)), - normalRequiredNames.ConvertAll(name => new CodeName(name)), + normalRequiredNames.ConvertAll(name => new CodeName(name.Value.Value)), normalResultSchema != null ? new CodeName(normalResultSchema) : null, errorResultName != null ? new CodeName(errorResultName) : null, errorResultSchema != null ? new CodeName(errorResultSchema) : null, diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs index ce895ce25b..4e7d390d5a 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs @@ -2,8 +2,8 @@ { using System.Collections.Generic; using System.Linq; - using System.Text.Json; using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser; using Azure.Iot.Operations.TDParser.Model; public static class EnvoyGenerator @@ -32,11 +32,16 @@ public static List GenerateEnvoys( foreach (ParsedThing parsedThing in parsedThings) { - CodeName serviceName = new CodeName(parsedThing.Thing.Title ?? genNamespace); + if (parsedThing.Thing.Title == null) + { + throw new System.InvalidOperationException($"Thing defined in file '{parsedThing.FileName}' is missing a root-level 'title' property."); + } + + CodeName serviceName = new CodeName(parsedThing.Thing.Title?.Value.Value ?? genNamespace); - List actionSpecs = ActionEnvoyGenerator.GenerateActionEnvoys(parsedThing.Thing, parsedThing.SchemaNamer, serviceName, envoyFactory, transforms, errorSpecs, typesToSerialize); - List eventSpecs = EventEnvoyGenerator.GenerateEventEnvoys(parsedThing.Thing, parsedThing.SchemaNamer, serviceName, envoyFactory, transforms, typesToSerialize); - List propSpecs = PropertyEnvoyGenerator.GeneratePropertyEnvoys(parsedThing.Thing, parsedThing.SchemaNamer, serviceName, envoyFactory, transforms, errorSpecs, aggErrorSpecs, typesToSerialize); + List actionSpecs = ActionEnvoyGenerator.GenerateActionEnvoys(parsedThing.ErrorReporter, parsedThing.Thing, parsedThing.SchemaNamer, serviceName, envoyFactory, transforms, errorSpecs, typesToSerialize); + List eventSpecs = EventEnvoyGenerator.GenerateEventEnvoys(parsedThing.ErrorReporter, parsedThing.Thing, parsedThing.SchemaNamer, serviceName, envoyFactory, transforms, typesToSerialize); + List propSpecs = PropertyEnvoyGenerator.GeneratePropertyEnvoys(parsedThing.ErrorReporter, parsedThing.Thing, parsedThing.SchemaNamer, serviceName, envoyFactory, transforms, errorSpecs, aggErrorSpecs, typesToSerialize); GenerateServiceEnvoys(parsedThing.SchemaNamer, serviceName, actionSpecs, propSpecs, eventSpecs, envoyFactory, transforms); CollectNamedConstants(parsedThing.Thing, parsedThing.SchemaNamer, schemaConstants); } @@ -68,7 +73,7 @@ public static List GenerateEnvoys( private static void CollectNamedConstants(TDThing tdThing, SchemaNamer schemaNamer, Dictionary> schemaConstants) { - IEnumerable>? constDefs = tdThing.SchemaDefinitions?.Where(d => d.Value.Const != null); + IEnumerable>>? constDefs = tdThing.SchemaDefinitions?.Entries?.Where(d => d.Value.Value.Const?.Value != null); if (constDefs?.Any() ?? false) { @@ -81,20 +86,10 @@ private static void CollectNamedConstants(TDThing tdThing, SchemaNamer schemaNam foreach (var constDef in constDefs) { - if (constDef.Value.Type == TDValues.TypeString || constDef.Value.Type == TDValues.TypeNumber || constDef.Value.Type == TDValues.TypeInteger || constDef.Value.Type == TDValues.TypeBoolean) + if (constDef.Value.Value.Type?.Value.Value == TDValues.TypeString || constDef.Value.Value.Type?.Value.Value == TDValues.TypeNumber || constDef.Value.Value.Type?.Value.Value == TDValues.TypeInteger || constDef.Value.Value.Type?.Value.Value == TDValues.TypeBoolean) { - JsonElement constElt = (JsonElement)constDef.Value.Const!; - object constValue = constDef.Value.Type switch - { - TDValues.TypeString => constElt.GetString()!, - TDValues.TypeNumber => constElt.GetDouble(), - TDValues.TypeInteger => constElt.GetInt32(), - TDValues.TypeBoolean => constElt.GetBoolean(), - _ => null!, - }; - - string constName = schemaNamer.ChooseTitleOrName(constDef.Value.Title, constDef.Key); - namedConstants[constName] = new TypedConstant(new CodeName(constName), constDef.Value.Type, constValue, constDef.Value.Description); + string constName = schemaNamer.ChooseTitleOrName(constDef.Value.Value.Title?.Value.Value, constDef.Key); + namedConstants[constName] = new TypedConstant(new CodeName(constName), constDef.Value.Value.Type.Value.Value, constDef.Value.Value.Const!.Value!.Value, constDef.Value.Value.Description?.Value.Value); } } } diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyTransformFactory.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyTransformFactory.cs index e25019fa94..610f23ea7c 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyTransformFactory.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyTransformFactory.cs @@ -7,6 +7,7 @@ namespace Azure.Iot.Operations.EnvoyGenerator using System.Reflection; using System.Text.RegularExpressions; using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser; internal class EnvoyTransformFactory { @@ -63,7 +64,7 @@ internal IEnumerable GetActionTransforms( string topicPattern, bool idempotent, List normalResultFields, - List normalRequiredFields, + List> normalRequiredFields, string? normalResultSchema, string? errorResultName, string? errorResultSchema, @@ -81,7 +82,7 @@ internal IEnumerable GetActionTransforms( ITypeName? outputSchema = outputSchemaType != null ? new CodeName(outputSchemaType) : null; List normalFields = normalResultFields.Select(f => new CodeName(f)).ToList(); - List requiredFields = normalRequiredFields.Select(f => new CodeName(f)).ToList(); + List requiredFields = normalRequiredFields.Select(f => new CodeName(f.Value.Value)).ToList(); CodeName? normalSchema = normalResultSchema != null ? new CodeName(normalResultSchema) : null; CodeName? errorName = errorResultName != null ? new CodeName(errorResultName) : null; CodeName? errorSchema = errorResultSchema != null ? new CodeName(errorResultSchema) : null; diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EventEnvoyGenerator.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EventEnvoyGenerator.cs index 54f7bcb554..0bde87169f 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EventEnvoyGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EventEnvoyGenerator.cs @@ -3,37 +3,39 @@ using System.Collections.Generic; using System.Linq; using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser; using Azure.Iot.Operations.TDParser.Model; internal static class EventEnvoyGenerator { - internal static List GenerateEventEnvoys(TDThing tdThing, SchemaNamer schemaNamer, CodeName serviceName, EnvoyTransformFactory envoyFactory, Dictionary transforms, HashSet typesToSerialize) + internal static List GenerateEventEnvoys(ErrorReporter errorReporter, TDThing tdThing, SchemaNamer schemaNamer, CodeName serviceName, EnvoyTransformFactory envoyFactory, Dictionary transforms, HashSet typesToSerialize) { List eventSpecs = new(); - foreach (KeyValuePair eventKvp in tdThing.Events ?? new()) + foreach (KeyValuePair> eventKvp in tdThing.Events?.Entries ?? new()) { - FormInfo? subEventForm = FormInfo.CreateFromForm(eventKvp.Value.Forms?.FirstOrDefault(f => f.Op?.Values.Contains(TDValues.OpSubEvent) ?? false), tdThing.SchemaDefinitions); - subEventForm ??= FormInfo.CreateFromForm(eventKvp.Value.Forms?.FirstOrDefault(f => f.Op == null), tdThing.SchemaDefinitions); + TDEvent eachEvent = eventKvp.Value.Value; + FormInfo? subEventForm = FormInfo.CreateFromForm(errorReporter, eachEvent.Forms?.Elements?.FirstOrDefault(f => f.Value.Op?.Elements?.Any(e => e.Value.Value == TDValues.OpSubEvent) ?? false)?.Value, tdThing.SchemaDefinitions?.Entries); + subEventForm ??= FormInfo.CreateFromForm(errorReporter, eachEvent.Forms?.Elements?.FirstOrDefault(f => f.Value.Op == null)?.Value, tdThing.SchemaDefinitions?.Entries); if (subEventForm != null && subEventForm.Format != SerializationFormat.None && subEventForm.TopicPattern != null) { string schemaType = schemaNamer.GetEventSchema(eventKvp.Key); typesToSerialize.Add(schemaType); eventSpecs.Add(new EventSpec(schemaNamer, eventKvp.Key, schemaType)); - foreach (IEnvoyTemplateTransform transform in envoyFactory.GetEventTransforms(schemaNamer, tdThing.Id!, serviceName, eventKvp.Key, schemaType, subEventForm.Format, subEventForm.ServiceGroupId, subEventForm.TopicPattern)) + foreach (IEnvoyTemplateTransform transform in envoyFactory.GetEventTransforms(schemaNamer, tdThing.Id!.Value!.Value, serviceName, eventKvp.Key, schemaType, subEventForm.Format, subEventForm.ServiceGroupId, subEventForm.TopicPattern)) { transforms[transform.FileName] = transform; } } } - FormInfo? subAllEventsForm = FormInfo.CreateFromForm(tdThing.Forms?.FirstOrDefault(f => f.Op?.Values.Contains(TDValues.OpSubAllEvents) ?? false), tdThing.SchemaDefinitions); + FormInfo? subAllEventsForm = FormInfo.CreateFromForm(errorReporter, tdThing.Forms?.Elements?.FirstOrDefault(f => f.Value.Op?.Elements?.Any(e => e.Value.Value == TDValues.OpSubAllEvents) ?? false)?.Value, tdThing.SchemaDefinitions?.Entries); if (subAllEventsForm != null && subAllEventsForm.Format != SerializationFormat.None && subAllEventsForm.TopicPattern != null) { typesToSerialize.Add(schemaNamer.AggregateEventSchema); eventSpecs.Add(new EventSpec(schemaNamer, schemaNamer.AggregateEventName, schemaNamer.AggregateEventSchema)); - foreach (IEnvoyTemplateTransform transform in envoyFactory.GetEventTransforms(schemaNamer, tdThing.Id!, serviceName, schemaNamer.AggregateEventName, schemaNamer.AggregateEventSchema, subAllEventsForm.Format, subAllEventsForm.ServiceGroupId, subAllEventsForm.TopicPattern)) + foreach (IEnvoyTemplateTransform transform in envoyFactory.GetEventTransforms(schemaNamer, tdThing.Id!.Value!.Value, serviceName, schemaNamer.AggregateEventName, schemaNamer.AggregateEventSchema, subAllEventsForm.Format, subAllEventsForm.ServiceGroupId, subAllEventsForm.TopicPattern)) { transforms[transform.FileName] = transform; } diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/PropertyEnvoyGenerator.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/PropertyEnvoyGenerator.cs index 189de16840..4ede35a54a 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/PropertyEnvoyGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/PropertyEnvoyGenerator.cs @@ -3,21 +3,28 @@ using System.Collections.Generic; using System.Linq; using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser; using Azure.Iot.Operations.TDParser.Model; internal static class PropertyEnvoyGenerator { - internal static List GeneratePropertyEnvoys(TDThing tdThing, SchemaNamer schemaNamer, CodeName serviceName, EnvoyTransformFactory envoyFactory, Dictionary transforms, Dictionary errorSpecs, Dictionary aggErrorSpecs, HashSet typesToSerialize) + internal static List GeneratePropertyEnvoys(ErrorReporter errorReporter, TDThing tdThing, SchemaNamer schemaNamer, CodeName serviceName, EnvoyTransformFactory envoyFactory, Dictionary transforms, Dictionary errorSpecs, Dictionary aggErrorSpecs, HashSet typesToSerialize) { List propertySpecs = new(); Dictionary readInnerErrors = new(); Dictionary writeInnerErrors = new(); - foreach (KeyValuePair propKvp in tdThing.Properties ?? new()) + foreach (KeyValuePair> propKvp in tdThing.Properties?.Entries ?? new()) { - FormInfo? readPropForm = FormInfo.CreateFromForm(propKvp.Value.Forms?.FirstOrDefault(f => f.Op?.Values.Contains(TDValues.OpReadProp) ?? false), tdThing.SchemaDefinitions); - FormInfo? writePropForm = FormInfo.CreateFromForm(propKvp.Value.Forms?.FirstOrDefault(f => f.Op?.Values.Contains(TDValues.OpWriteProp) ?? false), tdThing.SchemaDefinitions); - FormInfo? noOpForm = FormInfo.CreateFromForm(propKvp.Value.Forms?.FirstOrDefault(f => f.Op == null), tdThing.SchemaDefinitions); + TDProperty? property = propKvp.Value.Value; + if (property == null) + { + continue; + } + + FormInfo? readPropForm = FormInfo.CreateFromForm(errorReporter, property.Forms?.Elements?.FirstOrDefault(f => f.Value.Op?.Elements?.Any(e => e.Value.Value == TDValues.OpReadProp) ?? false)?.Value, tdThing.SchemaDefinitions?.Entries); + FormInfo? writePropForm = FormInfo.CreateFromForm(errorReporter, property.Forms?.Elements?.FirstOrDefault(f => f.Value.Op?.Elements?.Any(e => e.Value.Value == TDValues.OpWriteProp) ?? false)?.Value, tdThing.SchemaDefinitions?.Entries); + FormInfo? noOpForm = FormInfo.CreateFromForm(errorReporter, property.Forms?.Elements?.FirstOrDefault(f => f.Value.Op == null)?.Value, tdThing.SchemaDefinitions?.Entries); readPropForm ??= noOpForm; writePropForm ??= noOpForm; @@ -34,11 +41,11 @@ internal static List GeneratePropertyEnvoys(TDThing tdThing, Schem string? writeReqSchema = null; string? writeRespSchema = null; string? writeErrorSchema = null; - if (!propKvp.Value.ReadOnly) + if (!property.ReadOnly?.Value.Value ?? false) { if (writePropForm?.TopicPattern != null && writePropForm.Format != SerializationFormat.None) { - writeReqSchema = propKvp.Value.Placeholder ? schemaNamer.GetWritablePropSchema(propKvp.Key) : propSchema; + writeReqSchema = (property.Placeholder?.Value.Value ?? false) ? schemaNamer.GetWritablePropSchema(propKvp.Key) : propSchema; typesToSerialize.Add(writeReqSchema); if (writePropForm.HasErrorResponse) @@ -85,7 +92,7 @@ internal static List GeneratePropertyEnvoys(TDThing tdThing, Schem foreach (IEnvoyTemplateTransform transform in envoyFactory.GetPropertyTransforms( schemaNamer, - tdThing.Id!, + tdThing.Id!.Value!.Value, serviceName, propKvp.Key, propSchema, @@ -111,7 +118,7 @@ internal static List GeneratePropertyEnvoys(TDThing tdThing, Schem } string? readAllRespSchema = null; - FormInfo? readAllPropsForm = FormInfo.CreateFromForm(tdThing.Forms?.FirstOrDefault(f => f.Op?.Values.Contains(TDValues.OpReadAllProps) ?? false), tdThing.SchemaDefinitions); + FormInfo? readAllPropsForm = FormInfo.CreateFromForm(errorReporter, tdThing.Forms?.Elements?.FirstOrDefault(f => f.Value.Op?.Elements?.Any(e => e.Value.Value == TDValues.OpReadAllProps) ?? false)?.Value, tdThing.SchemaDefinitions?.Entries); if (readAllPropsForm?.TopicPattern != null && readAllPropsForm.Format != SerializationFormat.None) { readAllRespSchema = readAllPropsForm.HasErrorResponse ? schemaNamer.AggregatePropReadRespSchema : schemaNamer.AggregatePropSchema; @@ -128,7 +135,7 @@ internal static List GeneratePropertyEnvoys(TDThing tdThing, Schem string? writeMultiReqSchema = null; string? writeMultiRespSchema = null; - FormInfo? writeMultPropsForm = FormInfo.CreateFromForm(tdThing.Forms?.FirstOrDefault(f => f.Op?.Values.Contains(TDValues.OpWriteMultProps) ?? false), tdThing.SchemaDefinitions); + FormInfo? writeMultPropsForm = FormInfo.CreateFromForm(errorReporter, tdThing.Forms?.Elements?.FirstOrDefault(f => f.Value.Op?.Elements?.Any(e => e.Value.Value == TDValues.OpWriteMultProps) ?? false)?.Value, tdThing.SchemaDefinitions?.Entries); if (writeMultPropsForm?.TopicPattern != null && writeMultPropsForm.Format != SerializationFormat.None) { writeMultiReqSchema = schemaNamer.AggregatePropWriteSchema; @@ -179,7 +186,7 @@ internal static List GeneratePropertyEnvoys(TDThing tdThing, Schem foreach (IEnvoyTemplateTransform transform in envoyFactory.GetPropertyTransforms( schemaNamer, - tdThing.Id!, + tdThing.Id!.Value!.Value, serviceName, schemaNamer.AggregatePropName, schemaNamer.AggregatePropSchema, @@ -213,13 +220,13 @@ internal static List GeneratePropertyEnvoys(TDThing tdThing, Schem return null; } - string errSchemaName = schemaNamer.ChooseTitleOrName(form.ErrorRespSchema.Title, form.ErrorRespName)!; + string errSchemaName = schemaNamer.ChooseTitleOrName(form.ErrorRespSchema.Value.Title?.Value.Value, form.ErrorRespName)!; typesToSerialize.Add(errSchemaName); errorSpecs[errSchemaName] = new ErrorSpec( errSchemaName, - form.ErrorRespSchema.Description ?? "The action could not be completed", - form.ErrorRespSchema.ErrorMessage, - form.ErrorRespSchema.Required?.Contains(form.ErrorRespSchema.ErrorMessage ?? string.Empty) ?? false); + form.ErrorRespSchema.Value.Description?.Value.Value ?? "The action could not be completed", + form.ErrorRespSchema.Value.ErrorMessage?.Value.Value, + form.ErrorRespSchema.Value.Required?.Elements?.Any(e => e.Value.Value == (form.ErrorRespSchema.Value.ErrorMessage?.Value.Value ?? string.Empty)) ?? false); innerErrors[propName] = errSchemaName; return errSchemaName; } diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs index 8421443887..56e099c72a 100644 --- a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs @@ -2,8 +2,10 @@ { using System; using System.Collections.Generic; + using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; + using System.Text; using System.Text.RegularExpressions; using Azure.Iot.Operations.CodeGeneration; using Azure.Iot.Operations.EnvoyGenerator; @@ -14,10 +16,14 @@ internal class CommandHandler { + private const ConsoleColor ErrorColor = ConsoleColor.Red; + private const ConsoleColor WarningColor = ConsoleColor.Yellow; + private static readonly Dictionary LanguageMap = new() { { "csharp", TargetLanguage.CSharp }, { "rust", TargetLanguage.Rust }, + { "none", TargetLanguage.None }, }; public static readonly string[] SupportedLanguages = LanguageMap.Keys.ToArray(); @@ -36,14 +42,36 @@ public static int GenerateCode(OptionContainer options) string projectName = LegalizeProjectName(options.OutputDir.Name); TargetLanguage targetLanguage = LanguageMap[options.Language.ToLowerInvariant()]; - List parsedThings = ParseThings(options.ThingFiles); + ErrorLog errorLog = new(options.WorkingDir.FullName); + + List parsedThings = ParseThings(options.ThingFiles, errorLog); + + if (errorLog.HasErrors) + { + DisplayErrors("Parsing", errorLog); + return 1; + } Dictionary> generatedSchemas = SchemaGenerator.GenerateSchemas(parsedThings, projectName, options.WorkingDir); + + errorLog.CheckForDuplicates(); + if (errorLog.HasErrors) + { + DisplayErrors("Schema generation", errorLog); + return 1; + } + foreach (List schemas in generatedSchemas.Values) { WriteItems(schemas, options.WorkingDir); } + if (targetLanguage == TargetLanguage.None) + { + Console.WriteLine("No code generation requested; exiting after schema generation."); + return 0; + } + FileInfo[] schemaFiles = options.SchemaFiles.SelectMany(fs => Directory.GetFiles(Path.GetDirectoryName(fs) ?? string.Empty, Path.GetFileName(fs)), (_, f) => new FileInfo(f)).ToArray(); if (schemaFiles.Length > 0) { @@ -57,9 +85,16 @@ public static int GenerateCode(OptionContainer options) foreach (KeyValuePair> schemaSet in generatedSchemas) { Dictionary schemaTextsByName = schemaSet.Value.ToDictionary(s => Path.GetFullPath(Path.Combine(options.WorkingDir.FullName, s.FolderPath, s.FileName)).Replace('\\', '/'), s => s.Content); - TypeGenerator typeGenerator = new TypeGenerator(schemaSet.Key, targetLanguage, typeNamer); + TypeGenerator typeGenerator = new TypeGenerator(schemaSet.Key, targetLanguage, typeNamer, errorLog); generatedTypes.AddRange(typeGenerator.GenerateTypes(schemaTextsByName, new CodeName(options.GenNamespace), projectName, options.OutputSourceSubdir)); } + + if (errorLog.HasErrors) + { + DisplayErrors("Type generation", errorLog); + return 1; + } + WriteItems(generatedTypes, options.OutputDir); List typeNames = generatedTypes.Select(gt => Path.GetFileNameWithoutExtension(gt.FileName)).ToList(); @@ -80,17 +115,21 @@ public static int GenerateCode(OptionContainer options) generateProject: !options.NoProj, defaultImpl: options.DefaultImpl); WriteItems(generatedEnvoys, options.OutputDir); + + DisplayWarnings(errorLog); } catch (Exception ex) { + Console.ForegroundColor = ErrorColor; Console.WriteLine($"Code generation failed with exception: {ex.Message}"); + Console.ResetColor(); return 1; } return 0; } - private static List ParseThings(FileInfo[] thingFiles) + private static List ParseThings(FileInfo[] thingFiles, ErrorLog errorLog) { List parsedThings = new(); @@ -101,22 +140,92 @@ private static List ParseThings(FileInfo[] thingFiles) using (StreamReader thingReader = thingFile.OpenText()) { string thingText = thingReader.ReadToEnd(); - List things = TDParser.ParseMultiple(thingText); + byte[] thingBytes = Encoding.UTF8.GetBytes(thingText); + ErrorReporter errorReporter = new ErrorReporter(errorLog, thingFile.FullName, thingBytes); - foreach (TDThing thing in things) + if (TryGetThings(errorReporter, thingBytes, out List? things)) { - string? schemaNamesFilename = thing.Links?.FirstOrDefault(l => l.Relation == TDValues.RelationSchemaNaming)?.Href; - string? schemaNameInfoText = schemaNamesFilename != null ? File.ReadAllText(Path.Combine(thingFile.DirectoryName!, schemaNamesFilename)) : null; - SchemaNamer schemaNamer = new SchemaNamer(schemaNameInfoText); + int thingCount = 0; + foreach (TDThing thing in things) + { + ValueTracker? schemaNamesFilename = thing.Links?.Elements?.FirstOrDefault(l => l.Value.Rel?.Value.Value == TDValues.RelationSchemaNaming)?.Value.Href; + if (TryGetSchemaNamer(errorReporter, thingFile.DirectoryName!, schemaNamesFilename, out SchemaNamer? schemaNamer)) + { + thingCount++; + parsedThings.Add(new ParsedThing(thing, thingFile.Name, thingFile.DirectoryName!, schemaNamer, errorReporter)); + } + } + + Console.WriteLine($" {thingCount} {(thingCount == 1 ? "TD" : "TDs")} parsed"); + } + } + } + + return parsedThings; + } + + private static bool TryGetSchemaNamer(ErrorReporter errorReporter, string folderPath, ValueTracker? namerFilename, [NotNullWhen(true)] out SchemaNamer? schemaNamer) + { + if (namerFilename == null) + { + schemaNamer = new SchemaNamer(); + return true; + } + + FileInfo namerFile = new FileInfo(Path.Combine(folderPath, namerFilename.Value.Value)); + if (!namerFile.Exists) + { + errorReporter.ReportError($"Could not find schema naming file '{namerFilename.Value.Value}'.", namerFilename.TokenIndex); + + schemaNamer = null; + return false; + } + + string schemaNameInfoText = namerFile.OpenText().ReadToEnd(); - parsedThings.Add(new ParsedThing(thing, thingFile.DirectoryName!, schemaNamer)); + try + { + schemaNamer = new SchemaNamer(schemaNameInfoText); + return true; + } + catch (Exception ex) + { + errorReporter.ReportError($"Failed to parse schema naming file '{namerFilename.Value.Value}': {ex.Message}", namerFilename.TokenIndex); + schemaNamer = null; + return false; + } + } + + private static bool TryGetThings(ErrorReporter errorReporter, byte[] thingBytes, [NotNullWhen(true)] out List? things) + { + try + { + things = TDParser.Parse(thingBytes); + } + catch (Exception ex) + { + errorReporter.ReportJsonException(ex); + things = null; + return false; + } + + foreach (TDThing thing in things) + { + foreach (ITraversable item in thing.Traverse()) + { + if (item is ISourceTracker tracker && tracker.DeserializingFailed) + { + errorReporter.ReportError($"TD deserialization error: {tracker.DeserializationError ?? string.Empty}.", tracker.TokenIndex); } - Console.WriteLine($" {things.Count} {(things.Count == 1 ? "TD" : "TDs")} parsed"); + if (item is ValueTracker dataSchema && dataSchema.Value.Ref != null) + { + errorReporter.RegisterReference(dataSchema.Value.Ref.TokenIndex, dataSchema.Value.Ref.Value.Value); + } } } - return parsedThings; + return true; } private static void WriteItems(List generatedItems, DirectoryInfo destDir) @@ -167,30 +276,39 @@ private static bool TryConfirmValidOptions(OptionContainer options) if (!anyThingFiles && !anySchemaFiles) { + Console.ForegroundColor = ErrorColor; Console.WriteLine($"No Thing Description files specified, and no schema files {(options.SchemaFiles.Length > 0 ? "found" : "specified")}."); Console.WriteLine("Use option --help for CLI usage and options."); + Console.ResetColor(); return false; } if (!SupportedLanguages.Contains(options.Language)) { - Console.WriteLine($"language \"{options.Language}\" not recognized. Language must be {string.Join(" or ", SupportedLanguages.Select(l => $"'{l}'"))}"); + string langCondition = string.IsNullOrEmpty(options.Language) ? "language not specified" : $"language '{options.Language}' not recognized"; + Console.ForegroundColor = ErrorColor; + Console.WriteLine($"{langCondition}; language must be {string.Join(" or ", SupportedLanguages.Select(l => $"'{l}'"))} (use 'none' for no code generation)"); + Console.ResetColor(); return false; } if (options.ClientOnly && options.ServerOnly) { + Console.ForegroundColor = ErrorColor; Console.WriteLine("options --clientOnly and --serverOnly are mutually exclusive"); + Console.ResetColor(); return false; } if (options.ThingFiles.Any(mf => !mf.Exists)) { + Console.ForegroundColor = ErrorColor; Console.WriteLine("All Thing Description files must exist. Non-existent files specified:"); foreach (FileInfo f in options.ThingFiles.Where(tf => !tf.Exists)) { Console.WriteLine($" {f.FullName}"); } + Console.ResetColor(); return false; } @@ -217,8 +335,52 @@ private static void WarnOnSuspiciousOption(string optionName, string? pathName) { if (pathName != null && pathName.StartsWith("--")) { + Console.ForegroundColor = WarningColor; Console.WriteLine($"Warning: {optionName} \"{pathName}\" looks like a flag. Did you forget to specify a value?"); + Console.ResetColor(); } } + + private static void DisplayErrors(string generationPhase, ErrorLog errorLog) + { + if (errorLog.Errors.Count > 0 || errorLog.FatalError != null) + { + Console.ForegroundColor = ErrorColor; + Console.WriteLine(); + Console.WriteLine($"{generationPhase} FAILED with the following errors:"); + if (errorLog.FatalError != null) + { + Console.WriteLine($" FATAL: {FormatErrorRecord(errorLog.FatalError)}"); + } + foreach (ErrorRecord error in errorLog.Errors.OrderBy(e => (e.Filename, e.LineNumber))) + { + Console.WriteLine($" ERROR: {FormatErrorRecord(error)}"); + } + Console.ResetColor(); + } + } + + + private static void DisplayWarnings(ErrorLog errorLog) + { + if (errorLog.Warnings.Count > 0) + { + Console.ForegroundColor = WarningColor; + Console.WriteLine(); + foreach (ErrorRecord error in errorLog.Warnings.OrderBy(e => (e.CrossRef, e.Filename, e.LineNumber))) + { + Console.WriteLine($" WARNING: {FormatErrorRecord(error)}"); + } + Console.ResetColor(); + } + } + + private static string FormatErrorRecord(ErrorRecord error) + { + string cfLineInfo = error.CfLineNumber > 0 ? $", cf. Line: {error.CfLineNumber}" : string.Empty; + string lineInfo = error.LineNumber > 0 ? $", Line: {error.LineNumber}" : string.Empty; + string sourceInfo = error.LineNumber >= 0 ? $" (File: {error.Filename}{lineInfo}{cfLineInfo})" : string.Empty; + return $"{error.Message}{sourceInfo}"; + } } } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs index 0050ce7e26..43fc1f80c8 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs @@ -3,23 +3,26 @@ using System.Collections.Generic; using System.Linq; using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser; using Azure.Iot.Operations.TDParser.Model; internal static class ActionSchemaGenerator { - internal static void GenerateActionSchemas(TDThing tdThing, string dirName, SchemaNamer schemaNamer, string projectName, Dictionary schemaSpecs, Dictionary> referencedSchemas) + internal static void GenerateActionSchemas(ErrorReporter errorReporter, TDThing tdThing, string dirName, SchemaNamer schemaNamer, string projectName, Dictionary schemaSpecs, Dictionary> referencedSchemas) { - if (tdThing.Actions != null) + foreach (KeyValuePair> actionKvp in tdThing.Actions?.Entries ?? new()) { - foreach (KeyValuePair propKvp in tdThing.Actions) + TDAction? action = actionKvp.Value.Value; + if (action != null) { ProcessAction( + errorReporter, schemaNamer, - propKvp.Key, - propKvp.Value, + actionKvp.Key, + action, projectName, dirName, - tdThing.SchemaDefinitions, + tdThing.SchemaDefinitions?.Entries, schemaSpecs, referencedSchemas); } @@ -27,42 +30,43 @@ internal static void GenerateActionSchemas(TDThing tdThing, string dirName, Sche } private static void ProcessAction( + ErrorReporter errorReporter, SchemaNamer schemaNamer, string actionName, TDAction tdAction, string projectName, string dirName, - Dictionary? schemaDefinitions, + Dictionary>? schemaDefinitions, Dictionary schemaSpecs, Dictionary> referencedSchemas) { - FormInfo? actionForm = FormInfo.CreateFromForm(tdAction.Forms?.FirstOrDefault(f => (f.Op?.Values.Contains(TDValues.OpInvokeAction) ?? false) || (f.Op?.Values.Contains(TDValues.OpQueryAction) ?? false)), schemaDefinitions); - actionForm ??= FormInfo.CreateFromForm(tdAction.Forms?.FirstOrDefault(f => f.Op == null), schemaDefinitions); + FormInfo? actionForm = FormInfo.CreateFromForm(errorReporter, tdAction.Forms?.Elements?.FirstOrDefault(f => (f.Value.Op?.Elements?.Any(e => e.Value.Value == TDValues.OpInvokeAction) ?? false) || (f.Value.Op?.Elements?.Any(e => e.Value.Value == TDValues.OpQueryAction) ?? false))?.Value, schemaDefinitions); + actionForm ??= FormInfo.CreateFromForm(errorReporter, tdAction.Forms?.Elements?.FirstOrDefault(f => f.Value.Op == null)?.Value, schemaDefinitions); if (actionForm?.TopicPattern != null) { - if (tdAction.Input?.Ref != null) + if (tdAction.Input?.Value?.Ref?.Value != null) { string inputSchemaName = schemaNamer.GetActionInSchema(null, actionName); - schemaSpecs[inputSchemaName] = new AliasSpec(null, tdAction.Input.Ref, actionForm.Format, inputSchemaName, dirName); + schemaSpecs[inputSchemaName] = new AliasSpec(null, tdAction.Input.Value.Ref.Value.Value, actionForm.Format, inputSchemaName, dirName, TokenIndex: -1); } - else if (tdAction.Input != null) + else if (tdAction.Input?.Value != null) { - string inputSchemaName = schemaNamer.GetActionInSchema(tdAction.Input, actionName); - ObjectSpec inputObjectSpec = ObjectSpec.CreateFromDataSchema(schemaNamer, tdAction.Input, actionForm.Format, inputSchemaName, tdAction.Input.Description ?? $"Input arguments for action '{actionName}'"); + string inputSchemaName = schemaNamer.GetActionInSchema(tdAction.Input.Value, actionName); + ObjectSpec inputObjectSpec = ObjectSpec.CreateFromDataSchema(errorReporter, schemaNamer, tdAction.Input, actionForm.Format, inputSchemaName, tdAction.Input.Value.Description?.Value.Value ?? $"Input arguments for action '{actionName}'"); schemaSpecs[inputSchemaName] = inputObjectSpec; } Dictionary responseFields = new(); - if (tdAction.Output?.Ref != null) + if (tdAction.Output?.Value?.Ref?.Value != null) { string outputSchemaName = schemaNamer.GetActionOutSchema(null, actionName); - schemaSpecs[outputSchemaName] = new AliasSpec(null, tdAction.Output.Ref, actionForm.Format, outputSchemaName, dirName); + schemaSpecs[outputSchemaName] = new AliasSpec(null, tdAction.Output.Value.Ref.Value.Value, actionForm.Format, outputSchemaName, dirName, TokenIndex: -1); } - else if (tdAction.Output != null) + else if (tdAction.Output?.Value != null) { - string outputSchemaName = schemaNamer.GetActionOutSchema(tdAction.Output, actionName); - ObjectSpec outputObjectSpec = ObjectSpec.CreateFromDataSchema(schemaNamer, tdAction.Output, actionForm.Format, outputSchemaName, tdAction.Output.Description ?? $"Output arguments for action '{actionName}'"); + string outputSchemaName = schemaNamer.GetActionOutSchema(tdAction.Output.Value, actionName); + ObjectSpec outputObjectSpec = ObjectSpec.CreateFromDataSchema(errorReporter, schemaNamer, tdAction.Output, actionForm.Format, outputSchemaName, tdAction.Output.Value.Description?.Value.Value ?? $"Output arguments for action '{actionName}'"); schemaSpecs[outputSchemaName] = outputObjectSpec; responseFields = outputObjectSpec.Fields.ToDictionary(f => f.Key, f => f.Value with { Require = false }); } @@ -70,7 +74,7 @@ private static void ProcessAction( if (actionForm?.ErrorRespSchema != null) { responseFields[schemaNamer.GetActionRespErrorField(actionName, actionForm.ErrorRespName!)] = new FieldSpec( - tdAction.Description ?? $"Read error for the '{actionName}' Action.", + tdAction.Description?.Value.Value ?? $"Read error for the '{actionName}' Action.", actionForm.ErrorRespSchema, Require: false, BackupSchemaName: actionForm.ErrorRespName!, @@ -78,10 +82,11 @@ private static void ProcessAction( string respSchemaName = schemaNamer.GetActionRespSchema(actionName); ObjectSpec propReadRespObjectSpec = new( - tdAction.Description ?? $"Response to a '{actionName}' Action.", + tdAction.Description?.Value.Value ?? $"Response to a '{actionName}' Action.", responseFields, actionForm.Format, - respSchemaName); + respSchemaName, + TokenIndex: -1); schemaSpecs[respSchemaName] = propReadRespObjectSpec; SchemaGenerationSupport.AddSchemaReference(actionForm.ErrorRespName!, actionForm.ErrorRespFormat, referencedSchemas); diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/AliasSpec.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/AliasSpec.cs index 82a475edd8..fa70724765 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/AliasSpec.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/AliasSpec.cs @@ -2,5 +2,5 @@ { using Azure.Iot.Operations.CodeGeneration; - internal record AliasSpec(string? Description, string Ref, SerializationFormat Format, string SchemaName, string Base) : SchemaSpec(Format); + internal record AliasSpec(string? Description, string Ref, SerializationFormat Format, string SchemaName, string Base, long TokenIndex) : SchemaSpec(Format, TokenIndex); } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EnumSpec.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EnumSpec.cs index adae27b153..cc8f729f5c 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EnumSpec.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EnumSpec.cs @@ -1,23 +1,30 @@ namespace Azure.Iot.Operations.SchemaGenerator { - using System; using System.Linq; using System.Collections.Generic; using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser; using Azure.Iot.Operations.TDParser.Model; - internal record EnumSpec(string? Description, List Values, SerializationFormat Format, string SchemaName) : SchemaSpec(Format) + internal record EnumSpec(string? Description, List Values, SerializationFormat Format, string SchemaName, long TokenIndex) : SchemaSpec(Format, TokenIndex) { - internal static EnumSpec CreateFromDataSchema(SchemaNamer schemaNamer, TDDataSchema dataSchema, SerializationFormat format, string backupName, string? defaultDescription = null) + internal static EnumSpec CreateFromDataSchema(ErrorReporter errorReporter, SchemaNamer schemaNamer, ValueTracker dataSchema, SerializationFormat format, string backupName, string? defaultDescription = null) { - string schemaName = schemaNamer.ApplyBackupSchemaName(dataSchema.Title, backupName); + string schemaName = schemaNamer.ApplyBackupSchemaName(dataSchema.Value.Title?.Value.Value, backupName); - if (dataSchema.Type != TDValues.TypeString || dataSchema.Enum == null) + if (dataSchema.Value.Type?.Value.Value != TDValues.TypeString) { - throw new Exception($"Cannot create enum spec from schema definition with type {dataSchema.Type ?? "unspecfied"} or with no enum values."); + errorReporter.ReportError($"Enum schema '{schemaName}' must have type 'string'.", dataSchema.TokenIndex); } + if (dataSchema.Value.Enum?.Elements == null) + { + errorReporter.ReportError($"Enum schema '{schemaName}' must have at least one defined value.", dataSchema.TokenIndex); + } + + string? description = dataSchema.Value.Description?.Value.Value ?? defaultDescription; + List values = dataSchema.Value.Enum?.Elements != null ? dataSchema.Value.Enum.Elements.Select(e => e.Value.Value).ToList() : new(); - return new EnumSpec(dataSchema.Description ?? defaultDescription, dataSchema.Enum.ToList(), format, schemaName); + return new EnumSpec(description, values, format, schemaName, dataSchema.TokenIndex); } } } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EventSchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EventSchemaGenerator.cs index f1edbbeab9..f1c752656e 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EventSchemaGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EventSchemaGenerator.cs @@ -3,27 +3,29 @@ using System.Collections.Generic; using System.Linq; using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser; using Azure.Iot.Operations.TDParser.Model; internal static class EventSchemaGenerator { - internal static void GenerateEventSchemas(TDThing tdThing, string dirName, SchemaNamer schemaNamer, string projectName, Dictionary schemaSpecs, Dictionary> referencedSchemas) + internal static void GenerateEventSchemas(ErrorReporter errorReporter, TDThing tdThing, string dirName, SchemaNamer schemaNamer, string projectName, Dictionary schemaSpecs, Dictionary> referencedSchemas) { - FormInfo? subAllEventsForm = FormInfo.CreateFromForm(tdThing.Forms?.FirstOrDefault(f => f.Op?.Values.Contains(TDValues.OpSubAllEvents) ?? false), tdThing.SchemaDefinitions); + FormInfo? subAllEventsForm = FormInfo.CreateFromForm(errorReporter, tdThing.Forms?.Elements?.FirstOrDefault(f => f.Value.Op?.Elements?.Any(e => e.Value.Value == TDValues.OpSubAllEvents) ?? false)?.Value, tdThing.SchemaDefinitions?.Entries); Dictionary valueFields = new(); - if (tdThing.Events != null) + if (tdThing.Events?.Entries != null) { - foreach (KeyValuePair eventKvp in tdThing.Events.Where(e => e.Value.Data != null)) + foreach (KeyValuePair> eventKvp in tdThing.Events.Entries.Where(e => e.Value.Value.Data != null)) { ProcessEvent( + errorReporter, schemaNamer, eventKvp.Key, - eventKvp.Value, + eventKvp.Value.Value!, projectName, dirName, - tdThing.SchemaDefinitions, + tdThing.SchemaDefinitions?.Entries, schemaSpecs, valueFields); } @@ -37,35 +39,37 @@ internal static void GenerateEventSchemas(TDThing tdThing, string dirName, Schem } private static void ProcessEvent( + ErrorReporter errorReporter, SchemaNamer schemaNamer, string eventName, TDEvent tdEvent, string projectName, string dirName, - Dictionary? schemaDefinitions, + Dictionary>? schemaDefinitions, Dictionary schemaSpecs, Dictionary valueFields) { - FormInfo? subEventForm = FormInfo.CreateFromForm(tdEvent.Forms?.FirstOrDefault(f => f.Op?.Values.Contains(TDValues.OpSubEvent) ?? false), schemaDefinitions); - subEventForm ??= FormInfo.CreateFromForm(tdEvent.Forms?.FirstOrDefault(f => f.Op == null), schemaDefinitions); + FormInfo? subEventForm = FormInfo.CreateFromForm(errorReporter, tdEvent.Forms?.Elements?.FirstOrDefault(f => f.Value.Op?.Elements?.Any(e => e.Value.Value == TDValues.OpSubEvent) ?? false)?.Value, schemaDefinitions); + subEventForm ??= FormInfo.CreateFromForm(errorReporter, tdEvent.Forms?.Elements?.FirstOrDefault(f => f.Value.Op == null)?.Value, schemaDefinitions); FieldSpec dataFieldSpec = new( - tdEvent.Description ?? $"The '{eventName}' Event data value.", + tdEvent.Description?.Value.Value ?? $"The '{eventName}' Event data value.", tdEvent.Data!, BackupSchemaName: schemaNamer.GetEventValueSchema(eventName), Require: true, Base: dirName, - Fragment: tdEvent.Placeholder); + Fragment: tdEvent.Placeholder?.Value.Value ?? false); valueFields[eventName] = dataFieldSpec with { Require = false }; if (subEventForm?.TopicPattern != null) { string eventSchemaName = schemaNamer.GetEventSchema(eventName); ObjectSpec eventObjectSpec = new( - tdEvent.Description ?? $"Container for the '{eventName}' Event data.", + tdEvent.Description?.Value.Value ?? $"Container for the '{eventName}' Event data.", new Dictionary { { eventName, dataFieldSpec } }, subEventForm.Format, - eventSchemaName); + eventSchemaName, + TokenIndex: -1); schemaSpecs[eventSchemaName] = eventObjectSpec; } } @@ -84,7 +88,8 @@ private static void GenerateCollectiveEventObject( $"Data values of Events.", valueFields, topLevelEventsForm.Format, - schemaNamer.AggregateEventSchema); + schemaNamer.AggregateEventSchema, + TokenIndex: -1); } } } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/FieldSpec.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/FieldSpec.cs index 34ca48b14f..33a10cc5b2 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/FieldSpec.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/FieldSpec.cs @@ -1,18 +1,22 @@ namespace Azure.Iot.Operations.SchemaGenerator { using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser; using Azure.Iot.Operations.TDParser.Model; - internal record FieldSpec(string Description, TDDataSchema Schema, bool Require, string BackupSchemaName, string Base, bool Fragment = false, bool ForceOption = false) + internal record FieldSpec(string Description, ValueTracker Schema, bool Require, string BackupSchemaName, string Base, bool Fragment = false, bool ForceOption = false) { internal static FieldSpec CreateFixed(string title, string description, string backupSchemaName) { return new FieldSpec( description, - new TDDataSchema + new ValueTracker { - Title = title, - Type = TDValues.TypeObject, + Value = new TDDataSchema + { + Title = new ValueTracker { Value = new StringHolder { Value = title } }, + Type = new ValueTracker { Value = new StringHolder { Value = TDValues.TypeObject } }, + }, }, Require: false, backupSchemaName, @@ -32,7 +36,7 @@ public virtual bool Equals(FieldSpec? other) } return Description == other.Description && - Schema.Equals(other.Schema) && + Schema == other.Schema && Require == other.Require && BackupSchemaName == other.BackupSchemaName && Fragment == other.Fragment; diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ObjectSpec.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ObjectSpec.cs index 51dbeaf6e7..db065d2387 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ObjectSpec.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ObjectSpec.cs @@ -1,29 +1,31 @@ namespace Azure.Iot.Operations.SchemaGenerator { - using System; using System.Linq; using System.Collections.Generic; using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser; using Azure.Iot.Operations.TDParser.Model; - internal record ObjectSpec(string? Description, Dictionary Fields, SerializationFormat Format, string SchemaName) : SchemaSpec(Format) + internal record ObjectSpec(string? Description, Dictionary Fields, SerializationFormat Format, string SchemaName, long TokenIndex) : SchemaSpec(Format, TokenIndex) { - internal static ObjectSpec CreateFromDataSchema(SchemaNamer schemaNamer, TDDataSchema dataSchema, SerializationFormat format, string backupName, string? defaultDescription = null) + internal static ObjectSpec CreateFromDataSchema(ErrorReporter errorReporter, SchemaNamer schemaNamer, ValueTracker dataSchema, SerializationFormat format, string backupName, string? defaultDescription = null) { - string schemaName = schemaNamer.ApplyBackupSchemaName(dataSchema.Title, backupName); + string schemaName = schemaNamer.ApplyBackupSchemaName(dataSchema.Value.Title?.Value.Value, backupName); - if (dataSchema.Type != TDValues.TypeObject) + if (dataSchema.Value.Type?.Value.Value != TDValues.TypeObject) { - throw new Exception($"Cannot create object spec from schema definition with type {dataSchema.Type ?? "unspecfied"}."); + errorReporter.ReportError($"Object schema '{schemaName}' must have type 'object'.", dataSchema.TokenIndex); } Dictionary fieldSpecs = new(); - foreach (KeyValuePair property in dataSchema.Properties ?? new Dictionary()) + foreach (KeyValuePair> property in dataSchema.Value.Properties?.Entries ?? new Dictionary>()) { - fieldSpecs[property.Key] = new FieldSpec(property.Value.Description ?? $"The '{property.Key}' Field.", property.Value, Require: dataSchema.Required?.Contains(property.Key) ?? false, schemaNamer.GetBackupSchemaName(schemaName, property.Key), string.Empty); + fieldSpecs[property.Key] = new FieldSpec(property.Value.Value.Description?.Value.Value ?? $"The '{property.Key}' Field.", property.Value, Require: dataSchema.Value.Required?.Elements?.Any(e => e.Value.Value == property.Key) ?? false, schemaNamer.GetBackupSchemaName(schemaName, property.Key), string.Empty); } - return new ObjectSpec(dataSchema.Description ?? defaultDescription, fieldSpecs, format, schemaName); + string? description = dataSchema.Value.Description?.Value.Value ?? defaultDescription; + + return new ObjectSpec(description, fieldSpecs, format, schemaName, dataSchema.TokenIndex); } internal static ObjectSpec CreateFixed(SchemaNamer schemaNamer, string description, Dictionary fieldSketches, SerializationFormat format, string schemaName) @@ -32,7 +34,8 @@ internal static ObjectSpec CreateFixed(SchemaNamer schemaNamer, string descripti description, fieldSketches.ToDictionary(f => f.Key, f => FieldSpec.CreateFixed(f.Value.Item1, f.Value.Item2, schemaNamer.GetBackupSchemaName(schemaName, f.Value.Item1))), format, - schemaName); + schemaName, + TokenIndex: -1); } } } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/PropertySchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/PropertySchemaGenerator.cs index aa1fcdef65..8999067f2b 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/PropertySchemaGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/PropertySchemaGenerator.cs @@ -3,14 +3,15 @@ using System.Collections.Generic; using System.Linq; using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser; using Azure.Iot.Operations.TDParser.Model; internal static class PropertySchemaGenerator { - internal static void GeneratePropertySchemas(TDThing tdThing, string dirName, SchemaNamer schemaNamer, string projectName, Dictionary schemaSpecs, Dictionary> referencedSchemas) + internal static void GeneratePropertySchemas(ErrorReporter errorReporter, TDThing tdThing, string dirName, SchemaNamer schemaNamer, string projectName, Dictionary schemaSpecs, Dictionary> referencedSchemas) { - FormInfo? readAllPropsForm = FormInfo.CreateFromForm(tdThing.Forms?.FirstOrDefault(f => f.Op?.Values.Contains(TDValues.OpReadAllProps) ?? false), tdThing.SchemaDefinitions); - FormInfo? writeMultPropsForm = FormInfo.CreateFromForm(tdThing.Forms?.FirstOrDefault(f => f.Op?.Values.Contains(TDValues.OpWriteMultProps) ?? false), tdThing.SchemaDefinitions); + FormInfo? readAllPropsForm = FormInfo.CreateFromForm(errorReporter, tdThing.Forms?.Elements?.FirstOrDefault(f => f.Value.Op?.Elements?.Any(e => e.Value.Value == TDValues.OpReadAllProps) ?? false)?.Value, tdThing.SchemaDefinitions?.Entries); + FormInfo? writeMultPropsForm = FormInfo.CreateFromForm(errorReporter, tdThing.Forms?.Elements?.FirstOrDefault(f => f.Value.Op?.Elements?.Any(e => e.Value.Value == TDValues.OpWriteMultProps) ?? false)?.Value, tdThing.SchemaDefinitions?.Entries); Dictionary readValueFields = new(); Dictionary writeValueFields = new(); @@ -19,17 +20,19 @@ internal static void GeneratePropertySchemas(TDThing tdThing, string dirName, Sc HashSet readErrorSchemaNames = new(); HashSet writeErrorSchemaNames = new(); - if (tdThing.Properties != null) + foreach (KeyValuePair> propKvp in tdThing.Properties?.Entries ?? new()) { - foreach (KeyValuePair propKvp in tdThing.Properties) + TDProperty? property = propKvp.Value.Value; + if (property != null) { ProcessProperty( + errorReporter, schemaNamer, propKvp.Key, - propKvp.Value, + property, projectName, dirName, - tdThing.SchemaDefinitions, + tdThing.SchemaDefinitions?.Entries, schemaSpecs, readValueFields, readErrorFields, @@ -38,12 +41,13 @@ internal static void GeneratePropertySchemas(TDThing tdThing, string dirName, Sc isRead: true); ProcessProperty( + errorReporter, schemaNamer, propKvp.Key, - propKvp.Value, + property, projectName, dirName, - tdThing.SchemaDefinitions, + tdThing.SchemaDefinitions?.Entries, schemaSpecs, writeValueFields, writeErrorFields, @@ -86,12 +90,13 @@ internal static void GeneratePropertySchemas(TDThing tdThing, string dirName, Sc } private static void ProcessProperty( + ErrorReporter errorReporter, SchemaNamer schemaNamer, string propName, TDProperty tdProperty, string projectName, string dirName, - Dictionary? schemaDefinitions, + Dictionary>? schemaDefinitions, Dictionary schemaSpecs, Dictionary valueFields, Dictionary errorFields, @@ -99,39 +104,40 @@ private static void ProcessProperty( HashSet errorSchemaNames, bool isRead) { - if (tdProperty.ReadOnly && !isRead) + if ((tdProperty.ReadOnly?.Value.Value ?? false) && !isRead) { return; } string operation = isRead ? TDValues.OpReadProp : TDValues.OpWriteProp; - FormInfo? propForm = FormInfo.CreateFromForm(tdProperty.Forms?.FirstOrDefault(f => f.Op?.Values.Contains(operation) ?? false), schemaDefinitions); - propForm ??= FormInfo.CreateFromForm(tdProperty.Forms?.FirstOrDefault(f => f.Op == null), schemaDefinitions); + FormInfo? propForm = FormInfo.CreateFromForm(errorReporter, tdProperty.Forms?.Elements?.FirstOrDefault(f => f.Value.Op?.Elements?.Any(e => e.Value.Value == operation) ?? false)?.Value, schemaDefinitions); + propForm ??= FormInfo.CreateFromForm(errorReporter, tdProperty.Forms?.Elements?.FirstOrDefault(f => f.Value.Op == null)?.Value, schemaDefinitions); FieldSpec propFieldSpec = new( - tdProperty.Description ?? (isRead ? $"The '{propName}' Property value." : $"Value for the '{propName}' Property."), - tdProperty as TDDataSchema, + tdProperty.Description?.Value.Value ?? (isRead ? $"The '{propName}' Property value." : $"Value for the '{propName}' Property."), + new ValueTracker { Value = tdProperty as TDDataSchema }, BackupSchemaName: schemaNamer.GetPropValueSchema(propName), Require: isRead, Base: dirName, - Fragment: tdProperty.Placeholder); + Fragment: tdProperty.Placeholder?.Value.Value ?? false); valueFields[propName] = propFieldSpec; - if (propForm?.TopicPattern != null && (isRead || tdProperty.Placeholder)) + if (propForm?.TopicPattern != null && (isRead || (tdProperty.Placeholder?.Value.Value ?? false))) { string propSchemaName = isRead ? schemaNamer.GetPropSchema(propName) : schemaNamer.GetWritablePropSchema(propName); ObjectSpec propObjectSpec = new( - tdProperty.Description ?? $"Container for{(isRead ? "" : " writing to")} the '{propName}' Property.", + tdProperty.Description?.Value.Value ?? $"Container for{(isRead ? "" : " writing to")} the '{propName}' Property.", new Dictionary { { propName, propFieldSpec } }, propForm.Format, - propSchemaName); + propSchemaName, + TokenIndex: -1); schemaSpecs[propSchemaName] = propObjectSpec; } if (propForm?.ErrorRespSchema != null) { FieldSpec respFieldSpec = new( - tdProperty.Description ?? $"{(isRead ? "Read" : "Write")} error for the '{propName}' Property.", + tdProperty.Description?.Value.Value ?? $"{(isRead ? "Read" : "Write")} error for the '{propName}' Property.", propForm.ErrorRespSchema, BackupSchemaName: propForm.ErrorRespName!, Require: false, @@ -155,10 +161,11 @@ private static void ProcessProperty( string respSchemaName = isRead ? schemaNamer.GetPropReadRespSchema(propName) : schemaNamer.GetPropWriteRespSchema(propName); ObjectSpec respObjectSpec = new( - tdProperty.Description ?? $"Response to a '{propName}' Property {(isRead ? "read" : "write")}.", + tdProperty.Description?.Value.Value ?? $"Response to a '{propName}' Property {(isRead ? "read" : "write")}.", responseFields, propForm.Format, - respSchemaName); + respSchemaName, + TokenIndex: -1); schemaSpecs[respSchemaName] = respObjectSpec; SchemaGenerationSupport.AddSchemaReference(propForm.ErrorRespName!, propForm.ErrorRespFormat, referencedSchemas); @@ -190,7 +197,8 @@ private static void GenerateCollectiveResponseObject( $"Values {preposition} {quantifier} Properties.", valueFields, topLevelPropsForm.Format, - propsSchema); + propsSchema, + TokenIndex: -1); } if (topLevelPropsForm.HasErrorResponse) @@ -199,7 +207,8 @@ private static void GenerateCollectiveResponseObject( $"Errors from any Property {operation}.", errorFields, topLevelPropsForm.Format, - errorSchema); + errorSchema, + TokenIndex: -1); Dictionary fieldSketches = new(); fieldSketches[schemaNamer.AggregateRespErrorField] = (errorSchema, "Errors when operation fails."); diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs index 789569b8a5..2d84f7494e 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser; using Azure.Iot.Operations.TDParser.Model; public static class SchemaGenerator @@ -16,18 +17,20 @@ public static Dictionary> GenerateSchem Dictionary schemaSpecs = new(); Dictionary> referencedSchemas = new(); - PropertySchemaGenerator.GeneratePropertySchemas(parsedThing.Thing, parsedThing.DirectoryName, parsedThing.SchemaNamer, projectName, schemaSpecs, referencedSchemas); - ActionSchemaGenerator.GenerateActionSchemas(parsedThing.Thing, parsedThing.DirectoryName, parsedThing.SchemaNamer, projectName, schemaSpecs, referencedSchemas); - EventSchemaGenerator.GenerateEventSchemas(parsedThing.Thing, parsedThing.DirectoryName, parsedThing.SchemaNamer, projectName, schemaSpecs, referencedSchemas); + PropertySchemaGenerator.GeneratePropertySchemas(parsedThing.ErrorReporter, parsedThing.Thing, parsedThing.DirectoryName, parsedThing.SchemaNamer, projectName, schemaSpecs, referencedSchemas); + ActionSchemaGenerator.GenerateActionSchemas(parsedThing.ErrorReporter, parsedThing.Thing, parsedThing.DirectoryName, parsedThing.SchemaNamer, projectName, schemaSpecs, referencedSchemas); + EventSchemaGenerator.GenerateEventSchemas(parsedThing.ErrorReporter, parsedThing.Thing, parsedThing.DirectoryName, parsedThing.SchemaNamer, projectName, schemaSpecs, referencedSchemas); - Dictionary closedSchemaSpecs = ComputeClosedSchemaSpecs(parsedThing.Thing, parsedThing.SchemaNamer, schemaSpecs, referencedSchemas); + Dictionary closedSchemaSpecs = ComputeClosedSchemaSpecs(parsedThing.ErrorReporter, parsedThing.Thing, parsedThing.SchemaNamer, schemaSpecs, referencedSchemas); SchemaTransformFactory transformFactory = new(parsedThing.SchemaNamer, workingDir); foreach (KeyValuePair schemaSpec in closedSchemaSpecs) { - ISchemaTemplateTransform transform = transformFactory.GetSchemaTransform(schemaSpec.Key, schemaSpec.Value); - transforms[transform.FileName] = transform; + if (transformFactory.TryGetSchemaTransform(schemaSpec.Key, schemaSpec.Value, out ISchemaTemplateTransform? transform)) + { + transforms[transform.FileName] = transform; + } } } @@ -47,7 +50,7 @@ public static Dictionary> GenerateSchem return generatedSchemas; } - private static Dictionary ComputeClosedSchemaSpecs(TDThing thing, SchemaNamer schemaNamer, Dictionary schemaSpecs, Dictionary> referencedSchemas) + private static Dictionary ComputeClosedSchemaSpecs(ErrorReporter errorReporter, TDThing thing, SchemaNamer schemaNamer, Dictionary schemaSpecs, Dictionary> referencedSchemas) { Dictionary closedSchemaSpecs = new(); @@ -55,82 +58,84 @@ private static Dictionary ComputeClosedSchemaSpecs(TDThing t { foreach (SerializationFormat format in referencedSchema.Value) { - if (thing.SchemaDefinitions?.TryGetValue(referencedSchema.Key, out TDDataSchema? dataSchema) ?? false) + if (thing.SchemaDefinitions?.Entries?.TryGetValue(referencedSchema.Key, out ValueTracker? dataSchema) ?? false) { - ComputeClosureOfDataSchema(schemaNamer, referencedSchema.Key, dataSchema, format, closedSchemaSpecs); + ComputeClosureOfDataSchema(errorReporter, schemaNamer, referencedSchema.Key, dataSchema, format, closedSchemaSpecs); } } } foreach (KeyValuePair schemaSpec in schemaSpecs) { - ComputeClosureOfSchemaSpec(schemaNamer, schemaSpec.Key, schemaSpec.Value, closedSchemaSpecs); + ComputeClosureOfSchemaSpec(errorReporter, schemaNamer, schemaSpec.Key, schemaSpec.Value, closedSchemaSpecs); } return closedSchemaSpecs; } - private static void ComputeClosureOfSchemaSpec(SchemaNamer schemaNamer, string schemaName, SchemaSpec schemaSpec, Dictionary closedSchemaSpecs) + private static void ComputeClosureOfSchemaSpec(ErrorReporter errorReporter, SchemaNamer schemaNamer, string schemaName, SchemaSpec schemaSpec, Dictionary closedSchemaSpecs) { - if (IsDuplicate(schemaName, schemaSpec, closedSchemaSpecs)) + if (IsLocalDuplicate(errorReporter, schemaName, schemaSpec, closedSchemaSpecs)) { return; } closedSchemaSpecs[schemaName] = schemaSpec; + errorReporter.RegisterName(schemaName, schemaSpec.TokenIndex); if (schemaSpec is ObjectSpec objectSpec) { foreach (KeyValuePair field in objectSpec.Fields) { - ComputeClosureOfDataSchema(schemaNamer, field.Value.BackupSchemaName, field.Value.Schema, schemaSpec.Format, closedSchemaSpecs); + ComputeClosureOfDataSchema(errorReporter, schemaNamer, field.Value.BackupSchemaName, field.Value.Schema, schemaSpec.Format, closedSchemaSpecs); } } } - private static void ComputeClosureOfDataSchema(SchemaNamer schemaNamer, string backupName, TDDataSchema dataSchema, SerializationFormat format, Dictionary closedSchemaSpecs) + private static void ComputeClosureOfDataSchema(ErrorReporter errorReporter, SchemaNamer schemaNamer, string backupName, ValueTracker dataSchema, SerializationFormat format, Dictionary closedSchemaSpecs) { - if (IsProxy(dataSchema)) + if (IsProxy(dataSchema.Value)) { return; } - string schemaName = schemaNamer.ApplyBackupSchemaName(dataSchema.Title, backupName); + string schemaName = schemaNamer.ApplyBackupSchemaName(dataSchema.Value.Title?.Value.Value, backupName); - if (SchemaSpec.TryCreateFromDataSchema(schemaNamer, dataSchema, format, backupName, out SchemaSpec? schemaSpec)) + if (SchemaSpec.TryCreateFromDataSchema(errorReporter, schemaNamer, dataSchema, format, backupName, out SchemaSpec? schemaSpec)) { - if (IsDuplicate(schemaName, schemaSpec, closedSchemaSpecs)) + if (IsLocalDuplicate(errorReporter, schemaName, schemaSpec, closedSchemaSpecs)) { return; } closedSchemaSpecs[schemaName] = schemaSpec; + errorReporter.RegisterName(schemaName, schemaSpec.TokenIndex); } - if (dataSchema.Properties != null) + if (dataSchema.Value.Properties?.Entries != null) { - foreach (KeyValuePair property in dataSchema.Properties) + foreach (KeyValuePair> property in dataSchema.Value.Properties.Entries) { - ComputeClosureOfDataSchema(schemaNamer, schemaNamer.GetBackupSchemaName(schemaName, property.Key), property.Value, format, closedSchemaSpecs); + ComputeClosureOfDataSchema(errorReporter, schemaNamer, schemaNamer.GetBackupSchemaName(schemaName, property.Key), property.Value, format, closedSchemaSpecs); } } - else if (dataSchema.Items != null) + else if (dataSchema.Value.Items?.Value != null) { - ComputeClosureOfDataSchema(schemaNamer, backupName, dataSchema.Items, format, closedSchemaSpecs); + ComputeClosureOfDataSchema(errorReporter, schemaNamer, backupName, dataSchema.Value.Items, format, closedSchemaSpecs); } - else if (dataSchema.AdditionalProperties != null) + else if (dataSchema.Value.AdditionalProperties?.Value != null) { - ComputeClosureOfDataSchema(schemaNamer, backupName, dataSchema.AdditionalProperties, format, closedSchemaSpecs); + ComputeClosureOfDataSchema(errorReporter, schemaNamer, backupName, dataSchema.Value.AdditionalProperties, format, closedSchemaSpecs); } } private static bool IsProxy(TDDataSchema dataSchema) { - return (dataSchema.Type == TDValues.TypeObject && (dataSchema.AdditionalProperties == null || dataSchema.AdditionalProperties == null) && dataSchema.Properties == null) || - (dataSchema.Type == TDValues.TypeArray && dataSchema.Items == null); + return (dataSchema.Type?.Value.Value == TDValues.TypeObject && (dataSchema.AdditionalProperties == null || dataSchema.AdditionalProperties == null) && dataSchema.Properties == null) || + (dataSchema.Type?.Value.Value == TDValues.TypeArray && dataSchema.Items == null); } - private static bool IsDuplicate(string schemaName, SchemaSpec schemaSpec, Dictionary closedSchemaSpecs) + private static bool IsLocalDuplicate(ErrorReporter errorReporter, string schemaName, SchemaSpec schemaSpec, Dictionary closedSchemaSpecs) { if (!closedSchemaSpecs.TryGetValue(schemaName, out SchemaSpec? existingSpec)) { @@ -139,25 +144,36 @@ private static bool IsDuplicate(string schemaName, SchemaSpec schemaSpec, Dictio if (existingSpec.GetType() != schemaSpec.GetType()) { - throw new System.Exception($"Duplicate schema name {schemaName} on different schema types."); + errorReporter.ReportError($"Schema name {schemaName} is duplicated on schema with different type.", schemaSpec.TokenIndex, existingSpec.TokenIndex); + return false; } else if (existingSpec is ObjectSpec existingObjectSpec && schemaSpec is ObjectSpec newObjectSpec) { - if (existingObjectSpec.Fields.Count != newObjectSpec.Fields.Count) + foreach (KeyValuePair field in existingObjectSpec.Fields) { - throw new System.Exception($"Duplicate schema name {schemaName} on objects with different field counts."); + if (!newObjectSpec.Fields.TryGetValue(field.Key, out FieldSpec? newField)) + { + errorReporter.ReportError($"Schema name {schemaName} is duplicated but schema has field '{field.Key}' not present in other schema.", field.Value.Schema.TokenIndex, newObjectSpec.TokenIndex); + return false; + } } - foreach (KeyValuePair field in existingObjectSpec.Fields) + foreach (KeyValuePair field in newObjectSpec.Fields) { - if (!newObjectSpec.Fields.TryGetValue(field.Key, out FieldSpec? newField)) + if (!existingObjectSpec.Fields.TryGetValue(field.Key, out FieldSpec? extantField)) { - throw new System.Exception($"Duplicate schema name {schemaName} on objects with different field names (`{field.Key}` present in only one)."); + errorReporter.ReportError($"Schema name {schemaName} is duplicated but schema has field '{field.Key}' not present in other schema.", field.Value.Schema.TokenIndex, existingObjectSpec.TokenIndex); + return false; } + } - if (!field.Value.Equals(newField)) + foreach (KeyValuePair field in newObjectSpec.Fields) + { + FieldSpec existingFieldValue = existingObjectSpec.Fields[field.Key]; + if (!field.Value.Equals(existingFieldValue)) { - throw new System.Exception($"Duplicate schema name {schemaName} on objects with different values for field `{field.Key}`."); + errorReporter.ReportError($"Schema name {schemaName} is duplicated but field '{field.Key}' has different value.", field.Value.Schema.TokenIndex, existingFieldValue.Schema.TokenIndex); + return false; } } @@ -165,16 +181,21 @@ private static bool IsDuplicate(string schemaName, SchemaSpec schemaSpec, Dictio } else if (existingSpec is EnumSpec existingEnumSpec && schemaSpec is EnumSpec newEnumSpec) { - if (existingEnumSpec.Values.Count != newEnumSpec.Values.Count) + foreach (string value in existingEnumSpec.Values) { - throw new System.Exception($"Duplicate schema name {schemaName} on enums with different value counts."); + if (!newEnumSpec.Values.Contains(value)) + { + errorReporter.ReportError($"Schema name {schemaName} is duplicated but schema has enum value '{value}' not present in other schema.", existingEnumSpec.TokenIndex, newEnumSpec.TokenIndex); + return false; + } } - foreach (string value in existingEnumSpec.Values) + foreach (string value in newEnumSpec.Values) { - if (!newEnumSpec.Values.Contains(value)) + if (!existingEnumSpec.Values.Contains(value)) { - throw new System.Exception($"Duplicate schema name {schemaName} on enums with different values (`{value}` present in only one)."); + errorReporter.ReportError($"Schema name {schemaName} is duplicated but schema has enum value '{value}' not present in other schema.", newEnumSpec.TokenIndex, existingEnumSpec.TokenIndex); + return false; } } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaSpec.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaSpec.cs index 360403120e..a565f6c99c 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaSpec.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaSpec.cs @@ -2,20 +2,21 @@ { using System.Diagnostics.CodeAnalysis; using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser; using Azure.Iot.Operations.TDParser.Model; - internal record SchemaSpec(SerializationFormat Format) + internal record SchemaSpec(SerializationFormat Format, long TokenIndex) { - internal static bool TryCreateFromDataSchema(SchemaNamer schemaNamer, TDDataSchema dataSchema, SerializationFormat format, string backupName, [NotNullWhen(true)] out SchemaSpec? schemaSpec) + internal static bool TryCreateFromDataSchema(ErrorReporter errorReporter, SchemaNamer schemaNamer, ValueTracker dataSchema, SerializationFormat format, string backupName, [NotNullWhen(true)] out SchemaSpec? schemaSpec) { - if (dataSchema.Type == TDValues.TypeObject && dataSchema.AdditionalProperties == null) + if (dataSchema.Value.Type?.Value.Value == TDValues.TypeObject && dataSchema.Value.AdditionalProperties == null) { - schemaSpec = ObjectSpec.CreateFromDataSchema(schemaNamer, dataSchema, format, backupName); + schemaSpec = ObjectSpec.CreateFromDataSchema(errorReporter, schemaNamer, dataSchema, format, backupName); return true; } - else if (dataSchema.Type == TDValues.TypeString && dataSchema.Enum != null) + else if (dataSchema.Value.Enum != null) { - schemaSpec = EnumSpec.CreateFromDataSchema(schemaNamer, dataSchema, format, backupName); + schemaSpec = EnumSpec.CreateFromDataSchema(errorReporter, schemaNamer, dataSchema, format, backupName); return true; } else diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaTransformFactory.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaTransformFactory.cs index 13755f76c6..e1fcaaa589 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaTransformFactory.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaTransformFactory.cs @@ -1,6 +1,6 @@ namespace Azure.Iot.Operations.SchemaGenerator { - using System; + using System.Diagnostics.CodeAnalysis; using System.IO; using Azure.Iot.Operations.CodeGeneration; @@ -13,42 +13,59 @@ internal SchemaTransformFactory(SchemaNamer schemaNamer, DirectoryInfo workingDi this.jsonSchemaSupport = new JsonSchemaSupport(schemaNamer, workingDir); } - internal ISchemaTemplateTransform GetSchemaTransform(string schemaName, SchemaSpec schemaSpec) + internal bool TryGetSchemaTransform(string schemaName, SchemaSpec schemaSpec, [NotNullWhen(true)] out ISchemaTemplateTransform? transform) { - return schemaSpec switch + switch (schemaSpec) { - ObjectSpec objectSpec => GetObjectSchemaTransform(schemaName, objectSpec), - EnumSpec enumSpec => GetEnumSchemaTransform(schemaName, enumSpec), - AliasSpec aliasSpec => GetAliasSchemaTransform(schemaName, aliasSpec), - _ => throw new NotSupportedException($"Unable to transform schema spec of type {schemaSpec.GetType()}."), - }; + case ObjectSpec objectSpec: + return TryGetObjectSchemaTransform(schemaName, objectSpec, out transform); + case EnumSpec enumSpec: + return TryGetEnumSchemaTransform(schemaName, enumSpec, out transform); + case AliasSpec aliasSpec: + return GetAliasSchemaTransform(schemaName, aliasSpec, out transform); + default: + transform = null; + return false; + } } - internal ISchemaTemplateTransform GetObjectSchemaTransform(string schemaName, ObjectSpec objectSpec) + internal bool TryGetObjectSchemaTransform(string schemaName, ObjectSpec objectSpec, [NotNullWhen(true)] out ISchemaTemplateTransform? transform) { - return objectSpec.Format switch + switch (objectSpec.Format) { - SerializationFormat.Json => new ObjectJsonSchema(this.jsonSchemaSupport, schemaName, objectSpec), - _ => throw new NotSupportedException($"Serialization format {objectSpec.Format} is not supported."), - }; + case SerializationFormat.Json: + transform = new ObjectJsonSchema(this.jsonSchemaSupport, schemaName, objectSpec); + return true; + default: + transform = null; + return false; + } } - internal ISchemaTemplateTransform GetEnumSchemaTransform(string schemaName, EnumSpec enumSpec) + internal bool TryGetEnumSchemaTransform(string schemaName, EnumSpec enumSpec, [NotNullWhen(true)] out ISchemaTemplateTransform? transform) { - return enumSpec.Format switch + switch (enumSpec.Format) { - SerializationFormat.Json => new EnumJsonSchema(schemaName, enumSpec), - _ => throw new NotSupportedException($"Serialization format {enumSpec.Format} is not supported."), - }; + case SerializationFormat.Json: + transform = new EnumJsonSchema(schemaName, enumSpec); + return true; + default: + transform = null; + return false; + } } - internal ISchemaTemplateTransform GetAliasSchemaTransform(string schemaName, AliasSpec aliasSpec) + internal bool GetAliasSchemaTransform(string schemaName, AliasSpec aliasSpec, [NotNullWhen(true)] out ISchemaTemplateTransform? transform) { - return aliasSpec.Format switch + switch (aliasSpec.Format) { - SerializationFormat.Json => new AliasJsonSchema(this.jsonSchemaSupport, schemaName, aliasSpec), - _ => throw new NotSupportedException($"Serialization format {aliasSpec.Format} is not supported."), - }; + case SerializationFormat.Json: + transform = new AliasJsonSchema(this.jsonSchemaSupport, schemaName, aliasSpec); + return true; + default: + transform = null; + return false; + } } } } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs index 2272fe5550..f0e0d02632 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs @@ -3,6 +3,7 @@ namespace Azure.Iot.Operations.SchemaGenerator using System.IO; using System.Text.RegularExpressions; using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.TDParser; using Azure.Iot.Operations.TDParser.Model; internal class JsonSchemaSupport @@ -29,42 +30,43 @@ internal string GetFragmented(string typeAndAddenda, bool require) internal string GetReferencePath(string reference, string refBase) { - return Path.GetRelativePath(this.workingDir.FullName, Path.Combine(refBase, reference)).Replace('\\', '/'); + return Path.GetDirectoryName(reference) == string.Empty ? $"./{reference}" : + Path.GetRelativePath(this.workingDir.FullName, Path.Combine(refBase, reference)).Replace('\\', '/'); } - internal string GetTypeAndAddenda(TDDataSchema tdSchema, string backupSchemaName, string refBase) + internal string GetTypeAndAddenda(ValueTracker tdSchema, string backupSchemaName, string refBase) { - if (tdSchema.Ref != null) + if (tdSchema.Value.Ref?.Value != null) { - return $"\"$ref\": \"{GetReferencePath(tdSchema.Ref, refBase)}\""; + return $"\"$ref\": \"{GetReferencePath(tdSchema.Value.Ref.Value.Value, refBase)}\""; } - if ((tdSchema.Type == TDValues.TypeObject && tdSchema.AdditionalProperties == null) || - (tdSchema.Type == TDValues.TypeString && tdSchema.Enum != null)) + if ((tdSchema.Value.Type?.Value.Value == TDValues.TypeObject && tdSchema.Value.AdditionalProperties?.Value == null) || + (tdSchema.Value.Type?.Value.Value == TDValues.TypeString && tdSchema.Value.Enum != null)) { - return $"\"$ref\": \"{this.schemaNamer.ApplyBackupSchemaName(tdSchema.Title, backupSchemaName)}.json\""; + return $"\"$ref\": \"{this.schemaNamer.ApplyBackupSchemaName(tdSchema.Value.Title?.Value.Value, backupSchemaName)}.json\""; } - switch (tdSchema.Type ?? string.Empty) + switch (tdSchema.Value.Type?.Value.Value ?? string.Empty) { case TDValues.TypeObject: - return $"\"type\": \"object\", \"additionalProperties\": {{ {GetTypeAndAddenda(tdSchema.AdditionalProperties!, backupSchemaName, refBase)} }}"; + return $"\"type\": \"object\", \"additionalProperties\": {{ {GetTypeAndAddenda(tdSchema.Value.AdditionalProperties!, backupSchemaName, refBase)} }}"; case TDValues.TypeArray: - string itemsProp = tdSchema.Items != null ? $", \"items\": {{ {GetTypeAndAddenda(tdSchema.Items, backupSchemaName, refBase)} }}" : string.Empty; + string itemsProp = tdSchema.Value.Items?.Value != null ? $", \"items\": {{ {GetTypeAndAddenda(tdSchema.Value.Items, backupSchemaName, refBase)} }}" : string.Empty; return $"\"type\": \"array\"{itemsProp}"; case TDValues.TypeString: - string formatProp = TDValues.FormatValues.Contains(tdSchema.Format ?? string.Empty) ? $", \"format\": \"{tdSchema.Format}\"" : - tdSchema.Pattern != null && Regex.IsMatch(Iso8601DurationExample, tdSchema.Pattern) && !Regex.IsMatch(AnArbitraryString, tdSchema.Pattern) ? @", ""format"": ""duration""" : string.Empty; - string patternProp = tdSchema.Pattern != null && Regex.IsMatch(DecimalExample, tdSchema.Pattern) && !Regex.IsMatch(AnArbitraryString, tdSchema.Pattern) ? $", \"pattern\": \"{DecimalPattern}\"" : string.Empty; - string encodingProp = tdSchema.ContentEncoding == TDValues.ContentEncodingBase64 ? @", ""contentEncoding"": ""base64""" : string.Empty; - string enumProp = tdSchema.Enum != null ? $", \"enum\": [ {string.Join(", ", $"\"{tdSchema.Enum}\"")} ]" : string.Empty; + string formatProp = TDValues.FormatValues.Contains(tdSchema.Value.Format?.Value.Value ?? string.Empty) ? $", \"format\": \"{tdSchema.Value.Format!.Value.Value}\"" : + tdSchema.Value.Pattern?.Value != null && Regex.IsMatch(Iso8601DurationExample, tdSchema.Value.Pattern.Value.Value) && !Regex.IsMatch(AnArbitraryString, tdSchema.Value.Pattern.Value.Value) ? @", ""format"": ""duration""" : string.Empty; + string patternProp = tdSchema.Value.Pattern?.Value != null && Regex.IsMatch(DecimalExample, tdSchema.Value.Pattern.Value.Value) && !Regex.IsMatch(AnArbitraryString, tdSchema.Value.Pattern.Value.Value) ? $", \"pattern\": \"{DecimalPattern}\"" : string.Empty; + string encodingProp = tdSchema.Value.ContentEncoding?.Value.Value == TDValues.ContentEncodingBase64 ? @", ""contentEncoding"": ""base64""" : string.Empty; + string enumProp = tdSchema.Value.Enum != null ? $", \"enum\": [ {string.Join(", ", $"\"{tdSchema.Value.Enum}\"")} ]" : string.Empty; return $"\"type\": \"string\"{formatProp}{patternProp}{encodingProp}{enumProp}"; case TDValues.TypeNumber: - string numberFormat = tdSchema.Minimum >= -3.40e+38 && tdSchema.Maximum <= 3.40e+38 ? "float" : "double"; + string numberFormat = tdSchema.Value.Minimum?.Value.Value >= -3.40e+38 && tdSchema.Value.Maximum?.Value.Value <= 3.40e+38 ? "float" : "double"; return $"\"type\": \"number\", \"format\": \"{numberFormat}\""; case TDValues.TypeInteger: - string minProp = tdSchema.Minimum != null ? $", \"minimum\": {(long)tdSchema.Minimum}" : string.Empty; - string maxProp = tdSchema.Maximum != null ? $", \"maximum\": {(long)tdSchema.Maximum}" : string.Empty; + string minProp = tdSchema.Value.Minimum?.Value != null ? $", \"minimum\": {(long)tdSchema.Value.Minimum.Value.Value}" : string.Empty; + string maxProp = tdSchema.Value.Maximum?.Value != null ? $", \"maximum\": {(long)tdSchema.Value.Maximum.Value.Value}" : string.Empty; return $"\"type\": \"integer\"{minProp}{maxProp}"; case TDValues.TypeBoolean: return @"""type"": ""boolean"""; diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/ArrayTracker.cs b/codegen2/src/Azure.Iot.Operations.TDParser/ArrayTracker.cs new file mode 100644 index 0000000000..58286eddc5 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TDParser/ArrayTracker.cs @@ -0,0 +1,135 @@ +namespace Azure.Iot.Operations.TDParser +{ + using System; + using System.Collections.Generic; + using System.Text.Json; + + public class ArrayTracker : IEquatable>, ISourceTracker + where T : IDeserializable + { + public List>? Elements { get; set; } + + public bool DeserializingFailed { get => false; } + + public string? DeserializationError { get => null; } + + public long TokenIndex { get; set; } + + public virtual bool Equals(ArrayTracker? other) + { + if (other == null) + { + return false; + } + if (Elements == null && other.Elements == null) + { + return true; + } + if (Elements == null || other.Elements == null) + { + return false; + } + if (Elements.Count != other.Elements.Count) + { + return false; + } + for (int i = 0; i < Elements.Count; i++) + { + if (Elements[i] != other.Elements[i]) + { + return false; + } + } + return true; + } + + public override int GetHashCode() + { + return Elements != null ? Elements.GetHashCode() : 0; + } + + public static bool operator ==(ArrayTracker? left, ArrayTracker? right) + { + if (left is null) + { + return right is null; + } + else + { + return left.Equals(right); + } + } + + public static bool operator !=(ArrayTracker? left, ArrayTracker? right) + { + return !(left == right); + } + + public override bool Equals(object? obj) + { + if (ReferenceEquals(this, obj)) + { + return true; + } + else if (ReferenceEquals(obj, null)) + { + return false; + } + else if (obj is not ArrayTracker other) + { + return false; + } + else + { + return Equals(other); + } + } + + public IEnumerable Traverse() + { + yield return this; + + if (Elements != null) + { + foreach (ValueTracker element in Elements) + { + foreach (ITraversable item in element.Traverse()) + { + yield return item; + } + } + } + } + + public static ArrayTracker Deserialize(ref Utf8JsonReader reader) + { + long tokenIndex = reader.TokenStartIndex; + + if (reader.TokenType != JsonTokenType.StartArray) + { + ValueTracker valueTracker = ValueTracker.Deserialize(ref reader); + + return new ArrayTracker + { + Elements = new List> { valueTracker }, + TokenIndex = tokenIndex, + }; + } + + List> elements = new(); + + reader.Read(); + while (reader.TokenType != JsonTokenType.EndArray) + { + elements.Add(ValueTracker.Deserialize(ref reader)); + reader.Read(); + } + + return new ArrayTracker + { + Elements = elements, + TokenIndex = tokenIndex, + }; + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/BaseHolder.cs b/codegen2/src/Azure.Iot.Operations.TDParser/BaseHolder.cs new file mode 100644 index 0000000000..b1672975a3 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TDParser/BaseHolder.cs @@ -0,0 +1,64 @@ +namespace Azure.Iot.Operations.TDParser +{ + using System; + + public class BaseHolder : IEquatable> + where T : IEquatable + { + public required T Value { get; set; } + + public virtual bool Equals(BaseHolder? other) + { + if (other == null) + { + return false; + } + else + { + return Value.Equals(other.Value); + } + } + + public override int GetHashCode() + { + return Value.GetHashCode(); + } + + public static bool operator ==(BaseHolder? left, BaseHolder? right) + { + if (left is null) + { + return right is null; + } + else + { + return left.Equals(right); + } + } + + public static bool operator !=(BaseHolder? left, BaseHolder? right) + { + return !(left == right); + } + + public override bool Equals(object? obj) + { + if (ReferenceEquals(this, obj)) + { + return true; + } + else if (ReferenceEquals(obj, null)) + { + return false; + } + else if (obj is not BaseHolder other) + { + return false; + } + else + { + return Equals(other); + } + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/BoolHolder.cs b/codegen2/src/Azure.Iot.Operations.TDParser/BoolHolder.cs new file mode 100644 index 0000000000..7ef69a8345 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TDParser/BoolHolder.cs @@ -0,0 +1,36 @@ +namespace Azure.Iot.Operations.TDParser +{ + using System; + using System.Collections.Generic; + using System.Text.Json; + + public class BoolHolder : BaseHolder, IEquatable, IDeserializable + { + public virtual bool Equals(BoolHolder? other) + { + if (other == null) + { + return false; + } + else + { + return Value == other.Value; + } + } + + public static BoolHolder Deserialize(ref Utf8JsonReader reader) + { + if (reader.TokenType != JsonTokenType.True && reader.TokenType != JsonTokenType.False) + { + throw new InvalidOperationException($"expected JSON bool but found {reader.TokenType}"); + } + + return new BoolHolder { Value = reader.GetBoolean()! }; + } + + public IEnumerable Traverse() + { + yield break; + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/IDeserializable.cs b/codegen2/src/Azure.Iot.Operations.TDParser/IDeserializable.cs new file mode 100644 index 0000000000..ad1aa04ac9 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TDParser/IDeserializable.cs @@ -0,0 +1,10 @@ +namespace Azure.Iot.Operations.TDParser +{ + using System.Text.Json; + + public interface IDeserializable : ITraversable + where T : IDeserializable + { + static abstract T Deserialize(ref Utf8JsonReader reader); + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/ISourceTracker.cs b/codegen2/src/Azure.Iot.Operations.TDParser/ISourceTracker.cs new file mode 100644 index 0000000000..5d82f51539 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TDParser/ISourceTracker.cs @@ -0,0 +1,12 @@ +namespace Azure.Iot.Operations.TDParser +{ + public interface ISourceTracker : ITraversable + { + bool DeserializingFailed { get; } + + string? DeserializationError { get; } + + long TokenIndex { get; } + } +} + \ No newline at end of file diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/ITraversable.cs b/codegen2/src/Azure.Iot.Operations.TDParser/ITraversable.cs new file mode 100644 index 0000000000..40ce4233f0 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TDParser/ITraversable.cs @@ -0,0 +1,9 @@ +namespace Azure.Iot.Operations.TDParser +{ + using System.Collections.Generic; + + public interface ITraversable + { + IEnumerable Traverse(); + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/MapTracker.cs b/codegen2/src/Azure.Iot.Operations.TDParser/MapTracker.cs new file mode 100644 index 0000000000..5ba19a859e --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TDParser/MapTracker.cs @@ -0,0 +1,137 @@ +namespace Azure.Iot.Operations.TDParser +{ + using System; + using System.Collections.Generic; + using System.Text.Json; + + public class MapTracker : IEquatable>, ISourceTracker + where T : IDeserializable + { + public Dictionary>? Entries { get; set; } + + public bool DeserializingFailed { get; set; } + + public string? DeserializationError { get; set; } + + public long TokenIndex { get; set; } + + public virtual bool Equals(MapTracker? other) + { + if (other == null) + { + return false; + } + if (Entries == null && other.Entries == null) + { + return true; + } + if (Entries == null || other.Entries == null) + { + return false; + } + if (Entries.Count != other.Entries.Count) + { + return false; + } + foreach (var kvp in Entries) + { + if (!other.Entries.TryGetValue(kvp.Key, out var otherValue) || kvp.Value != otherValue) + { + return false; + } + } + return true; + } + + public override int GetHashCode() + { + return Entries != null ? Entries.GetHashCode() : 0; + } + + public static bool operator ==(MapTracker? left, MapTracker? right) + { + if (left is null) + { + return right is null; + } + else + { + return left.Equals(right); + } + } + + public static bool operator !=(MapTracker? left, MapTracker? right) + { + return !(left == right); + } + + public override bool Equals(object? obj) + { + if (ReferenceEquals(this, obj)) + { + return true; + } + else if (ReferenceEquals(obj, null)) + { + return false; + } + else if (obj is not MapTracker other) + { + return false; + } + else + { + return Equals(other); + } + } + + public IEnumerable Traverse() + { + yield return this; + + if (Entries != null) + { + foreach (ValueTracker entryValue in Entries.Values) + { + foreach (ITraversable item in entryValue.Traverse()) + { + yield return item; + } + } + } + } + + public static MapTracker Deserialize(ref Utf8JsonReader reader) + { + long tokenIndex = reader.TokenStartIndex; + + if (reader.TokenType != JsonTokenType.StartObject) + { + return new MapTracker + { + DeserializingFailed = true, + DeserializationError = $"expected JSON object but found {reader.TokenType}", + TokenIndex = tokenIndex, + }; + } + + Dictionary> entries = new(); + + reader.Read(); + while (reader.TokenType == JsonTokenType.PropertyName) + { + string propertyName = reader.GetString()!; + reader.Read(); + + entries[propertyName] = ValueTracker.Deserialize(ref reader); + reader.Read(); + } + + return new MapTracker + { + Entries = entries, + TokenIndex = tokenIndex, + }; + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAction.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAction.cs index d105c6f6dc..3bac46fed8 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAction.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAction.cs @@ -1,25 +1,172 @@ namespace Azure.Iot.Operations.TDParser.Model { - using System.Text.Json.Serialization; + using System; + using System.Collections.Generic; + using System.Text.Json; - public class TDAction + public class TDAction : IEquatable, IDeserializable { - [JsonPropertyName("description")] - public string? Description { get; set; } + public ValueTracker? Description { get; set; } - [JsonPropertyName("input")] - public TDDataSchema? Input { get; set; } + public ValueTracker? Input { get; set; } - [JsonPropertyName("output")] - public TDDataSchema? Output { get; set; } + public ValueTracker? Output { get; set; } - [JsonPropertyName("idempotent")] - public bool Idempotent { get; set; } + public ValueTracker? Idempotent { get; set; } - [JsonPropertyName("safe")] - public bool Safe { get; set; } + public ValueTracker? Safe { get; set; } - [JsonPropertyName("forms")] - public TDForm[]? Forms { get; set; } + public ArrayTracker? Forms { get; set; } + + public virtual bool Equals(TDAction? other) + { + if (other == null) + { + return false; + } + else + { + return Description == other.Description && + Input == other.Input && + Output == other.Output && + Idempotent == other.Idempotent && + Safe == other.Safe && + Forms == other.Forms; + } + } + + public override int GetHashCode() + { + return (Description, Input, Output, Idempotent, Safe, Forms).GetHashCode(); + } + + public static bool operator ==(TDAction? left, TDAction? right) + { + if (left is null) + { + return right is null; + } + else + { + return left.Equals(right); + } + } + + public static bool operator !=(TDAction? left, TDAction? right) + { + return !(left == right); + } + + public override bool Equals(object? obj) + { + if (ReferenceEquals(this, obj)) + { + return true; + } + else if (ReferenceEquals(obj, null)) + { + return false; + } + else if (obj is not TDAction other) + { + return false; + } + else + { + return Equals(other); + } + } + + public IEnumerable Traverse() + { + if (Description != null) + { + foreach (ITraversable item in Description.Traverse()) + { + yield return item; + } + } + if (Input != null) + { + foreach (ITraversable item in Input.Traverse()) + { + yield return item; + } + } + if (Output != null) + { + foreach (ITraversable item in Output.Traverse()) + { + yield return item; + } + } + if (Idempotent != null) + { + foreach (ITraversable item in Idempotent.Traverse()) + { + yield return item; + } + } + if (Safe != null) + { + foreach (ITraversable item in Safe.Traverse()) + { + yield return item; + } + } + if (Forms != null) + { + foreach (ITraversable item in Forms.Traverse()) + { + yield return item; + } + } + } + + public static TDAction Deserialize(ref Utf8JsonReader reader) + { + if (reader.TokenType != JsonTokenType.StartObject) + { + throw new InvalidOperationException($"expected JSON object but found {reader.TokenType}"); + } + + TDAction action = new(); + + reader.Read(); + while (reader.TokenType == JsonTokenType.PropertyName) + { + string propertyName = reader.GetString()!; + reader.Read(); + + switch (propertyName) + { + case "description": + action.Description = ValueTracker.Deserialize(ref reader); + break; + case "input": + action.Input = ValueTracker.Deserialize(ref reader); + break; + case "output": + action.Output = ValueTracker.Deserialize(ref reader); + break; + case "idempotent": + action.Idempotent = ValueTracker.Deserialize(ref reader); + break; + case "safe": + action.Safe = ValueTracker.Deserialize(ref reader); + break; + case "forms": + action.Forms = ArrayTracker.Deserialize(ref reader); + break; + default: + reader.Skip(); + break; + } + + reader.Read(); + } + + return action; + } } } diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDContextSpecifier.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDContextSpecifier.cs index 8c58fe427c..0e90f356d4 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDContextSpecifier.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDContextSpecifier.cs @@ -2,60 +2,107 @@ { using System; using System.Collections.Generic; - using System.Linq; using System.Text.Json; - using System.Text.Json.Serialization; - public class TDContextSpecifier + public class TDContextSpecifier : IEquatable, IDeserializable { - public string? Remote { get; set; } + public ValueTracker? Remote { get; set; } - public Dictionary? Local { get; set; } + public MapTracker? Local { get; set; } - public override string ToString() + public virtual bool Equals(TDContextSpecifier? other) { - if (Remote != null) + if (other == null) { - return Remote; + return false; } - else if (Local != null) + if (Remote != other.Remote) { - return string.Join(", ", Local.Select(kv => $"{kv.Key}: {kv.Value}")); + return false; } - else + if (Local != other.Local) { - return string.Empty; + return false; } + return true; } - } - public sealed class ContextSpecifierJsonConverter : JsonConverter - { - public override TDContextSpecifier Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + public override int GetHashCode() { - return new TDContextSpecifier + return (Remote, Local).GetHashCode(); + } + + public static bool operator ==(TDContextSpecifier? left, TDContextSpecifier? right) + { + if (left is null) { - Remote = reader.TokenType == JsonTokenType.String ? reader.GetString() : null, - Local = reader.TokenType == JsonTokenType.StartObject ? JsonSerializer.Deserialize>(ref reader, options) : null - }; + return right is null; + } + else + { + return left.Equals(right); + } } - public override void Write( - Utf8JsonWriter writer, - TDContextSpecifier amount, - JsonSerializerOptions options) + public static bool operator !=(TDContextSpecifier? left, TDContextSpecifier? right) { - if (amount.Remote != null) + return !(left == right); + } + + public override bool Equals(object? obj) + { + if (ReferenceEquals(this, obj)) { - writer.WriteStringValue(amount.Remote); + return true; } - else if (amount.Local != null) + else if (ReferenceEquals(obj, null)) { - JsonSerializer.Serialize(writer, amount.Local, options); + return false; + } + else if (obj is not TDContextSpecifier other) + { + return false; } else { - writer.WriteNullValue(); + return Equals(other); + } + } + + public IEnumerable Traverse() + { + if (Remote != null) + { + foreach (ITraversable item in Remote.Traverse()) + { + yield return item; + } + } + if (Local != null) + { + foreach (ITraversable item in Local.Traverse()) + { + yield return item; + } + } + } + + public static TDContextSpecifier Deserialize(ref Utf8JsonReader reader) + { + switch (reader.TokenType) + { + case JsonTokenType.StartObject: + return new TDContextSpecifier + { + Local = MapTracker.Deserialize(ref reader), + }; + case JsonTokenType.String: + return new TDContextSpecifier + { + Remote = ValueTracker.Deserialize(ref reader), + }; + default: + throw new InvalidOperationException($"expected string or JSON object but found {reader.TokenType}"); } } } diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs index 439d99d8ec..1413add024 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs @@ -1,58 +1,43 @@ namespace Azure.Iot.Operations.TDParser.Model { + using System; using System.Collections.Generic; using System.Linq; - using System.Text.Json.Serialization; + using System.Text.Json; - public class TDDataSchema + public class TDDataSchema : IEquatable, IDeserializable { - [JsonPropertyName("dtv:ref")] - public string? Ref { get; set; } + public ValueTracker? Ref { get; set; } - [JsonPropertyName("title")] - public string? Title { get; set; } + public ValueTracker? Title { get; set; } - [JsonPropertyName("description")] - public string? Description { get; set; } + public ValueTracker? Description { get; set; } - [JsonPropertyName("type")] - public string? Type { get; set; } + public ValueTracker? Type { get; set; } - [JsonPropertyName("const")] - public object? Const { get; set; } + public ValueTracker? Const { get; set; } - [JsonPropertyName("minimum")] - public double? Minimum { get; set; } + public ValueTracker? Minimum { get; set; } - [JsonPropertyName("maximum")] - public double? Maximum { get; set; } + public ValueTracker? Maximum { get; set; } - [JsonPropertyName("format")] - public string? Format { get; set; } + public ValueTracker? Format { get; set; } - [JsonPropertyName("pattern")] - public string? Pattern { get; set; } + public ValueTracker? Pattern { get; set; } - [JsonPropertyName("contentEncoding")] - public string? ContentEncoding { get; set; } + public ValueTracker? ContentEncoding { get; set; } - [JsonPropertyName("dtv:additionalProperties")] - public TDDataSchema? AdditionalProperties { get; set; } + public ValueTracker? AdditionalProperties { get; set; } - [JsonPropertyName("enum")] - public string[]? Enum { get; set; } + public ArrayTracker? Enum { get; set; } - [JsonPropertyName("required")] - public string[]? Required { get; set; } + public ArrayTracker? Required { get; set; } - [JsonPropertyName("dtv:errorMessage")] - public string? ErrorMessage { get; set; } + public ValueTracker? ErrorMessage { get; set; } - [JsonPropertyName("properties")] - public Dictionary? Properties { get; set; } + public MapTracker? Properties { get; set; } - [JsonPropertyName("items")] - public TDDataSchema? Items { get; set; } + public ValueTracker? Items { get; set; } public override int GetHashCode() { @@ -65,22 +50,261 @@ public virtual bool Equals(TDDataSchema? other) { return false; } + else + { + return Title == other.Title && + Ref == other.Ref && + Description == other.Description && + Type == other.Type && + Const == other.Const && + Minimum == other.Minimum && + Maximum == other.Maximum && + Format == other.Format && + Pattern == other.Pattern && + ContentEncoding == other.ContentEncoding && + ((AdditionalProperties == null && other.AdditionalProperties == null) || (AdditionalProperties?.Equals(other.AdditionalProperties) ?? false)) && + ((Enum == null && other.Enum == null) || (Enum?.Elements != null && other.Enum?.Elements != null && Enum.Elements.SequenceEqual(other.Enum.Elements))) && + ((Required == null && other.Required == null) || (Required?.Elements != null && other.Required?.Elements != null && Required.Elements.SequenceEqual(other.Required.Elements))) && + ErrorMessage == other.ErrorMessage && + Properties?.Entries?.Count == other.Properties?.Entries?.Count && (Properties == null || Properties!.Entries!.OrderBy(kv => kv.Key).SequenceEqual(other.Properties!.Entries!.OrderBy(kv => kv.Key))) && + ((Items == null && other.Items == null) || (Items?.Equals(other.Items) ?? false)); + } + } + + public static bool operator ==(TDDataSchema? left, TDDataSchema? right) + { + if (left is null) + { + return right is null; + } + else + { + return left.Equals(right); + } + } + + public static bool operator !=(TDDataSchema? left, TDDataSchema? right) + { + return !(left == right); + } + + public override bool Equals(object? obj) + { + if (ReferenceEquals(this, obj)) + { + return true; + } + else if (ReferenceEquals(obj, null)) + { + return false; + } + else if (obj is not TDDataSchema other) + { + return false; + } + else + { + return Equals(other); + } + } + + public static TDDataSchema Deserialize(ref Utf8JsonReader reader) + { + if (reader.TokenType != JsonTokenType.StartObject) + { + throw new InvalidOperationException($"expected JSON object but found {reader.TokenType}"); + } + + TDDataSchema dataSchema = new(); + + reader.Read(); + while (reader.TokenType == JsonTokenType.PropertyName) + { + string propertyName = reader.GetString()!; + reader.Read(); + + if (!TryLoadPropertyValues(dataSchema, propertyName, ref reader)) + { + reader.Skip(); + } + + reader.Read(); + } + + return dataSchema; + } - return Title == other.Title && - Description == other.Description && - Type == other.Type && - Const == other.Const && - Minimum == other.Minimum && - Maximum == other.Maximum && - Format == other.Format && - Pattern == other.Pattern && - ContentEncoding == other.ContentEncoding && - ((AdditionalProperties == null && other.AdditionalProperties == null) || (AdditionalProperties?.Equals(other.AdditionalProperties) ?? false)) && - ((Enum == null && other.Enum == null) || (Enum != null && other.Enum != null && Enum.SequenceEqual(other.Enum))) && - ((Required == null && other.Required == null) || (Required != null && other.Required != null && Required.SequenceEqual(other.Required))) && - ErrorMessage == other.ErrorMessage && - Properties?.Count == other.Properties?.Count && (Properties == null || Properties.OrderBy(kv => kv.Key).SequenceEqual(other.Properties!.OrderBy(kv => kv.Key))) && - ((Items == null && other.Items == null) || (Items?.Equals(other.Items) ?? false)); + public virtual IEnumerable Traverse() + { + if (Ref != null) + { + foreach (ITraversable item in Ref.Traverse()) + { + yield return item; + } + } + if (Title != null) + { + foreach (ITraversable item in Title.Traverse()) + { + yield return item; + } + } + if (Description != null) + { + foreach (ITraversable item in Description.Traverse()) + { + yield return item; + } + } + if (Type != null) + { + foreach (ITraversable item in Type.Traverse()) + { + yield return item; + } + } + if (Const != null) + { + foreach (ITraversable item in Const.Traverse()) + { + yield return item; + } + } + if (Minimum != null) + { + foreach (ITraversable item in Minimum.Traverse()) + { + yield return item; + } + } + if (Maximum != null) + { + foreach (ITraversable item in Maximum.Traverse()) + { + yield return item; + } + } + if (Format != null) + { + foreach (ITraversable item in Format.Traverse()) + { + yield return item; + } + } + if (Pattern != null) + { + foreach (ITraversable item in Pattern.Traverse()) + { + yield return item; + } + } + if (ContentEncoding != null) + { + foreach (ITraversable item in ContentEncoding.Traverse()) + { + yield return item; + } + } + if (AdditionalProperties != null) + { + foreach (ITraversable item in AdditionalProperties.Traverse()) + { + yield return item; + } + } + if (Enum != null) + { + foreach (ITraversable item in Enum.Traverse()) + { + yield return item; + } + } + if (Required != null) + { + foreach (ITraversable item in Required.Traverse()) + { + yield return item; + } + } + if (ErrorMessage != null) + { + foreach (ITraversable item in ErrorMessage.Traverse()) + { + yield return item; + } + } + if (Properties != null) + { + foreach (ITraversable item in Properties.Traverse()) + { + yield return item; + } + } + if (Items != null) + { + foreach (ITraversable item in Items.Traverse()) + { + yield return item; + } + } + } + + protected static bool TryLoadPropertyValues(TDDataSchema dataSchema, string propertyName, ref Utf8JsonReader reader) + { + switch (propertyName) + { + case "dtv:ref": + dataSchema.Ref = ValueTracker.Deserialize(ref reader); + return true; + case "title": + dataSchema.Title = ValueTracker.Deserialize(ref reader); + return true; + case "description": + dataSchema.Description = ValueTracker.Deserialize(ref reader); + return true; + case "type": + dataSchema.Type = ValueTracker.Deserialize(ref reader); + return true; + case "const": + dataSchema.Const = ValueTracker.Deserialize(ref reader); + return true; + case "minimum": + dataSchema.Minimum = ValueTracker.Deserialize(ref reader); + return true; + case "maximum": + dataSchema.Maximum = ValueTracker.Deserialize(ref reader); + return true; + case "format": + dataSchema.Format = ValueTracker.Deserialize(ref reader); + return true; + case "pattern": + dataSchema.Pattern = ValueTracker.Deserialize(ref reader); + return true; + case "contentEncoding": + dataSchema.ContentEncoding = ValueTracker.Deserialize(ref reader); + return true; + case "dtv:additionalProperties": + dataSchema.AdditionalProperties = ValueTracker.Deserialize(ref reader); + return true; + case "enum": + dataSchema.Enum = ArrayTracker.Deserialize(ref reader); + return true; + case "required": + dataSchema.Required = ArrayTracker.Deserialize(ref reader); + return true; + case "dtv:errorMessage": + dataSchema.ErrorMessage = ValueTracker.Deserialize(ref reader); + return true; + case "properties": + dataSchema.Properties = MapTracker.Deserialize(ref reader); + return true; + case "items": + dataSchema.Items = ValueTracker.Deserialize(ref reader); + return true; + default: + return false; + } } } } diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDEvent.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDEvent.cs index 28062554b8..a31026663d 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDEvent.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDEvent.cs @@ -1,20 +1,146 @@ namespace Azure.Iot.Operations.TDParser.Model { + using System; using System.Collections.Generic; - using System.Text.Json.Serialization; + using System.Text.Json; - public class TDEvent + public class TDEvent : IEquatable, IDeserializable { - [JsonPropertyName("description")] - public string? Description { get; set; } + public ValueTracker? Description { get; set; } - [JsonPropertyName("data")] - public TDDataSchema? Data { get; set; } + public ValueTracker? Data { get; set; } - [JsonPropertyName("dtv:placeholder")] - public bool Placeholder { get; set; } + public ValueTracker? Placeholder { get; set; } - [JsonPropertyName("forms")] - public TDForm[]? Forms { get; set; } + public ArrayTracker? Forms { get; set; } + + public virtual bool Equals(TDEvent? other) + { + if (other == null) + { + return false; + } + else + { + return Description == other.Description && + Data == other.Data && + Placeholder == other.Placeholder && + Forms == other.Forms; + } + } + + public override int GetHashCode() + { + return (Description, Data, Placeholder, Forms).GetHashCode(); + } + + public static bool operator ==(TDEvent? left, TDEvent? right) + { + if (left is null) + { + return right is null; + } + else + { + return left.Equals(right); + } + } + + public static bool operator !=(TDEvent? left, TDEvent? right) + { + return !(left == right); + } + + public override bool Equals(object? obj) + { + if (ReferenceEquals(this, obj)) + { + return true; + } + else if (ReferenceEquals(obj, null)) + { + return false; + } + else if (obj is not TDEvent other) + { + return false; + } + else + { + return Equals(other); + } + } + + public IEnumerable Traverse() + { + if (Description != null) + { + foreach (ITraversable item in Description.Traverse()) + { + yield return item; + } + } + if (Data != null) + { + foreach (ITraversable item in Data.Traverse()) + { + yield return item; + } + } + if (Placeholder != null) + { + foreach (ITraversable item in Placeholder.Traverse()) + { + yield return item; + } + } + if (Forms != null) + { + foreach (ITraversable item in Forms.Traverse()) + { + yield return item; + } + } + } + + public static TDEvent Deserialize(ref Utf8JsonReader reader) + { + if (reader.TokenType != JsonTokenType.StartObject) + { + throw new InvalidOperationException($"expected JSON object but found {reader.TokenType}"); + } + + TDEvent evt = new(); + + reader.Read(); + while (reader.TokenType == JsonTokenType.PropertyName) + { + string propertyName = reader.GetString()!; + reader.Read(); + + switch (propertyName) + { + case "description": + evt.Description = ValueTracker.Deserialize(ref reader); + break; + case "data": + evt.Data = ValueTracker.Deserialize(ref reader); + break; + case "dtv:placeholder": + evt.Placeholder = ValueTracker.Deserialize(ref reader); + break; + case "forms": + evt.Forms = ArrayTracker.Deserialize(ref reader); + break; + default: + reader.Skip(); + break; + } + + reader.Read(); + } + + return evt; + } } } diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDForm.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDForm.cs index f757c9c6d0..14ad05708c 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDForm.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDForm.cs @@ -1,31 +1,198 @@ namespace Azure.Iot.Operations.TDParser.Model { - using System.Text.Json.Serialization; + using System; + using System.Collections.Generic; + using System.Text.Json; - public class TDForm + public class TDForm : IEquatable, IDeserializable { - [JsonPropertyName("href")] - public string? Href { get; set; } + public ValueTracker? Href { get; set; } - [JsonPropertyName("contentType")] - public string? ContentType { get; set; } + public ValueTracker? ContentType { get; set; } - [JsonPropertyName("additionalResponses")] - public TDSchemaReference[]? AdditionalResponses { get; set; } + public ArrayTracker? AdditionalResponses { get; set; } - [JsonPropertyName("dtv:headerInfo")] - public TDSchemaReference[]? HeaderInfo { get; set; } + public ArrayTracker? HeaderInfo { get; set; } - [JsonPropertyName("dtv:headerCode")] - public string? HeaderCode { get; set; } + public ValueTracker? HeaderCode { get; set; } - [JsonPropertyName("dtv:serviceGroupId")] - public string? ServiceGroupId { get; set; } + public ValueTracker? ServiceGroupId { get; set; } - [JsonPropertyName("dtv:topic")] - public string? Topic { get; set; } + public ValueTracker? Topic { get; set; } - [JsonPropertyName("op")] - public TDStringArray? Op { get; set; } + public ArrayTracker? Op { get; set; } + + public virtual bool Equals(TDForm? other) + { + if (other == null) + { + return false; + } + else + { + return Href == other.Href && + ContentType == other.ContentType && + AdditionalResponses == other.AdditionalResponses && + HeaderInfo == other.HeaderInfo && + HeaderCode == other.HeaderCode && + ServiceGroupId == other.ServiceGroupId && + Topic == other.Topic && + Op == other.Op; + } + } + + public override int GetHashCode() + { + return (Href, ContentType, AdditionalResponses, HeaderInfo, HeaderCode, ServiceGroupId, Topic, Op).GetHashCode(); + } + + public static bool operator ==(TDForm? left, TDForm? right) + { + if (left is null) + { + return right is null; + } + else + { + return left.Equals(right); + } + } + + public static bool operator !=(TDForm? left, TDForm? right) + { + return !(left == right); + } + + public override bool Equals(object? obj) + { + if (ReferenceEquals(this, obj)) + { + return true; + } + else if (ReferenceEquals(obj, null)) + { + return false; + } + else if (obj is not TDForm other) + { + return false; + } + else + { + return Equals(other); + } + } + + public IEnumerable Traverse() + { + if (Href != null) + { + foreach (ITraversable item in Href.Traverse()) + { + yield return item; + } + } + if (ContentType != null) + { + foreach (ITraversable item in ContentType.Traverse()) + { + yield return item; + } + } + if (AdditionalResponses != null) + { + foreach (ITraversable item in AdditionalResponses.Traverse()) + { + yield return item; + } + } + if (HeaderInfo != null) + { + foreach (ITraversable item in HeaderInfo.Traverse()) + { + yield return item; + } + } + if (HeaderCode != null) + { + foreach (ITraversable item in HeaderCode.Traverse()) + { + yield return item; + } + } + if (ServiceGroupId != null) + { + foreach (ITraversable item in ServiceGroupId.Traverse()) + { + yield return item; + } + } + if (Topic != null) + { + foreach (ITraversable item in Topic.Traverse()) + { + yield return item; + } + } + if (Op != null) + { + foreach (ITraversable item in Op.Traverse()) + { + yield return item; + } + } + } + + public static TDForm Deserialize(ref Utf8JsonReader reader) + { + if (reader.TokenType != JsonTokenType.StartObject) + { + throw new InvalidOperationException($"expected JSON object but found {reader.TokenType}"); + } + + TDForm form = new(); + + reader.Read(); + while (reader.TokenType == JsonTokenType.PropertyName) + { + string propertyName = reader.GetString()!; + reader.Read(); + + switch (propertyName) + { + case "href": + form.Href = ValueTracker.Deserialize(ref reader); + break; + case "contentType": + form.ContentType = ValueTracker.Deserialize(ref reader); + break; + case "additionalResponses": + form.AdditionalResponses = ArrayTracker.Deserialize(ref reader); + break; + case "dtv:headerInfo": + form.HeaderInfo = ArrayTracker.Deserialize(ref reader); + break; + case "dtv:headerCode": + form.HeaderCode = ValueTracker.Deserialize(ref reader); + break; + case "dtv:serviceGroupId": + form.ServiceGroupId = ValueTracker.Deserialize(ref reader); + break; + case "dtv:topic": + form.Topic = ValueTracker.Deserialize(ref reader); + break; + case "op": + form.Op = ArrayTracker.Deserialize(ref reader); + break; + default: + reader.Skip(); + break; + } + + reader.Read(); + } + + return form; + } } } diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDLink.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDLink.cs index c2e45932f4..e2025da57d 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDLink.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDLink.cs @@ -1,16 +1,131 @@ namespace Azure.Iot.Operations.TDParser.Model { - using System.Text.Json.Serialization; + using System; + using System.Collections.Generic; + using System.Text.Json; - public class TDLink + public class TDLink : IEquatable, IDeserializable { - [JsonPropertyName("href")] - public string? Href { get; set; } + public ValueTracker? Href { get; set; } - [JsonPropertyName("type")] - public string? ContentType { get; set; } + public ValueTracker? ContentType { get; set; } - [JsonPropertyName("rel")] - public string? Relation { get; set; } + public ValueTracker? Rel { get; set; } + + public virtual bool Equals(TDLink? other) + { + if (other == null) + { + return false; + } + else + { + return Href == other.Href && ContentType == other.ContentType && Rel == other.Rel; + } + } + + public override int GetHashCode() + { + return (Href, ContentType, Rel).GetHashCode(); + } + + public static bool operator ==(TDLink? left, TDLink? right) + { + if (left is null) + { + return right is null; + } + else + { + return left.Equals(right); + } + } + + public static bool operator !=(TDLink? left, TDLink? right) + { + return !(left == right); + } + + public override bool Equals(object? obj) + { + if (ReferenceEquals(this, obj)) + { + return true; + } + else if (ReferenceEquals(obj, null)) + { + return false; + } + else if (obj is not TDLink other) + { + return false; + } + else + { + return Equals(other); + } + } + + public IEnumerable Traverse() + { + if (Href != null) + { + foreach (ITraversable item in Href.Traverse()) + { + yield return item; + } + } + if (ContentType != null) + { + foreach (ITraversable item in ContentType.Traverse()) + { + yield return item; + } + } + if (Rel != null) + { + foreach (ITraversable item in Rel.Traverse()) + { + yield return item; + } + } + } + + public static TDLink Deserialize(ref Utf8JsonReader reader) + { + if (reader.TokenType != JsonTokenType.StartObject) + { + throw new InvalidOperationException($"expected JSON object but found {reader.TokenType}"); + } + + TDLink link = new(); + + reader.Read(); + while (reader.TokenType == JsonTokenType.PropertyName) + { + string propertyName = reader.GetString()!; + reader.Read(); + + switch (propertyName) + { + case "href": + link.Href = ValueTracker.Deserialize(ref reader); + break; + case "contentType": + link.ContentType = ValueTracker.Deserialize(ref reader); + break; + case "rel": + link.Rel = ValueTracker.Deserialize(ref reader); + break; + default: + reader.Skip(); + break; + } + + reader.Read(); + } + + return link; + } } } diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDProperty.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDProperty.cs index b0e5e74673..1c82dc0d17 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDProperty.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDProperty.cs @@ -1,16 +1,142 @@ namespace Azure.Iot.Operations.TDParser.Model { - using System.Text.Json.Serialization; + using System; + using System.Collections.Generic; + using System.Text.Json; - public class TDProperty : TDDataSchema + public class TDProperty : TDDataSchema, IEquatable, IDeserializable { - [JsonPropertyName("readOnly")] - public bool ReadOnly { get; set; } + public ValueTracker? ReadOnly { get; set; } - [JsonPropertyName("dtv:placeholder")] - public bool Placeholder { get; set; } + public ValueTracker? Placeholder { get; set; } - [JsonPropertyName("forms")] - public TDForm[]? Forms { get; set; } + public ArrayTracker? Forms { get; set; } + + public virtual bool Equals(TDProperty? other) + { + if (other == null) + { + return false; + } + else + { + return base.Equals(other) && + ReadOnly == other.ReadOnly && + Placeholder == other.Placeholder && + Forms == other.Forms; + } + } + + public override int GetHashCode() + { + return (base.GetHashCode(), ReadOnly, Placeholder, Forms).GetHashCode(); + } + + public static bool operator ==(TDProperty? left, TDProperty? right) + { + if (left is null) + { + return right is null; + } + else + { + return left.Equals(right); + } + } + + public static bool operator !=(TDProperty? left, TDProperty? right) + { + return !(left == right); + } + + public override bool Equals(object? obj) + { + if (ReferenceEquals(this, obj)) + { + return true; + } + else if (ReferenceEquals(obj, null)) + { + return false; + } + else if (obj is not TDProperty other) + { + return false; + } + else + { + return Equals(other); + } + } + + public override IEnumerable Traverse() + { + foreach (ITraversable baseChild in base.Traverse()) + { + yield return baseChild; + } + + if (ReadOnly != null) + { + foreach (ITraversable item in ReadOnly.Traverse()) + { + yield return item; + } + } + if (Placeholder != null) + { + foreach (ITraversable item in Placeholder.Traverse()) + { + yield return item; + } + } + if (Forms != null) + { + foreach (ITraversable item in Forms.Traverse()) + { + yield return item; + } + } + } + + public static new TDProperty Deserialize(ref Utf8JsonReader reader) + { + if (reader.TokenType != JsonTokenType.StartObject) + { + throw new InvalidOperationException($"expected JSON object but found {reader.TokenType}"); + } + + TDProperty prop = new(); + + reader.Read(); + while (reader.TokenType == JsonTokenType.PropertyName) + { + string propertyName = reader.GetString()!; + reader.Read(); + + if (!TryLoadPropertyValues(prop, propertyName, ref reader)) + { + switch (propertyName) + { + case "readOnly": + prop.ReadOnly = ValueTracker.Deserialize(ref reader); + break; + case "dtv:placeholder": + prop.Placeholder = ValueTracker.Deserialize(ref reader); + break; + case "forms": + prop.Forms = ArrayTracker.Deserialize(ref reader); + break; + default: + reader.Skip(); + break; + } + } + + reader.Read(); + } + + return prop; + } } } diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDSchemaReference.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDSchemaReference.cs index ea450c30e9..fe1fef5260 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDSchemaReference.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDSchemaReference.cs @@ -1,16 +1,131 @@ namespace Azure.Iot.Operations.TDParser.Model { - using System.Text.Json.Serialization; + using System; + using System.Collections.Generic; + using System.Text.Json; - public class TDSchemaReference + public class TDSchemaReference : IEquatable, IDeserializable { - [JsonPropertyName("success")] - public bool Success { get; set; } + public ValueTracker? Success { get; set; } - [JsonPropertyName("contentType")] - public string? ContentType { get; set; } + public ValueTracker? ContentType { get; set; } - [JsonPropertyName("schema")] - public string? Schema { get; set; } + public ValueTracker? Schema { get; set; } + + public virtual bool Equals(TDSchemaReference? other) + { + if (other == null) + { + return false; + } + else + { + return Success == other.Success && ContentType == other.ContentType && Schema == other.Schema; + } + } + + public override int GetHashCode() + { + return (Success, ContentType, Schema).GetHashCode(); + } + + public static bool operator ==(TDSchemaReference? left, TDSchemaReference? right) + { + if (left is null) + { + return right is null; + } + else + { + return left.Equals(right); + } + } + + public static bool operator !=(TDSchemaReference? left, TDSchemaReference? right) + { + return !(left == right); + } + + public override bool Equals(object? obj) + { + if (ReferenceEquals(this, obj)) + { + return true; + } + else if (ReferenceEquals(obj, null)) + { + return false; + } + else if (obj is not TDSchemaReference other) + { + return false; + } + else + { + return Equals(other); + } + } + + public IEnumerable Traverse() + { + if (Success != null) + { + foreach (ITraversable item in Success.Traverse()) + { + yield return item; + } + } + if (ContentType != null) + { + foreach (ITraversable item in ContentType.Traverse()) + { + yield return item; + } + } + if (Schema != null) + { + foreach (ITraversable item in Schema.Traverse()) + { + yield return item; + } + } + } + + public static TDSchemaReference Deserialize(ref Utf8JsonReader reader) + { + if (reader.TokenType != JsonTokenType.StartObject) + { + throw new InvalidOperationException($"expected JSON object but found {reader.TokenType}"); + } + + TDSchemaReference schemaRef = new(); + + reader.Read(); + while (reader.TokenType == JsonTokenType.PropertyName) + { + string propertyName = reader.GetString()!; + reader.Read(); + + switch (propertyName) + { + case "success": + schemaRef.Success = ValueTracker.Deserialize(ref reader); + break; + case "contentType": + schemaRef.ContentType = ValueTracker.Deserialize(ref reader); + break; + case "schema": + schemaRef.Schema = ValueTracker.Deserialize(ref reader); + break; + default: + reader.Skip(); + break; + } + + reader.Read(); + } + + return schemaRef; + } } } diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDStringArray.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDStringArray.cs deleted file mode 100644 index f2a2e99fe6..0000000000 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDStringArray.cs +++ /dev/null @@ -1,50 +0,0 @@ -namespace Azure.Iot.Operations.TDParser.Model -{ - using System; - using System.Collections.Generic; - using System.Linq; - using System.Text.Json; - using System.Text.Json.Serialization; - - public class TDStringArray - { - public List Values { get; set; } = new(); - - public override string ToString() - { - return string.Join(", ", Values.Select(s => $"{s}")); - } - } - - public sealed class TDStringArrayJsonConverter : JsonConverter - { - public override TDStringArray Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) - { - if (reader.TokenType == JsonTokenType.String) - { - return new TDStringArray - { - Values = new List { reader.GetString()! } - }; - } - - if (reader.TokenType == JsonTokenType.StartArray) - { - return new TDStringArray - { - Values = JsonSerializer.Deserialize>(ref reader, options)! - }; - } - - return new TDStringArray(); - } - - public override void Write( - Utf8JsonWriter writer, - TDStringArray amount, - JsonSerializerOptions options) - { - JsonSerializer.Serialize(writer, amount.Values, options); - } - } -} diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDThing.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDThing.cs index 5bac419ca8..e22a05ae36 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDThing.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDThing.cs @@ -1,35 +1,211 @@ namespace Azure.Iot.Operations.TDParser.Model { + using System; using System.Collections.Generic; - using System.Text.Json.Serialization; + using System.Text.Json; - public class TDThing + public class TDThing : IEquatable, IDeserializable { - [JsonPropertyName("@context")] - public TDContextSpecifier[]? Context { get; set; } + public ArrayTracker? Context { get; set; } - [JsonPropertyName("id")] - public string? Id { get; set; } + public ValueTracker? Id { get; set; } - [JsonPropertyName("title")] - public string? Title { get; set; } + public ValueTracker? Title { get; set; } - [JsonPropertyName("links")] - public List? Links { get; set; } + public ArrayTracker? Links { get; set; } - [JsonPropertyName("schemaDefinitions")] - public Dictionary? SchemaDefinitions { get; set; } + public MapTracker? SchemaDefinitions { get; set; } - [JsonPropertyName("forms")] - public TDForm[]? Forms { get; set; } + public ArrayTracker? Forms { get; set; } - [JsonPropertyName("actions")] - public Dictionary? Actions { get; set; } + public MapTracker? Actions { get; set; } - [JsonPropertyName("properties")] - public Dictionary? Properties { get; set; } + public MapTracker? Properties { get; set; } - [JsonPropertyName("events")] - public Dictionary? Events { get; set; } + public MapTracker? Events { get; set; } + + public virtual bool Equals(TDThing? other) + { + if (other == null) + { + return false; + } + else + { + return Context == other.Context && + Id == other.Id && + Title == other.Title && + Links == other.Links && + SchemaDefinitions == other.SchemaDefinitions && + Forms == other.Forms && + Actions == other.Actions && + Properties == other.Properties && + Events == other.Events; + } + } + + public override int GetHashCode() + { + return (Context, Id, Title, Links, SchemaDefinitions, Forms, Actions, Properties, Events).GetHashCode(); + } + + public static bool operator ==(TDThing? left, TDThing? right) + { + if (left is null) + { + return right is null; + } + else + { + return left.Equals(right); + } + } + + public static bool operator !=(TDThing? left, TDThing? right) + { + return !(left == right); + } + + public override bool Equals(object? obj) + { + if (ReferenceEquals(this, obj)) + { + return true; + } + else if (ReferenceEquals(obj, null)) + { + return false; + } + else if (obj is not TDThing other) + { + return false; + } + else + { + return Equals(other); + } + } + + public IEnumerable Traverse() + { + if (Context != null) + { + foreach (ITraversable item in Context.Traverse()) + { + yield return item; + } + } + if (Id != null) + { + foreach (ITraversable item in Id.Traverse()) + { + yield return item; + } + } + if (Title != null) + { + foreach (ITraversable item in Title.Traverse()) + { + yield return item; + } + } + if (Links != null) + { + foreach (ITraversable item in Links.Traverse()) + { + yield return item; + } + } + if (SchemaDefinitions != null) + { + foreach (ITraversable item in SchemaDefinitions.Traverse()) + { + yield return item; + } + } + if (Forms != null) + { + foreach (ITraversable item in Forms.Traverse()) + { + yield return item; + } + } + if (Actions != null) + { + foreach (ITraversable item in Actions.Traverse()) + { + yield return item; + } + } + if (Properties != null) + { + foreach (ITraversable item in Properties.Traverse()) + { + yield return item; + } + } + if (Events != null) + { + foreach (ITraversable item in Events.Traverse()) + { + yield return item; + } + } + } + + public static TDThing Deserialize(ref Utf8JsonReader reader) + { + if (reader.TokenType != JsonTokenType.StartObject) + { + throw new InvalidOperationException($"expected JSON object but found {reader.TokenType}"); + } + + TDThing thing = new(); + + reader.Read(); + while (reader.TokenType == JsonTokenType.PropertyName) + { + string propertyName = reader.GetString()!; + reader.Read(); + + switch (propertyName) + { + case "@context": + thing.Context = ArrayTracker.Deserialize(ref reader); + break; + case "id": + thing.Id = ValueTracker.Deserialize(ref reader); + break; + case "title": + thing.Title = ValueTracker.Deserialize(ref reader); + break; + case "links": + thing.Links = ArrayTracker.Deserialize(ref reader); + break; + case "schemaDefinitions": + thing.SchemaDefinitions = MapTracker.Deserialize(ref reader); + break; + case "forms": + thing.Forms = ArrayTracker.Deserialize(ref reader); + break; + case "actions": + thing.Actions = MapTracker.Deserialize(ref reader); + break; + case "properties": + thing.Properties = MapTracker.Deserialize(ref reader); + break; + case "events": + thing.Events = MapTracker.Deserialize(ref reader); + break; + default: + reader.Skip(); + break; + } + + reader.Read(); + } + + return thing; + } } } diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/NumberHolder.cs b/codegen2/src/Azure.Iot.Operations.TDParser/NumberHolder.cs new file mode 100644 index 0000000000..e1fb426929 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TDParser/NumberHolder.cs @@ -0,0 +1,36 @@ +namespace Azure.Iot.Operations.TDParser +{ + using System; + using System.Collections.Generic; + using System.Text.Json; + + public class NumberHolder : BaseHolder, IEquatable, IDeserializable + { + public virtual bool Equals(NumberHolder? other) + { + if (other == null) + { + return false; + } + else + { + return Value == other.Value; + } + } + + public static NumberHolder Deserialize(ref Utf8JsonReader reader) + { + if (reader.TokenType != JsonTokenType.Number) + { + throw new InvalidOperationException($"expected JSON number but found {reader.TokenType}"); + } + + return new NumberHolder { Value = reader.GetDouble() }; + } + + public IEnumerable Traverse() + { + yield break; + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/ObjectHolder.cs b/codegen2/src/Azure.Iot.Operations.TDParser/ObjectHolder.cs new file mode 100644 index 0000000000..50ea1fb0af --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TDParser/ObjectHolder.cs @@ -0,0 +1,87 @@ +namespace Azure.Iot.Operations.TDParser +{ + using System; + using System.Collections.Generic; + using System.Text.Json; + + public class ObjectHolder : IEquatable, IDeserializable + { + public required object Value { get; set; } + + public virtual bool Equals(ObjectHolder? other) + { + if (other == null) + { + return false; + } + else + { + return Value == other.Value; + } + } + + public override int GetHashCode() + { + return Value.GetHashCode(); + } + + public static bool operator ==(ObjectHolder? left, ObjectHolder? right) + { + if (left is null) + { + return right is null; + } + else + { + return left.Equals(right); + } + } + + public static bool operator !=(ObjectHolder? left, ObjectHolder? right) + { + return !(left == right); + } + + public override bool Equals(object? obj) + { + if (ReferenceEquals(this, obj)) + { + return true; + } + else if (ReferenceEquals(obj, null)) + { + return false; + } + else if (obj is not ObjectHolder other) + { + return false; + } + else + { + return Equals(other); + } + } + + public static ObjectHolder Deserialize(ref Utf8JsonReader reader) + { + switch (reader.TokenType) + { + case JsonTokenType.String: + return new ObjectHolder { Value = reader.GetString()! }; + case JsonTokenType.Number: + return new ObjectHolder { Value = reader.GetDouble() }; + case JsonTokenType.True: + return new ObjectHolder { Value = true }; + case JsonTokenType.False: + return new ObjectHolder { Value = false }; + default: + throw new InvalidOperationException($"expected primitive value but found {reader.TokenType}"); + } + } + + public IEnumerable Traverse() + { + yield break; + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/StringHolder.cs b/codegen2/src/Azure.Iot.Operations.TDParser/StringHolder.cs new file mode 100644 index 0000000000..7109ee01d2 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TDParser/StringHolder.cs @@ -0,0 +1,36 @@ +namespace Azure.Iot.Operations.TDParser +{ + using System; + using System.Collections.Generic; + using System.Text.Json; + + public class StringHolder : BaseHolder, IEquatable, IDeserializable + { + public virtual bool Equals(StringHolder? other) + { + if (other == null) + { + return false; + } + else + { + return Value == other.Value; + } + } + + public static StringHolder Deserialize(ref Utf8JsonReader reader) + { + if (reader.TokenType != JsonTokenType.String) + { + throw new InvalidOperationException($"expected JSON string but found {reader.TokenType}"); + } + + return new StringHolder { Value = reader.GetString()! }; + } + + public IEnumerable Traverse() + { + yield break; + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/TDParser.cs b/codegen2/src/Azure.Iot.Operations.TDParser/TDParser.cs index ac34597e35..0fad5255c5 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/TDParser.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/TDParser.cs @@ -7,33 +7,32 @@ public class TDParser { - private static JsonSerializerOptions serializerOptions = new JsonSerializerOptions + public static List Parse(string tdJson) { - PropertyNamingPolicy = JsonNamingPolicy.CamelCase, - Converters = - { - new ContextSpecifierJsonConverter(), - new TDStringArrayJsonConverter(), - } - }; - - public static TDThing? Parse(string tdJson) - { - return JsonSerializer.Deserialize(tdJson, serializerOptions); + return Parse(Encoding.UTF8.GetBytes(tdJson)); } - public static List ParseMultiple(string tdJson) + public static List Parse(byte[] tdJson) { - Utf8JsonReader reader = new Utf8JsonReader(Encoding.UTF8.GetBytes(tdJson)); - JsonElement rootElt = JsonElement.ParseValue(ref reader); + Utf8JsonReader reader = new Utf8JsonReader(tdJson); - if (rootElt.ValueKind == JsonValueKind.Array) + reader.Read(); + if (reader.TokenType == JsonTokenType.StartArray) { - return JsonSerializer.Deserialize>(rootElt, serializerOptions) ?? new(); + List things = new(); + + reader.Read(); + while (reader.TokenType != JsonTokenType.EndArray) + { + things.Add(TDThing.Deserialize(ref reader)); + reader.Read(); + } + + return things; } - else if (rootElt.ValueKind == JsonValueKind.Object) + else if (reader.TokenType == JsonTokenType.StartObject) { - TDThing? thing = JsonSerializer.Deserialize(rootElt, serializerOptions); + TDThing? thing = TDThing.Deserialize(ref reader); if (thing != null) { return new List { thing }; diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/ValueTracker.cs b/codegen2/src/Azure.Iot.Operations.TDParser/ValueTracker.cs new file mode 100644 index 0000000000..9534d724db --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TDParser/ValueTracker.cs @@ -0,0 +1,116 @@ +namespace Azure.Iot.Operations.TDParser +{ + using System; + using System.Collections.Generic; + using System.Text.Json; + + public class ValueTracker : IEquatable>, ISourceTracker + where T : IDeserializable + { + public required T Value { get; set; } + + public bool DeserializingFailed { get; set; } + + public string? DeserializationError { get; set; } + + public long TokenIndex { get; set; } = -1; + + public virtual bool Equals(ValueTracker? other) + { + if (other == null) + { + return false; + } + else if (Value == null || other.Value == null) + { + return Value == null && other.Value == null; + } + else + { + return Value.Equals(other.Value); + } + } + + public override int GetHashCode() + { + return Value.GetHashCode(); + } + + public static bool operator ==(ValueTracker? left, ValueTracker? right) + { + if (left is null) + { + return right is null; + } + else + { + return left.Equals(right); + } + } + + public static bool operator !=(ValueTracker? left, ValueTracker? right) + { + return !(left == right); + } + + public override bool Equals(object? obj) + { + if (ReferenceEquals(this, obj)) + { + return true; + } + else if (ReferenceEquals(obj, null)) + { + return false; + } + else if (obj is not ValueTracker other) + { + return false; + } + else + { + return Equals(other); + } + } + + public IEnumerable Traverse() + { + yield return this; + + if (Value != null) + { + foreach (ITraversable item in Value.Traverse()) + { + yield return item; + } + } + } + + public static ValueTracker Deserialize(ref Utf8JsonReader reader) + { + long tokenIndex = reader.TokenStartIndex; + + try + { + T value = T.Deserialize(ref reader); + return new ValueTracker + { + Value = value, + TokenIndex = tokenIndex, + }; + } + catch (Exception ex) + { + reader.Skip(); + + return new ValueTracker + { + Value = default!, + DeserializingFailed = true, + DeserializationError = ex.Message, + TokenIndex = tokenIndex, + }; + } + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/ISchemaStandardizer.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/ISchemaStandardizer.cs index f5735824e9..f354c83d84 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/ISchemaStandardizer.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/ISchemaStandardizer.cs @@ -7,6 +7,6 @@ internal interface ISchemaStandardizer { SerializationFormat SerializationFormat { get; } - List GetStandardizedSchemas(Dictionary schemaTextsByName); + bool TryGetStandardizedSchemas(Dictionary schemaTextsByName, ErrorLog errorLog, out List schemaTypes); } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs index 51f684249f..aa8e866d50 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs @@ -1,15 +1,19 @@ namespace Azure.Iot.Operations.TypeGenerator { using System; + using System.Diagnostics.CodeAnalysis; using System.Collections.Generic; using System.IO; using System.Linq; + using System.Text; using System.Text.Json; + using System.Text.RegularExpressions; using Azure.Iot.Operations.CodeGeneration; internal class JsonSchemaStandardizer : ISchemaStandardizer { - private static readonly string[] InternalDefsKeys = new string[] { "$defs", "definitions" }; + private static readonly Regex TitleRegex = new(@"^[A-Z][A-Za-z0-9]*$", RegexOptions.Compiled); + private static readonly Regex EnumValueRegex = new(@"^[A-Za-z][A-Za-z0-9_]*$", RegexOptions.Compiled); private readonly TypeNamer typeNamer; @@ -20,275 +24,926 @@ internal JsonSchemaStandardizer(TypeNamer typeNamer) public SerializationFormat SerializationFormat { get => SerializationFormat.Json; } - public List GetStandardizedSchemas(Dictionary schemaTextsByName) + public bool TryGetStandardizedSchemas(Dictionary schemaTextsByName, ErrorLog errorLog, out List schemaTypes) { - Dictionary rootElementsByName = GetRootElementsFromSchemaTexts(schemaTextsByName); + Dictionary schemaRootsByName = GetSchemaRootsFromSchemaTexts(schemaTextsByName, errorLog); - List schemaTypes = new(); + Dictionary schemaTypeDict = new(); + bool hasError = false; - foreach (KeyValuePair namedRootElt in rootElementsByName) + foreach (KeyValuePair namedSchemaRoot in schemaRootsByName) { - CollateAliasTypes(namedRootElt.Key, namedRootElt.Value, schemaTypes, rootElementsByName); - CollateSchemaTypes(namedRootElt.Key, null, namedRootElt.Value, schemaTypes, rootElementsByName); + if (!TryGetSchemaType(namedSchemaRoot.Key, null, namedSchemaRoot.Value.JsonTracker, false, schemaTypeDict, schemaRootsByName, namedSchemaRoot.Value.ErrorReporter, out _, true)) + { + hasError = true; + } - foreach (string internalDefsKey in InternalDefsKeys) + foreach (string internalDefsKey in JsonSchemaValues.InternalDefsKeys) { - if (namedRootElt.Value.TryGetProperty(internalDefsKey, out JsonElement defsElt)) + if (namedSchemaRoot.Value.JsonTracker.TryGetProperty(internalDefsKey, out JsonTracker defsTracker)) { - foreach (JsonProperty defProp in defsElt.EnumerateObject()) + foreach (KeyValuePair defProp in defsTracker.EnumerateObject()) { - CollateSchemaTypes(namedRootElt.Key, defProp.Name, defProp.Value, schemaTypes, rootElementsByName); + if (!TryGetSchemaType(namedSchemaRoot.Key, defProp.Key, defProp.Value, false, schemaTypeDict, schemaRootsByName, namedSchemaRoot.Value.ErrorReporter, out _, false)) + { + hasError = true; + } } } } } - return schemaTypes; + schemaTypes = schemaTypeDict.Values.ToList(); + return !hasError; } - private Dictionary GetRootElementsFromSchemaTexts(Dictionary schemaTextsByName) + private Dictionary GetSchemaRootsFromSchemaTexts(Dictionary schemaTextsByName, ErrorLog errorLog) { - Dictionary rootElementsByName = new(); + Dictionary schemaRootsByName = new(); foreach (KeyValuePair namedSchemaText in schemaTextsByName) { - using (JsonDocument schemaDoc = JsonDocument.Parse(namedSchemaText.Value)) + byte[] schemaBytes = Encoding.UTF8.GetBytes(namedSchemaText.Value); + string schemaFilePath = Path.GetFullPath(namedSchemaText.Key); + string schemaFolder = Path.GetDirectoryName(namedSchemaText.Value)!; + ErrorReporter errorReporter = new ErrorReporter(errorLog, schemaFilePath, schemaBytes); + Utf8JsonReader reader = new Utf8JsonReader(schemaBytes); + reader.Read(); + schemaRootsByName[namedSchemaText.Key] = new SchemaRoot(JsonTracker.Deserialize(ref reader), schemaFilePath, schemaFolder, errorReporter); + } + + return schemaRootsByName; + } + + private bool TryGetSchemaType( + string docName, + string? defKey, + JsonTracker schemaTracker, + bool orNull, + Dictionary? schemaTypes, + Dictionary schemaRootsByName, + ErrorReporter? errorReporter, + [NotNullWhen(true)] out SchemaType? schemaType, + bool isTopLevel = false) + { + schemaType = null; + bool hasError = false; + + if (schemaTracker.ValueKind != JsonValueKind.Object) + { + errorReporter?.ReportError("JSON Schema definition has non-object value", schemaTracker.TokenIndex); + return false; + } + + if (!TryGetNestedNullableJsonElement(ref schemaTracker, errorReporter, ref orNull)) + { + return false; + } + + if (schemaTracker.TryGetProperty(JsonSchemaValues.PropertyTitle, out JsonTracker titleTracker)) + { + string? title = titleTracker.GetString(); + if (titleTracker.ValueKind != JsonValueKind.String || string.IsNullOrEmpty(title)) + { + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyTitle}' property has non-string or empty value", titleTracker.TokenIndex); + hasError = true; + } + else if (!this.typeNamer.SuppressTitles && !TitleRegex.IsMatch(title)) + { + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyTitle}' property value \"{title}\" does not conform to codegen type naming rules -- it must start with an uppercase letter and contain only alphanumeric characters", titleTracker.TokenIndex); + hasError = true; + } + } + else if (isTopLevel) + { + errorReporter?.ReportError($"JSON Schema file missing top-level '{JsonSchemaValues.PropertyTitle}' property", schemaTracker.TokenIndex); + hasError = true; + } + + if (schemaTracker.TryGetProperty(JsonSchemaValues.PropertyDescription, out JsonTracker descTracker)) + { + if (descTracker.ValueKind != JsonValueKind.String) { - rootElementsByName[namedSchemaText.Key] = schemaDoc.RootElement.Clone(); + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyDescription}' property has non-string value", descTracker.TokenIndex); + hasError = true; } } - return rootElementsByName; + if (schemaTracker.TryGetProperty(JsonSchemaValues.PropertyRef, out _)) + { + return TryGetReferenceSchemaType(docName, defKey, schemaTracker, orNull, schemaTypes, schemaRootsByName, errorReporter, out schemaType) && !hasError; + } + + if (!schemaTracker.TryGetProperty(JsonSchemaValues.PropertyType, out JsonTracker typeTracker)) + { + errorReporter?.ReportError($"JSON Schema definition has neither '{JsonSchemaValues.PropertyType}' nor '{JsonSchemaValues.PropertyRef}' property", schemaTracker.TokenIndex); + return false; + } + + if (typeTracker.ValueKind != JsonValueKind.String || string.IsNullOrEmpty(typeTracker.GetString())) + { + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyType}' property has non-string or empty value", typeTracker.TokenIndex); + return false; + } + + if (hasError) + { + return false; + } + + switch (typeTracker.GetString()!) + { + case JsonSchemaValues.TypeObject: + return TryGetObjectSchemaType(docName, defKey, schemaTracker, orNull, schemaTypes, schemaRootsByName, errorReporter, out schemaType, isTopLevel); + case JsonSchemaValues.TypeArray: + return TryGetArraySchemaType(docName, defKey, schemaTracker, orNull, schemaTypes, schemaRootsByName, errorReporter, out schemaType); + case JsonSchemaValues.TypeString: + return TryGetStringSchemaType(docName, defKey, schemaTracker, orNull, schemaTypes, schemaRootsByName, errorReporter, out schemaType); + case JsonSchemaValues.TypeInteger: + return TryGetIntegerSchemaType(schemaTracker, orNull, errorReporter, out schemaType); + case JsonSchemaValues.TypeNumber: + return TryGetNumberSchemaType(schemaTracker, orNull, errorReporter, out schemaType); + case JsonSchemaValues.TypeBoolean: + return TryGetBooleanSchemaType(schemaTracker, orNull, errorReporter, out schemaType); + default: + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyType}' property has unrecognized value \"{typeTracker.GetString()}\"", typeTracker.TokenIndex); + return false; + } } - internal void CollateAliasTypes(string docName, JsonElement schemaElt, List schemaTypes, Dictionary rootElementsByName) + private bool TryGetNestedNullableJsonElement(ref JsonTracker jsonTracker, ErrorReporter? errorReporter, ref bool orNull) { - if (!schemaElt.TryGetProperty("title", out JsonElement titleElt) || !schemaElt.TryGetProperty("$ref", out JsonElement referencingElt)) + if (!jsonTracker.TryGetProperty(JsonSchemaValues.PropertyAnyOf, out JsonTracker anyOfTracker)) { - return; + return true; } - CodeName schemaName = new CodeName(this.typeNamer.GenerateTypeName(docName, null, titleElt.GetString())); + if (anyOfTracker.ValueKind != JsonValueKind.Array) + { + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyAnyOf}' property has non-array value", anyOfTracker.TokenIndex); + return false; + } - string? description = schemaElt.TryGetProperty("description", out JsonElement descElt) ? descElt.GetString() : null; + if (anyOfTracker.GetArrayLength() != 2) + { + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyAnyOf}' property must have exactly two elements to represent a nullable type", anyOfTracker.TokenIndex); + return false; + } - GetReferenceInfo(docName, referencingElt, rootElementsByName, out string refName, out string? refKey, out JsonElement refElt, out string? refTitle); - CodeName referencedName = new CodeName(this.typeNamer.GenerateTypeName(refName, refKey, refTitle)); + if (!TryDetermineNullType(anyOfTracker[0], "first", errorReporter, out bool firstIsNull) || + !TryDetermineNullType(anyOfTracker[1], "second", errorReporter, out bool secondIsNull)) + { + return false; + } - if (!referencedName.Equals(schemaName)) + if (firstIsNull && secondIsNull) + { + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyAnyOf}' property has two elements that both have type '{JsonSchemaValues.TypeNull}'", anyOfTracker.TokenIndex); + return false; + } + if (!firstIsNull && !secondIsNull) { - schemaTypes.Add(new AliasType(schemaName, description, referencedName, orNull: false)); + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyAnyOf}' property has two elements neither of which has type '{JsonSchemaValues.TypeNull}'", anyOfTracker.TokenIndex); + return false; } + + jsonTracker = firstIsNull ? anyOfTracker[1] : anyOfTracker[0]; + orNull = true; + return true; } - internal void CollateSchemaTypes(string docName, string? defKey, JsonElement schemaElt, List schemaTypes, Dictionary rootElementsByName) + private bool TryDetermineNullType(JsonTracker tracker, string ordinal, ErrorReporter? errorReporter, out bool isNull) { - if (!schemaElt.TryGetProperty("type", out JsonElement typeElt)) + isNull = false; + + if (tracker.ValueKind != JsonValueKind.Object) { - return; + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyAnyOf}' {ordinal} element is not a JSON object", tracker.TokenIndex); + return false; } - - string type = typeElt.GetString()!; - if (type == "object" && schemaElt.TryGetProperty("additionalProperties", out JsonElement addlPropsElt) && addlPropsElt.ValueKind == JsonValueKind.Object) + if (!tracker.TryGetProperty(JsonSchemaValues.PropertyType, out JsonTracker typeTracker)) + { + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyAnyOf}' {ordinal} element missing '{JsonSchemaValues.PropertyType}' property", tracker.TokenIndex); + return false; + } + if (typeTracker.ValueKind != JsonValueKind.String || string.IsNullOrEmpty(typeTracker.GetString())) { - CollateSchemaTypes(docName, defKey, addlPropsElt, schemaTypes, rootElementsByName); - return; + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyAnyOf}' {ordinal} element '{JsonSchemaValues.PropertyType}' property has non-string or empty value", typeTracker.TokenIndex); + return false; } - else if (type == "array" && schemaElt.TryGetProperty("items", out JsonElement itemsElt) && itemsElt.ValueKind == JsonValueKind.Object) + if (typeTracker.GetString() == JsonSchemaValues.TypeNull) { - CollateSchemaTypes(docName, defKey, itemsElt, schemaTypes, rootElementsByName); - return; + isNull = true; + return true; } - string? title = schemaElt.TryGetProperty("title", out JsonElement titleElt) ? titleElt.GetString() : null; - CodeName schemaName = new CodeName(this.typeNamer.GenerateTypeName(docName, defKey, title)); + return true; + } + + private bool TryGetReferenceSchemaType( + string docName, + string? defKey, + JsonTracker schemaTracker, + bool orNull, + Dictionary? schemaTypes, + Dictionary schemaRootsByName, + ErrorReporter? errorReporter, + [NotNullWhen(true)] out SchemaType? schemaType) + { + schemaType = null; + bool hasError = false; - string? description = schemaElt.TryGetProperty("description", out JsonElement descElt) ? descElt.GetString() : null; + JsonTracker referencingTracker = schemaTracker.GetProperty(JsonSchemaValues.PropertyRef); - if (schemaElt.TryGetProperty("properties", out JsonElement propertiesElt) && typeElt.GetString() == "object") + if (!TryGetReferenceInfo(docName, referencingTracker, schemaRootsByName, errorReporter, out string refName, out string? refKey, out JsonTracker refTracker)) { - foreach (JsonProperty objProp in propertiesElt.EnumerateObject()) + hasError = true; + } + + foreach (KeyValuePair prop in schemaTracker.EnumerateObject()) + { + if (prop.Key != JsonSchemaValues.PropertySchema && + prop.Key != JsonSchemaValues.PropertyRef && + prop.Key != JsonSchemaValues.PropertyTitle && + prop.Key != JsonSchemaValues.PropertyDescription) { - CollateSchemaTypes(docName, objProp.Name, objProp.Value, schemaTypes, rootElementsByName); + errorReporter?.ReportWarning($"JSON Schema element has '{JsonSchemaValues.PropertyRef}' property, so '{prop.Key}' property will be ignored", prop.Value.TokenIndex); } + } - HashSet requiredFields = schemaElt.TryGetProperty("required", out JsonElement requiredElt) ? requiredElt.EnumerateArray().Select(e => e.GetString()!).ToHashSet() : new HashSet(); - schemaTypes.Add(new ObjectType( - schemaName, - description, - propertiesElt.EnumerateObject().ToDictionary(p => new CodeName(p.Name), p => GetObjectTypeFieldInfo(docName, p.Name, p.Value, requiredFields, rootElementsByName)), orNull: false)); + if (hasError || !TryGetSchemaType(refName, refKey, refTracker, orNull, null, schemaRootsByName, null, out schemaType)) + { + return false; } - else if (schemaElt.TryGetProperty("enum", out JsonElement enumElt)) + + if (schemaTypes != null && schemaTracker.TryGetProperty(JsonSchemaValues.PropertyTitle, out JsonTracker titleTracker) && schemaType is ReferenceType refType) { - CodeName[] enumValues = enumElt.EnumerateArray().Select(e => new CodeName(e.GetString()!)).ToArray(); - schemaTypes.Add(new EnumType( - schemaName, - description, - enumValues, - orNull: false)); + CodeName schemaName = new CodeName(this.typeNamer.GenerateTypeName(docName, null, titleTracker.GetString())); + if (!refType.SchemaName.Equals(schemaName)) + { + if (schemaTypes.ContainsKey(schemaName)) + { + errorReporter?.ReportError($"JSON Schema defines duplicate type name '{schemaName.AsGiven}'", schemaTracker.TokenIndex); + return false; + } + + string? description = schemaTracker.TryGetProperty(JsonSchemaValues.PropertyDescription, out JsonTracker descTracker) ? descTracker.GetString() : null; + schemaTypes[schemaName] = new AliasType(schemaName, description, refType.SchemaName, orNull: false); + } } - } - private ObjectType.FieldInfo GetObjectTypeFieldInfo(string docName, string fieldName, JsonElement schemaElt, HashSet requiredFields, Dictionary rootElementsByName) - { - bool isRequired = requiredFields.Contains(fieldName); - return new ObjectType.FieldInfo( - GetSchemaTypeFromJsonElement(docName, fieldName, schemaElt, rootElementsByName, isOptional: !isRequired), - isRequired, - schemaElt.TryGetProperty("description", out JsonElement descElt) ? descElt.GetString() : null); + return true; } - private SchemaType GetSchemaTypeFromJsonElement(string docName, string keyName, JsonElement schemaElt, Dictionary rootElementsByName, bool isOptional) + private bool TryGetObjectSchemaType( + string docName, + string? defKey, + JsonTracker schemaTracker, + bool orNull, + Dictionary? schemaTypes, + Dictionary schemaRootsByName, + ErrorReporter? errorReporter, + [NotNullWhen(true)] out SchemaType? schemaType, + bool isTopLevel) { - bool orNull = TryGetNestedNullableJsonElement(ref schemaElt) || isOptional; + schemaType = null; - if (!schemaElt.TryGetProperty("$ref", out JsonElement referencingElt)) + if (schemaTracker.TryGetProperty(JsonSchemaValues.PropertyAdditionalProperties, out JsonTracker addlPropsTracker)) { - if (schemaElt.TryGetProperty("type", out JsonElement typeElt)) + if (addlPropsTracker.ValueKind == JsonValueKind.Object) { - string? title = schemaElt.TryGetProperty("title", out JsonElement titleElt) ? titleElt.GetString() : null; - CodeName schemaName = new CodeName(this.typeNamer.GenerateTypeName(docName, keyName, title)); + if (schemaTracker.TryGetProperty(JsonSchemaValues.PropertyProperties, out _)) + { + errorReporter?.ReportError($"JSON Schema element has both a '{JsonSchemaValues.PropertyProperties}' property and an object-valued '{JsonSchemaValues.PropertyAdditionalProperties}' property -- intended type is ambiguous between Object and Map", schemaTracker.TokenIndex); + return false; + } + + foreach (KeyValuePair prop in schemaTracker.EnumerateObject()) + { + if (prop.Key != JsonSchemaValues.PropertySchema && + prop.Key != JsonSchemaValues.PropertyType && + prop.Key != JsonSchemaValues.PropertyTitle && + prop.Key != JsonSchemaValues.PropertyAdditionalProperties && + prop.Key != JsonSchemaValues.PropertyDescription) + { + errorReporter?.ReportWarning($"JSON Schema element defines a Map type, so '{prop.Key}' property will be ignored", prop.Value.TokenIndex); + } + } + + if (!TryGetSchemaType( + docName, + defKey, + addlPropsTracker, + orNull: false, + schemaTypes, + schemaRootsByName, + errorReporter, + out SchemaType? valueSchemaType)) + { + return false; + } + + schemaType = new MapType(valueSchemaType, orNull); + return true; + } + else if (addlPropsTracker.ValueKind != JsonValueKind.False) + { + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyAdditionalProperties}' property must have a value that is either a JSON object or a literal false", addlPropsTracker.TokenIndex); + return false; + } + } + + if (schemaTracker.TryGetProperty(JsonSchemaValues.PropertyProperties, out JsonTracker propertiesTracker)) + { + bool hasError = false; + + if (propertiesTracker.ValueKind != JsonValueKind.Object) + { + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyProperties}' property has non-object value", propertiesTracker.TokenIndex); + return false; + } + + HashSet requiredFields = new(); + if (schemaTracker.TryGetProperty(JsonSchemaValues.PropertyRequired, out JsonTracker requiredTracker)) + { + if (requiredTracker.ValueKind != JsonValueKind.Array) + { + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyRequired}' property has non-array value", requiredTracker.TokenIndex); + hasError = true; + } + else + { + foreach (JsonTracker reqTracker in requiredTracker.EnumerateArray()) + { + string? reqName = reqTracker.GetString(); + if (reqTracker.ValueKind != JsonValueKind.String || string.IsNullOrEmpty(reqName)) + { + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyRequired}' element in array has non-string or empty value", reqTracker.TokenIndex); + hasError = true; + } + else if (!propertiesTracker.TryGetProperty(reqName, out _)) + { + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyRequired}' element in array has value '{reqName}' that does not correspond to any property in '{JsonSchemaValues.PropertyProperties}' element", reqTracker.TokenIndex); + hasError = true; + } + else + { + requiredFields.Add(reqName!); + } + } + } + } + + Dictionary objectFields = new(); + if (schemaTypes != null) + { + foreach (KeyValuePair objProp in propertiesTracker.EnumerateObject()) + { + bool isRequired = requiredFields.Contains(objProp.Key); + if (TryGetSchemaType( + docName, + objProp.Key, + objProp.Value, + orNull: !isRequired, + schemaTypes, + schemaRootsByName, + errorReporter, + out SchemaType? fieldSchemaType)) + { + string? fieldDesc = objProp.Value.TryGetProperty(JsonSchemaValues.PropertyDescription, out JsonTracker fieldDescTracker) ? fieldDescTracker.GetString() : null; + objectFields[new CodeName(objProp.Key)] = new ObjectType.FieldInfo(fieldSchemaType, isRequired, fieldDesc); + } + else + { + hasError = true; + } + } + } - if (typeElt.GetString() == "object" && (!schemaElt.TryGetProperty("additionalProperties", out JsonElement addlPropsElt) || addlPropsElt.ValueKind == JsonValueKind.False)) + if (!isTopLevel) + { + foreach (string internalDefsKey in JsonSchemaValues.InternalDefsKeys) { - return new ReferenceType(schemaName, isNullable: true, orNull: orNull); + if (schemaTracker.TryGetProperty(internalDefsKey, out JsonTracker internalDefsTracker)) + { + errorReporter?.ReportWarning($"JSON Schema element is not a top-level Object type definition, so '{internalDefsKey}' property will be ignored", internalDefsTracker.TokenIndex); + } } - else if (typeElt.GetString() == "string" && schemaElt.TryGetProperty("enum", out _)) + } + + foreach (KeyValuePair prop in schemaTracker.EnumerateObject()) + { + if (prop.Key != JsonSchemaValues.PropertySchema && + prop.Key != JsonSchemaValues.PropertyType && + prop.Key != JsonSchemaValues.PropertyTitle && + prop.Key != JsonSchemaValues.PropertyProperties && + prop.Key != JsonSchemaValues.PropertyAdditionalProperties && + prop.Key != JsonSchemaValues.PropertyDescription && + prop.Key != JsonSchemaValues.PropertyRequired && + !JsonSchemaValues.InternalDefsKeys.Contains(prop.Key)) { - return new ReferenceType(schemaName, isNullable: false, orNull: orNull); + errorReporter?.ReportWarning($"JSON Schema element defines an Object type, so '{prop.Key}' property will be ignored", prop.Value.TokenIndex); } } - return GetPrimitiveTypeFromJsonElement(docName, keyName, schemaElt, orNull, rootElementsByName); + if (hasError) + { + return false; + } + + string? title = schemaTracker.TryGetProperty(JsonSchemaValues.PropertyTitle, out JsonTracker titleTracker) ? titleTracker.GetString() : null; + CodeName schemaName = new CodeName(this.typeNamer.GenerateTypeName(docName, defKey, title)); + + if (schemaTypes != null) + { + if (schemaTypes.ContainsKey(schemaName)) + { + errorReporter?.ReportError($"JSON Schema defines duplicate type name '{schemaName.AsGiven}'", schemaTracker.TokenIndex); + return false; + } + + string? description = schemaTracker.TryGetProperty(JsonSchemaValues.PropertyDescription, out JsonTracker descTracker) ? descTracker.GetString() : null; + + schemaTypes[schemaName] = new ObjectType( + schemaName, + description, + objectFields, + orNull: false); + } + + schemaType = new ReferenceType(schemaName, isNullable: true, orNull: orNull); + return true; } - GetReferenceInfo(docName, referencingElt, rootElementsByName, out string refName, out string? refKey, out JsonElement refElt, out string? refTitle); - CodeName referencedName = new CodeName(this.typeNamer.GenerateTypeName(refName, refKey, refTitle)); + errorReporter?.ReportError($"JSON Schema element has neither a '{JsonSchemaValues.PropertyProperties}' property nor an object-valued '{JsonSchemaValues.PropertyAdditionalProperties}' property", schemaTracker.TokenIndex); + return false; + } + + private bool TryGetArraySchemaType( + string docName, + string? defKey, + JsonTracker schemaTracker, + bool orNull, + Dictionary? schemaTypes, + Dictionary schemaRootsByName, + ErrorReporter? errorReporter, + [NotNullWhen(true)] out SchemaType? schemaType) + { + schemaType = null; + bool hasError = false; - if (refElt.TryGetProperty("properties", out _) || refElt.TryGetProperty("enum", out _)) + if (!schemaTracker.TryGetProperty(JsonSchemaValues.PropertyItems, out JsonTracker itemsTracker)) { - string type = refElt.GetProperty("type").GetString()!; - return new ReferenceType(referencedName, type == "object", orNull); + errorReporter?.ReportError($"JSON Schema element has type '{JsonSchemaValues.TypeArray}' but no '{JsonSchemaValues.PropertyItems}' element", schemaTracker.TokenIndex); + hasError = true; + } + else if (itemsTracker.ValueKind != JsonValueKind.Object) + { + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyItems}' property has non-object value", itemsTracker.TokenIndex); + hasError = true; } - return GetPrimitiveTypeFromJsonElement(docName, keyName, refElt, orNull, rootElementsByName); + foreach (KeyValuePair prop in schemaTracker.EnumerateObject()) + { + if (prop.Key != JsonSchemaValues.PropertySchema && + prop.Key != JsonSchemaValues.PropertyType && + prop.Key != JsonSchemaValues.PropertyTitle && + prop.Key != JsonSchemaValues.PropertyItems && + prop.Key != JsonSchemaValues.PropertyDescription) + { + errorReporter?.ReportWarning($"JSON Schema element defines an Array type, so '{prop.Key}' property will be ignored", prop.Value.TokenIndex); + } + } + + if (hasError || !TryGetSchemaType( + docName, + defKey, + itemsTracker, + orNull: false, + schemaTypes, + schemaRootsByName, + errorReporter, + out SchemaType? itemSchemaType)) + { + return false; + } + + schemaType = new ArrayType(itemSchemaType, orNull); + return true; } - private bool TryGetNestedNullableJsonElement(ref JsonElement jsonElement) + private bool TryGetStringSchemaType( + string docName, + string? defKey, + JsonTracker schemaTracker, + bool orNull, + Dictionary? schemaTypes, + Dictionary schemaRootsByName, + ErrorReporter? errorReporter, + [NotNullWhen(true)] out SchemaType? schemaType) { - if (jsonElement.TryGetProperty("anyOf", out JsonElement anyOfElt) && anyOfElt.ValueKind == JsonValueKind.Array) + schemaType = null; + int modifierCount = 0; + bool hasError = false; + + if (!schemaTracker.TryGetProperty(JsonSchemaValues.PropertyEnum, out JsonTracker enumTracker)) { - if (anyOfElt[0].TryGetProperty("type", out JsonElement typeElt) && typeElt.GetString() == "null") + if (schemaTracker.TryGetProperty(JsonSchemaValues.PropertyFormat, out JsonTracker formatTracker)) { - jsonElement = anyOfElt[1]; - return true; + modifierCount++; + if (formatTracker.ValueKind != JsonValueKind.String || string.IsNullOrEmpty(formatTracker.GetString())) + { + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyFormat}' property has non-string or empty value", formatTracker.TokenIndex); + hasError = true; + } } - else if (anyOfElt[1].TryGetProperty("type", out typeElt) && typeElt.GetString() == "null") + if (schemaTracker.TryGetProperty(JsonSchemaValues.PropertyContentEncoding, out JsonTracker encodingTracker)) { - jsonElement = anyOfElt[0]; - return true; + modifierCount++; + if (encodingTracker.ValueKind != JsonValueKind.String || string.IsNullOrEmpty(encodingTracker.GetString())) + { + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyContentEncoding}' property has non-string or empty value", encodingTracker.TokenIndex); + hasError = true; + } + } + if (schemaTracker.TryGetProperty(JsonSchemaValues.PropertyPattern, out JsonTracker patternTracker)) + { + modifierCount++; + if (patternTracker.ValueKind != JsonValueKind.String || string.IsNullOrEmpty(patternTracker.GetString())) + { + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyPattern}' property has non-string or empty value", patternTracker.TokenIndex); + hasError = true; + } } - } - return false; - } + if (modifierCount > 1) + { + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.TypeString}' type can have at most one of '{JsonSchemaValues.PropertyFormat}', '{JsonSchemaValues.PropertyContentEncoding}', or '{JsonSchemaValues.PropertyPattern}' properties", schemaTracker.TokenIndex); + hasError = true; + } - private SchemaType GetPrimitiveTypeFromJsonElement(string docName, string keyName, JsonElement schemaElt, bool orNull, Dictionary rootElementsByName) - { - switch (schemaElt.GetProperty("type").GetString()) - { - case "array": - return new ArrayType(GetSchemaTypeFromJsonElement(docName, keyName, schemaElt.GetProperty("items"), rootElementsByName, isOptional: false), orNull); - case "object": - JsonElement typeAndAddendaElt = schemaElt.GetProperty("additionalProperties"); - return new MapType(GetSchemaTypeFromJsonElement(docName, keyName, typeAndAddendaElt, rootElementsByName, isOptional: false), orNull); - case "boolean": - return new BooleanType(orNull); - case "number": - return schemaElt.GetProperty("format").GetString() == "float" ? new FloatType(orNull) : new DoubleType(orNull); - case "integer": - if (schemaElt.TryGetProperty("maximum", out JsonElement maxElt)) + foreach (KeyValuePair prop in schemaTracker.EnumerateObject()) + { + if (prop.Key != JsonSchemaValues.PropertySchema && + prop.Key != JsonSchemaValues.PropertyType && + prop.Key != JsonSchemaValues.PropertyFormat && + prop.Key != JsonSchemaValues.PropertyContentEncoding && + prop.Key != JsonSchemaValues.PropertyPattern && + prop.Key != JsonSchemaValues.PropertyDescription) { - return maxElt.GetUInt64() switch - { - < 128 => new ByteType(orNull), - < 256 => new UnsignedByteType(orNull), - < 32768 => new ShortType(orNull), - < 65536 => new UnsignedShortType(orNull), - < 2147483648 => new IntegerType(orNull), - < 4294967296 => new UnsignedIntegerType(orNull), - < 9223372036854775808 => new LongType(orNull), - _ => new UnsignedLongType(orNull), - }; + errorReporter?.ReportWarning($"JSON Schema element defines a String type, so '{prop.Key}' property will be ignored", prop.Value.TokenIndex); } - else + } + + if (hasError) + { + return false; + } + + if (formatTracker.ValueKind == JsonValueKind.String) + { + switch (formatTracker.GetString()!) { - return schemaElt.TryGetProperty("minimum", out JsonElement minElt) && minElt.GetInt64() >= 0 ? new UnsignedLongType(orNull) : new LongType(orNull); + case JsonSchemaValues.FormatDate: + schemaType = new DateType(orNull); + return true; + case JsonSchemaValues.FormatDateTime: + schemaType = new DateTimeType(orNull); + return true; + case JsonSchemaValues.FormatTime: + schemaType = new TimeType(orNull); + return true; + case JsonSchemaValues.FormatDuration: + schemaType = new DurationType(orNull); + return true; + case JsonSchemaValues.FormatUuid: + schemaType = new UuidType(orNull); + return true; + default: + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyFormat}' property has unrecognized value \"{formatTracker.GetString()}\"", formatTracker.TokenIndex); + return false; } - case "string": - if (schemaElt.TryGetProperty("format", out JsonElement formatElt)) + } + + if (encodingTracker.ValueKind == JsonValueKind.String) + { + switch (encodingTracker.GetString()!) { - return formatElt.GetString() switch - { - "date" => new DateType(orNull), - "date-time" => new DateTimeType(orNull), - "time" => new TimeType(orNull), - "duration" => new DurationType(orNull), - "uuid" => new UuidType(orNull), - _ => throw new Exception($"unrecognized 'string' schema (format = {formatElt.GetString()})"), - }; + case JsonSchemaValues.ContentEncodingBase64: + schemaType = new BytesType(orNull); + return true; + default: + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyContentEncoding}' property has unrecognized value \"{encodingTracker.GetString()}\"", encodingTracker.TokenIndex); + return false; } - if (schemaElt.TryGetProperty("contentEncoding", out JsonElement encodingElt)) + } + + if (patternTracker.ValueKind == JsonValueKind.String) + { + switch (patternTracker.GetString()) { - return encodingElt.GetString() switch - { - "base64" => new BytesType(orNull), - _ => throw new Exception($"unrecognized 'string' schema (contentEncoding = {encodingElt.GetString()})"), - }; + case JsonSchemaValues.PatternDecimal: + schemaType = new DecimalType(orNull); + return true; + default: + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyPattern}' property has unprocessable value \"{patternTracker.GetString()}\"", patternTracker.TokenIndex); + return false; + } + } + + schemaType = new StringType(orNull); + return true; + } + + List enumValues = new(); + if (enumTracker.ValueKind != JsonValueKind.Array) + { + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyEnum}' property has non-array value", enumTracker.TokenIndex); + hasError = true; + } + else + { + foreach (JsonTracker valueTracker in enumTracker.EnumerateArray()) + { + if (valueTracker.ValueKind != JsonValueKind.String || string.IsNullOrEmpty(valueTracker.GetString())) + { + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyEnum}' element in array has non-string or empty value", valueTracker.TokenIndex); + hasError = true; } - if (schemaElt.TryGetProperty("pattern", out JsonElement patternElt)) + else if (!EnumValueRegex.IsMatch(valueTracker.GetString()!)) { - return patternElt.GetString() switch - { - "^(?:\\+|-)?(?:[1-9][0-9]*|0)(?:\\.[0-9]*)?$" => new DecimalType(orNull), - _ => throw new Exception($"unrecognized 'string' schema (pattern = {patternElt.GetString()})"), - }; + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyEnum}' element value \"{valueTracker.GetString()}\"must start with a letter and contain only alphanumerics and underscores", valueTracker.TokenIndex); + hasError = true; } - return new StringType(orNull); - default: - throw new Exception($"unrecognized schema (type = {schemaElt.GetProperty("type").GetString()})"); + else + { + enumValues.Add(new CodeName(valueTracker.GetString()!)); + } + } + } + + foreach (KeyValuePair prop in schemaTracker.EnumerateObject()) + { + if (prop.Key != JsonSchemaValues.PropertySchema && + prop.Key != JsonSchemaValues.PropertyType && + prop.Key != JsonSchemaValues.PropertyTitle && + prop.Key != JsonSchemaValues.PropertyEnum && + prop.Key != JsonSchemaValues.PropertyDescription) + { + errorReporter?.ReportWarning($"JSON Schema element defines an enumerated String type, so '{prop.Key}' property will be ignored", prop.Value.TokenIndex); + } + } + + if (hasError) + { + return false; + } + + string? title = schemaTracker.TryGetProperty(JsonSchemaValues.PropertyTitle, out JsonTracker titleTracker) ? titleTracker.GetString() : null; + CodeName schemaName = new CodeName(this.typeNamer.GenerateTypeName(docName, defKey, title)); + + if (schemaTypes != null) + { + if (schemaTypes.ContainsKey(schemaName)) + { + errorReporter?.ReportError($"JSON Schema defines duplicate type name '{schemaName.AsGiven}'", schemaTracker.TokenIndex); + return false; + } + + string? description = schemaTracker.TryGetProperty(JsonSchemaValues.PropertyDescription, out JsonTracker descTracker) ? descTracker.GetString() : null; + + schemaTypes[schemaName] = new EnumType( + schemaName, + description, + enumValues.ToArray(), + orNull: false); + } + + schemaType = new ReferenceType(schemaName, isNullable: true, orNull: orNull); + return true; + } + + private bool TryGetIntegerSchemaType(JsonTracker schemaTracker, bool orNull, ErrorReporter? errorReporter, [NotNullWhen(true)] out SchemaType? schemaType) + { + schemaType = null; + bool hasError = false; + long minimum = 0; + ulong maximum = ulong.MaxValue; + + if (schemaTracker.TryGetProperty(JsonSchemaValues.PropertyMaximum, out JsonTracker maxTracker)) + { + if (maxTracker.ValueKind != JsonValueKind.Number) + { + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyMaximum}' property has non-numeric value", maxTracker.TokenIndex); + hasError = true; + } + else if (!double.IsInteger(maxTracker.GetDouble())) + { + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyMaximum}' property has non-integer numeric value", maxTracker.TokenIndex); + hasError = true; + } + else if (maxTracker.GetDouble() < 0) + { + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyMaximum}' property has negative value", maxTracker.TokenIndex); + hasError = true; + } + else + { + maximum = maxTracker.GetUInt64(); + } + } + + if (schemaTracker.TryGetProperty(JsonSchemaValues.PropertyMinimum, out JsonTracker minTracker)) + { + if (minTracker.ValueKind != JsonValueKind.Number) + { + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyMinimum}' property has non-numeric value", minTracker.TokenIndex); + hasError = true; + } + else if (!double.IsInteger(minTracker.GetDouble())) + { + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyMinimum}' property has non-integer numeric value", minTracker.TokenIndex); + hasError = true; + } + else if (minTracker.GetDouble() > 0) + { + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyMinimum}' property has positive value", minTracker.TokenIndex); + hasError = true; + } + else + { + minimum = minTracker.GetInt64(); + } + } + + foreach (KeyValuePair prop in schemaTracker.EnumerateObject()) + { + if (prop.Key != JsonSchemaValues.PropertySchema && + prop.Key != JsonSchemaValues.PropertyType && + prop.Key != JsonSchemaValues.PropertyMaximum && + prop.Key != JsonSchemaValues.PropertyMinimum && + prop.Key != JsonSchemaValues.PropertyDescription) + { + errorReporter?.ReportWarning($"JSON Schema element defines an Integer type, so '{prop.Key}' property will be ignored", prop.Value.TokenIndex); + } + } + + if (hasError) + { + return false; + } + + schemaType = (minimum, maximum) switch + { + ( >= (long)sbyte.MinValue, <= (ulong)sbyte.MaxValue) => new ByteType(orNull), + ( >= (long)byte.MinValue, <= (ulong)byte.MaxValue) => new UnsignedByteType(orNull), + ( >= (long)short.MinValue, <= (ulong)short.MaxValue) => new ShortType(orNull), + ( >= (long)ushort.MinValue, <= (ulong)ushort.MaxValue) => new UnsignedShortType(orNull), + ( >= (long)int.MinValue, <= (ulong)int.MaxValue) => new IntegerType(orNull), + ( >= (long)uint.MinValue, <= (ulong)uint.MaxValue) => new UnsignedIntegerType(orNull), + ( >= (long)long.MinValue, <= (ulong)long.MaxValue) => new LongType(orNull), + ( >= (long)ulong.MinValue, <= (ulong)ulong.MaxValue) => new UnsignedLongType(orNull), + _ => new UnsignedLongType(orNull), + }; + + return true; + } + + private bool TryGetNumberSchemaType(JsonTracker schemaTracker, bool orNull, ErrorReporter? errorReporter, [NotNullWhen(true)] out SchemaType? schemaType) + { + schemaType = null; + bool hasError = false; + bool isDouble = true; + + if (schemaTracker.TryGetProperty(JsonSchemaValues.PropertyFormat, out JsonTracker formatTracker)) + { + if (formatTracker.ValueKind != JsonValueKind.String || string.IsNullOrEmpty(formatTracker.GetString())) + { + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyFormat}' property has non-string or empty value", formatTracker.TokenIndex); + hasError = true; + } + else + { + switch (formatTracker.GetString()!) + { + case JsonSchemaValues.FormatFloat: + isDouble = false; + break; + case JsonSchemaValues.FormatDouble: + isDouble = true; + break; + default: + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyFormat}' property has unrecognized value -- must be either '{JsonSchemaValues.FormatFloat}' or '{JsonSchemaValues.FormatDouble}'", formatTracker.TokenIndex); + hasError = true; + break; + } + } + } + + foreach (KeyValuePair prop in schemaTracker.EnumerateObject()) + { + if (prop.Key != JsonSchemaValues.PropertySchema && + prop.Key != JsonSchemaValues.PropertyType && + prop.Key != JsonSchemaValues.PropertyFormat && + prop.Key != JsonSchemaValues.PropertyDescription) + { + errorReporter?.ReportWarning($"JSON Schema element defines a Number type, so '{prop.Key}' property will be ignored", prop.Value.TokenIndex); + } + } + + if (hasError) + { + return false; } + + schemaType = isDouble ? new DoubleType(orNull) : new FloatType(orNull); + return true; + } + + private bool TryGetBooleanSchemaType(JsonTracker schemaTracker, bool orNull, ErrorReporter? errorReporter, [NotNullWhen(true)] out SchemaType? schemaType) + { + foreach (KeyValuePair prop in schemaTracker.EnumerateObject()) + { + if (prop.Key != JsonSchemaValues.PropertySchema && + prop.Key != JsonSchemaValues.PropertyType && + prop.Key != JsonSchemaValues.PropertyDescription) + { + errorReporter?.ReportWarning($"JSON Schema element defines a Boolean type, so '{prop.Key}' property will be ignored", prop.Value.TokenIndex); + } + } + + schemaType = new BooleanType(orNull); + return true; } - private void GetReferenceInfo( + private bool TryGetReferenceInfo( string docName, - JsonElement referencingElt, - Dictionary rootElementsByName, + JsonTracker referencingTracker, + Dictionary schemaRootsByName, + ErrorReporter? errorReporter, out string referencedName, out string? referencedKey, - out JsonElement referencedElt, - out string? referencedTitle) + out JsonTracker referencedTracker) { - string refString = Uri.UnescapeDataString(referencingElt.GetString()!); - int fragIx = refString.IndexOf('#'); + referencedName = string.Empty; + referencedKey = null; + referencedTracker = new JsonTracker(); + + if (referencingTracker.ValueKind != JsonValueKind.String) + { + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyRef}' property has non-string value", referencingTracker.TokenIndex); + return false; + } + + if (string.IsNullOrEmpty(referencingTracker.GetString())) + { + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyRef}' property has empty string value", referencingTracker.TokenIndex); + return false; + } + + string refString = referencingTracker.GetString()!; + string unescapedString = Uri.UnescapeDataString(refString); + int fragIx = unescapedString.IndexOf('#'); string baseRef = fragIx switch { - < 0 => refString, - > 0 => refString.Substring(0, fragIx), + < 0 => unescapedString, + > 0 => unescapedString.Substring(0, fragIx), 0 => docName, }; - string fragment = fragIx < 0 ? string.Empty : refString.Substring(fragIx + 2); + string fragment = fragIx < 0 ? string.Empty : unescapedString.Substring(fragIx + 2); referencedName = Path.GetFullPath(Path.Combine(Path.GetDirectoryName(docName)!, baseRef)).Replace('\\', '/'); - JsonElement rootElt = rootElementsByName[referencedName]; + if (!schemaRootsByName.TryGetValue(referencedName, out SchemaRoot? schemaRoot) || schemaRoot == null) + { + errorReporter?.ReportReferenceError($"JSON Schema '{JsonSchemaValues.PropertyRef}' value", $"no file provided with name {referencedName}", refString, referencingTracker.TokenIndex); + return false; + } int sepIx = fragment.IndexOf('/'); string? refCollection = sepIx > 0 ? fragment.Substring(0, sepIx) : null; referencedKey = sepIx > 0 ? fragment.Substring(sepIx + 1) : null; - referencedElt = referencedKey != null ? rootElt.GetProperty(refCollection!).GetProperty(referencedKey) : rootElt; - referencedTitle = referencedElt.GetProperty("title").GetString()!; + if (referencedKey != null) + { + if (!schemaRoot.JsonTracker.TryGetProperty(refCollection!, out JsonTracker collectionTracker)) + { + errorReporter?.ReportReferenceError($"JSON Schema '{JsonSchemaValues.PropertyRef}' value", $"no root '{refCollection}' property found in {referencedName}", refString, referencingTracker.TokenIndex); + return false; + } + + if (!collectionTracker.TryGetProperty(referencedKey, out referencedTracker)) + { + errorReporter?.ReportReferenceError($"JSON Schema '{JsonSchemaValues.PropertyRef}' value", $"no '{referencedKey}' property found under root '{refCollection}' property in {referencedName}", refString, referencingTracker.TokenIndex); + return false; + } + } + else + { + referencedTracker = schemaRoot.JsonTracker; + } + + return true; } } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaValues.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaValues.cs new file mode 100644 index 0000000000..b252883700 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaValues.cs @@ -0,0 +1,45 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + public static class JsonSchemaValues + { + public const string PropertyAdditionalProperties = "additionalProperties"; + public const string PropertyAnyOf = "anyOf"; + public const string PropertyContentEncoding = "contentEncoding"; + public const string PropertyDescription = "description"; + public const string PropertyEnum = "enum"; + public const string PropertyFormat = "format"; + public const string PropertyItems = "items"; + public const string PropertyMaximum = "maximum"; + public const string PropertyMinimum = "minimum"; + public const string PropertyPattern = "pattern"; + public const string PropertyProperties = "properties"; + public const string PropertyRef = "$ref"; + public const string PropertyRequired = "required"; + public const string PropertySchema = "$schema"; + public const string PropertyTitle = "title"; + public const string PropertyType = "type"; + + public const string TypeArray = "array"; + public const string TypeInteger = "integer"; + public const string TypeNumber = "number"; + public const string TypeObject = "object"; + public const string TypeString = "string"; + public const string TypeBoolean = "boolean"; + public const string TypeNull = "null"; + + public const string FormatDouble = "double"; + public const string FormatFloat = "float"; + + public const string FormatDate = "date"; + public const string FormatDateTime = "date-time"; + public const string FormatDuration = "duration"; + public const string FormatTime = "time"; + public const string FormatUuid = "uuid"; + + public const string ContentEncodingBase64 = "base64"; + + public const string PatternDecimal = "^(?:\\+|-)?(?:[1-9][0-9]*|0)(?:\\.[0-9]*)?$"; + + public static readonly string[] InternalDefsKeys = { "$defs", "definitions" }; + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonTracker.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonTracker.cs new file mode 100644 index 0000000000..1f14c9a34c --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonTracker.cs @@ -0,0 +1,194 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + using System; + using System.Collections.Generic; + using System.Diagnostics.CodeAnalysis; + using System.Text.Json; + + public class JsonTracker + { + private string stringValue = string.Empty; + private double doubleValue = 0.0; + private ulong uint64Value = 0; + private long int64Value = 0; + private Dictionary objectProperties = new Dictionary(); + private List arrayItems = new List(); + + public long TokenIndex { get; set; } = -1; + + public JsonValueKind ValueKind { get; set; } = JsonValueKind.Undefined; + + public JsonTracker this[int index] + { + get + { + if (ValueKind != JsonValueKind.Array) + { + throw new InvalidOperationException($"Cannot index into JSON token of kind {ValueKind}"); + } + return arrayItems[index]; + } + } + + public string GetString() + { + return stringValue; + } + + public double GetDouble() + { + if (ValueKind != JsonValueKind.Number) + { + throw new InvalidOperationException($"Cannot get double value from JSON token of kind {ValueKind}"); + } + return doubleValue; + } + + public ulong GetUInt64() + { + if (ValueKind != JsonValueKind.Number) + { + throw new InvalidOperationException($"Cannot get ulong value from JSON token of kind {ValueKind}"); + } + return uint64Value; + } + + public long GetInt64() + { + if (ValueKind != JsonValueKind.Number) + { + throw new InvalidOperationException($"Cannot get long value from JSON token of kind {ValueKind}"); + } + return int64Value; + } + + public bool GetBoolean() + { + if (ValueKind != JsonValueKind.True && ValueKind != JsonValueKind.False) + { + throw new InvalidOperationException($"Cannot get boolean value from JSON token of kind {ValueKind}"); + } + return ValueKind == JsonValueKind.True; + } + + public IEnumerable> EnumerateObject() + { + if (ValueKind != JsonValueKind.Object) + { + throw new InvalidOperationException($"Cannot enumerate object properties from JSON token of kind {ValueKind}"); + } + + foreach (KeyValuePair kvp in objectProperties) + { + yield return kvp; + } + } + + public IEnumerable EnumerateArray() + { + if (ValueKind != JsonValueKind.Array) + { + throw new InvalidOperationException($"Cannot enumerate array items from JSON token of kind {ValueKind}"); + } + foreach (JsonTracker item in arrayItems) + { + yield return item; + } + } + + public bool TryGetProperty(string propertyName, [NotNullWhen(true)] out JsonTracker value) + { + if (ValueKind == JsonValueKind.Object && objectProperties.TryGetValue(propertyName, out JsonTracker? innerValue)) + { + value = innerValue; + return true; + } + else + { + value = new JsonTracker(); + return false; + } + } + + public JsonTracker GetProperty(string propertyName) + { + if (!TryGetProperty(propertyName, out JsonTracker value)) + { + throw new KeyNotFoundException($"Property '{propertyName}' not found in JSON object."); + } + + return value; + } + + public int GetArrayLength() + { + if (ValueKind != JsonValueKind.Array) + { + throw new InvalidOperationException($"Cannot get array length from JSON token of kind {ValueKind}"); + } + return arrayItems.Count; + } + + public static JsonTracker Deserialize(ref Utf8JsonReader reader) + { + JsonTracker tracker = new JsonTracker + { + TokenIndex = reader.TokenStartIndex, + }; + + switch (reader.TokenType) + { + case JsonTokenType.None: + tracker.ValueKind = JsonValueKind.Undefined; + break; + case JsonTokenType.StartObject: + tracker.ValueKind = JsonValueKind.Object; + reader.Read(); + while (reader.TokenType == JsonTokenType.PropertyName) + { + string propertyName = reader.GetString()!; + reader.Read(); + tracker.objectProperties[propertyName] = Deserialize(ref reader); + reader.Read(); + } + break; + case JsonTokenType.StartArray: + tracker.ValueKind = JsonValueKind.Array; + reader.Read(); + while (reader.TokenType != JsonTokenType.EndArray) + { + tracker.arrayItems.Add(Deserialize(ref reader)); + reader.Read(); + } + break; + case JsonTokenType.String: + tracker.ValueKind = JsonValueKind.String; + tracker.stringValue = reader.GetString() ?? string.Empty; + break; + case JsonTokenType.Number: + tracker.ValueKind = JsonValueKind.Number; + tracker.doubleValue = reader.GetDouble(); + if (reader.TryGetUInt64(out ulong uint64Value)) + { + tracker.uint64Value = uint64Value; + } + if (reader.TryGetInt64(out long int64Value)) + { + tracker.int64Value = int64Value; + } + break; + case JsonTokenType.True: + tracker.ValueKind = JsonValueKind.True; + break; + case JsonTokenType.False: + tracker.ValueKind = JsonValueKind.False; + break; + case JsonTokenType.Null: + tracker.ValueKind = JsonValueKind.Null; + break; + } + + return tracker; + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/SchemaRoot.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/SchemaRoot.cs new file mode 100644 index 0000000000..a69ad6cc75 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/SchemaRoot.cs @@ -0,0 +1,7 @@ +namespace Azure.Iot.Operations.TypeGenerator +{ + using System.Text.Json; + using Azure.Iot.Operations.CodeGeneration; + + public record SchemaRoot(JsonTracker JsonTracker, string FileName, string DirectoryName, ErrorReporter ErrorReporter); +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/TypeGenerator.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/TypeGenerator.cs index 6b9e1a5140..69460035a0 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/TypeGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/TypeGenerator.cs @@ -8,8 +8,9 @@ public class TypeGenerator { private ISchemaStandardizer schemaStandardizer; private ITypeGenerator typeGenerator; + private ErrorLog errorLog; - public TypeGenerator(SerializationFormat serializationFormat, TargetLanguage targetLanguage, TypeNamer typeNamer) + public TypeGenerator(SerializationFormat serializationFormat, TargetLanguage targetLanguage, TypeNamer typeNamer, ErrorLog errorLog) { this.schemaStandardizer = serializationFormat switch { @@ -23,6 +24,8 @@ public TypeGenerator(SerializationFormat serializationFormat, TargetLanguage tar TargetLanguage.Rust => new RustTypeGenerator(), _ => throw new NotSupportedException($"Target language {targetLanguage} is not supported."), }; + + this.errorLog = errorLog; } public List GenerateTypes(Dictionary schemaTextsByName, CodeName genNamespace, string projectName, string srcSubdir) @@ -31,11 +34,14 @@ public List GenerateTypes(Dictionary schemaTextsB CycleBreaker cycleBreaker = new (this.typeGenerator.TargetLanguage); - foreach (SchemaType schemaType in schemaStandardizer.GetStandardizedSchemas(schemaTextsByName)) + if (schemaStandardizer.TryGetStandardizedSchemas(schemaTextsByName, this.errorLog, out List standardizedSchemas)) { - cycleBreaker.AddIndirectionAsNeeded(schemaType); + foreach (SchemaType schemaType in standardizedSchemas) + { + cycleBreaker.AddIndirectionAsNeeded(schemaType); - generatedTypes.Add(this.typeGenerator.GenerateTypeFromSchema(schemaType, projectName, genNamespace, schemaStandardizer.SerializationFormat, srcSubdir)); + generatedTypes.Add(this.typeGenerator.GenerateTypeFromSchema(schemaType, projectName, genNamespace, schemaStandardizer.SerializationFormat, srcSubdir)); + } } return generatedTypes; diff --git a/codegen2/src/EnvoyTester/EnvoyTester.csproj b/codegen2/src/EnvoyTester/EnvoyTester.csproj deleted file mode 100644 index 7d1c0c3529..0000000000 --- a/codegen2/src/EnvoyTester/EnvoyTester.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - - Exe - net9.0 - enable - - - - - - - diff --git a/codegen2/src/EnvoyTester/Program.cs b/codegen2/src/EnvoyTester/Program.cs deleted file mode 100644 index 6710d3c830..0000000000 --- a/codegen2/src/EnvoyTester/Program.cs +++ /dev/null @@ -1,78 +0,0 @@ -namespace EnvoyTester -{ - using System; - using System.Collections.Generic; - using System.IO; - using System.Linq; - using Azure.Iot.Operations.CodeGeneration; - using Azure.Iot.Operations.TDParser; - using Azure.Iot.Operations.TDParser.Model; - using Azure.Iot.Operations.EnvoyGenerator; - - internal class Program - { - static void Main(string[] args) - { - if (args.Length < 5) - { - Console.WriteLine("Usage: EnvoyTester C#|Rust "); - return; - } - - DirectoryInfo modelFolder = new DirectoryInfo(args[0]); - if (!modelFolder.Exists) - { - Console.WriteLine($"Folder not found: {modelFolder.FullName}"); - return; - } - - DirectoryInfo outputFolder = new DirectoryInfo(args[1]); - - string projectName = args[2]; - - var (targetLanguage, extension, srcSubdir) = args[3].ToLower() switch - { - "c#" => (TargetLanguage.CSharp, "cs", ""), - "rust" => (TargetLanguage.Rust, "rs", "src"), - _ => throw new NotSupportedException($"Target language {args[3]} is not supported."), - }; - - string sdkPath = Path.GetRelativePath(outputFolder.FullName, args[4]); - - Dictionary modelTextsByName = modelFolder.GetFiles("*.TD.json").ToDictionary(f => f.Name, f => File.ReadAllText(f.FullName)); - - List typeFileNames = outputFolder.GetFiles($"*.{extension}").Select(p => Path.GetFileNameWithoutExtension(p.Name)).Order().ToList(); - - foreach (KeyValuePair modelNameAndText in modelTextsByName) - { - TDThing? thing = TDParser.Parse(modelNameAndText.Value); - if (thing == null) - { - Console.WriteLine($"Failed to parse model: {modelNameAndText.Key}"); - continue; - } - - Console.WriteLine($"Processing model: {modelNameAndText.Key}"); - - string? schemaNamesFilename = thing.Links?.FirstOrDefault(l => l.Relation == TDValues.RelationSchemaNaming)?.Href; - string? schemaNameInfoText = schemaNamesFilename != null ? File.ReadAllText(Path.Combine(modelFolder.FullName, schemaNamesFilename)) : null; - SchemaNamer schemaNamer = new SchemaNamer(schemaNameInfoText); - - List serializationFormats = ThingSupport.GetSerializationFormats(new List { thing }); - - foreach (GeneratedItem genEnvoy in EnvoyGenerator.GenerateEnvoys(new List { new ParsedThing(thing, modelFolder.FullName, schemaNamer) }, serializationFormats, targetLanguage, "Namespace", projectName, sdkPath, typeFileNames, srcSubdir, true, true, true, false)) - { - DirectoryInfo folderPath = new DirectoryInfo(Path.Combine(outputFolder.FullName, genEnvoy.FolderPath)); - if (!folderPath.Exists) - { - folderPath.Create(); - } - - string filePath = Path.Combine(folderPath.FullName, genEnvoy.FileName); - File.WriteAllText(filePath, genEnvoy.Content); - Console.WriteLine($"Generated {filePath}"); - } - } - } - } -} diff --git a/codegen2/src/SchemaTester/Program.cs b/codegen2/src/SchemaTester/Program.cs deleted file mode 100644 index 0e7f11a1df..0000000000 --- a/codegen2/src/SchemaTester/Program.cs +++ /dev/null @@ -1,68 +0,0 @@ -namespace SchemaTester -{ - using System; - using System.Collections.Generic; - using System.IO; - using System.Linq; - using Azure.Iot.Operations.CodeGeneration; - using Azure.Iot.Operations.TDParser; - using Azure.Iot.Operations.TDParser.Model; - using Azure.Iot.Operations.SchemaGenerator; - - internal class Program - { - static void Main(string[] args) - { - if (args.Length < 3) - { - Console.WriteLine("Usage: SchemaTester "); - return; - } - - DirectoryInfo modelFolder = new DirectoryInfo(args[0]); - if (!modelFolder.Exists) - { - Console.WriteLine($"Folder not found: {modelFolder.FullName}"); - return; - } - - DirectoryInfo outputFolder = new DirectoryInfo(args[1]); - - string projectName = args[2]; - - Dictionary modelTextsByName = modelFolder.GetFiles("*.TD.json").ToDictionary(f => f.Name, f => File.ReadAllText(f.FullName)); - - foreach (KeyValuePair modelNameAndText in modelTextsByName) - { - TDThing? thing = TDParser.Parse(modelNameAndText.Value); - if (thing == null) - { - Console.WriteLine($"Failed to parse model: {modelNameAndText.Key}"); - continue; - } - - Console.WriteLine($"Processing model: {modelNameAndText.Key}"); - - string? schemaNamesFilename = thing.Links?.FirstOrDefault(l => l.Relation == TDValues.RelationSchemaNaming)?.Href; - string? schemaNameInfoText = schemaNamesFilename != null ? File.ReadAllText(Path.Combine(modelFolder.FullName, schemaNamesFilename)) : null; - SchemaNamer schemaNamer = new SchemaNamer(schemaNameInfoText); - - foreach (KeyValuePair> schemaSet in SchemaGenerator.GenerateSchemas(new List { new ParsedThing(thing, modelFolder.FullName, schemaNamer) }, projectName, outputFolder)) - { - foreach (GeneratedItem genSchema in schemaSet.Value) - { - DirectoryInfo folderPath = new DirectoryInfo(Path.Combine(outputFolder.FullName, genSchema.FolderPath)); - if (!folderPath.Exists) - { - folderPath.Create(); - } - - string filePath = Path.Combine(folderPath.FullName, genSchema.FileName); - File.WriteAllText(filePath, genSchema.Content); - Console.WriteLine($"Generated {filePath}"); - } - } - } - } - } -} diff --git a/codegen2/src/SchemaTester/SchemaTester.csproj b/codegen2/src/SchemaTester/SchemaTester.csproj deleted file mode 100644 index e8a4720023..0000000000 --- a/codegen2/src/SchemaTester/SchemaTester.csproj +++ /dev/null @@ -1,14 +0,0 @@ - - - - Exe - net9.0 - enable - - - - - - - - diff --git a/codegen2/src/TDParse/Program.cs b/codegen2/src/TDParse/Program.cs index ecdb3b414b..87fdeb9807 100644 --- a/codegen2/src/TDParse/Program.cs +++ b/codegen2/src/TDParse/Program.cs @@ -25,64 +25,64 @@ static void Main(string[] args) } string tdJson = File.ReadAllText(file.FullName); - List? things = TDParser.ParseMultiple(tdJson); + List? things = TDParser.Parse(tdJson); if (things != null) { TDThing? thing = things.First(); - if (thing.Context != null) + if (thing.Context?.Elements != null) { - foreach (var context in thing.Context) + foreach (var context in thing.Context.Elements) { Console.WriteLine($"@context: {context}"); } } Console.WriteLine($"ID: {thing.Id}"); Console.WriteLine($"Title: {thing.Title}"); - if (thing.Forms != null) + if (thing.Forms?.Elements != null) { - foreach (var form in thing.Forms) + foreach (var form in thing.Forms.Elements) { - Console.WriteLine($"Form href: {form.Href}"); - if (form.ContentType != null) + Console.WriteLine($"Form href: {form.Value.Href}"); + if (form.Value.ContentType != null) { - Console.WriteLine($" ContentType: {form.ContentType}"); + Console.WriteLine($" ContentType: {form.Value.ContentType}"); } - if (form.Topic != null) + if (form.Value.Topic != null) { - Console.WriteLine($" Topic: {form.Topic}"); + Console.WriteLine($" Topic: {form.Value.Topic}"); } - if (form.Op != null) + if (form.Value.Op != null) { - Console.WriteLine($" Op: {string.Join(", ", form.Op)}"); + Console.WriteLine($" Op: {string.Join(", ", form.Value.Op)}"); } } } - if (thing.Events != null) + if (thing.Events?.Entries != null) { - foreach (var evt in thing.Events) + foreach (var evt in thing.Events.Entries) { Console.WriteLine($"Event: {evt.Key}"); } } - if (thing.SchemaDefinitions != null) + if (thing.SchemaDefinitions?.Entries != null) { - foreach (var schema in thing.SchemaDefinitions) + foreach (var schema in thing.SchemaDefinitions.Entries) { Console.WriteLine($"SchemaDefinition: {schema.Key}"); - if (schema.Value.AdditionalProperties != null) + if (schema.Value.Value.AdditionalProperties != null) { - Console.WriteLine($" AdditionalProperties: {schema.Value.AdditionalProperties}"); + Console.WriteLine($" AdditionalProperties: {schema.Value.Value.AdditionalProperties}"); } } } - if (thing.Properties != null) + if (thing.Properties?.Entries != null) { - foreach (var prop in thing.Properties) + foreach (var prop in thing.Properties.Entries) { Console.WriteLine($"Property: {prop.Key}"); - if (prop.Value.AdditionalProperties != null) + if (prop.Value.Value.AdditionalProperties != null) { - Console.WriteLine($" AdditionalProperties: {prop.Value.AdditionalProperties}"); + Console.WriteLine($" AdditionalProperties: {prop.Value.Value.AdditionalProperties}"); } } } diff --git a/codegen2/src/TypeTester/Program.cs b/codegen2/src/TypeTester/Program.cs deleted file mode 100644 index 77e8bf6d43..0000000000 --- a/codegen2/src/TypeTester/Program.cs +++ /dev/null @@ -1,66 +0,0 @@ -namespace TypeTester -{ - using System; - using System.Collections.Generic; - using System.IO; - using System.Linq; - using Azure.Iot.Operations.CodeGeneration; - using Azure.Iot.Operations.TypeGenerator; - - internal class Program - { - static Dictionary FormatFilters = new() - { - { SerializationFormat.Json, "*.json" }, - }; - - static void Main(string[] args) - { - if (args.Length < 4) - { - Console.WriteLine("Usage: TypeTester C#|Rust"); - return; - } - - DirectoryInfo schemaFolder = new DirectoryInfo(args[0]); - if (!schemaFolder.Exists) - { - Console.WriteLine($"Folder not found: {schemaFolder.FullName}"); - return; - } - - DirectoryInfo outputFolder = new DirectoryInfo(args[1]); - - string projectName = args[2]; - - var (targetLanguage, srcSubdir) = args[3].ToLower() switch - { - "c#" => (TargetLanguage.CSharp, ""), - "rust" => (TargetLanguage.Rust, "src"), - _ => throw new NotSupportedException($"Target language {args[3]} is not supported."), - }; - - TypeNamer typeNamer = new TypeNamer(null); - - foreach (KeyValuePair formatFilter in FormatFilters) - { - TypeGenerator typeGenerator = new TypeGenerator(formatFilter.Key, targetLanguage, typeNamer); - - Dictionary schemaTextsByName = schemaFolder.GetFiles(formatFilter.Value).ToDictionary(f => f.FullName.Replace('\\', '/'), f => File.ReadAllText(f.FullName)); - - foreach (GeneratedItem genType in typeGenerator.GenerateTypes(schemaTextsByName, new CodeName("Namespace"), projectName, srcSubdir)) - { - DirectoryInfo folderPath = new DirectoryInfo(Path.Combine(outputFolder.FullName, genType.FolderPath)); - if (!folderPath.Exists) - { - folderPath.Create(); - } - - string filePath = Path.Combine(folderPath.FullName, genType.FileName); - File.WriteAllText(filePath, genType.Content); - Console.WriteLine($"Generated {filePath}"); - } - } - } - } -} diff --git a/codegen2/src/TypeTester/TypeTester.csproj b/codegen2/src/TypeTester/TypeTester.csproj deleted file mode 100644 index ec593e0471..0000000000 --- a/codegen2/src/TypeTester/TypeTester.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - - Exe - net9.0 - enable - - - - - - - From 049e6d3cea7ace350e144fa3129b09c34de7e80b Mon Sep 17 00:00:00 2001 From: Auto Gen Date: Mon, 1 Dec 2025 07:46:14 -0800 Subject: [PATCH 16/52] check for duplicate names in schemas --- .../ErrorLog.cs | 79 ++++++++++++++----- .../ErrorReporter.cs | 15 ++-- .../CommandHandler.cs | 5 +- .../SchemaGenerator.cs | 7 +- .../JsonSchemaStandardizer.cs | 23 +----- 5 files changed, 77 insertions(+), 52 deletions(-) diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs index deb9602a82..a168266e6e 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs @@ -5,8 +5,9 @@ public class ErrorLog { - private readonly Dictionary> registeredNames; - private readonly Dictionary> registeredReferences; + private readonly Dictionary> referencesFromThings; + private readonly Dictionary> namesInThings; + private readonly Dictionary>> schemaNames; private readonly string defaultFolder; public HashSet Warnings { get; init; } @@ -19,8 +20,9 @@ public class ErrorLog public ErrorLog(string defaultFolder) { - this.registeredNames = new Dictionary>(); - this.registeredReferences = new Dictionary>(); + this.referencesFromThings = new Dictionary>(); + this.namesInThings = new Dictionary>(); + this.schemaNames = new Dictionary>>(); this.defaultFolder = defaultFolder; Errors = new HashSet(); @@ -28,13 +30,13 @@ public ErrorLog(string defaultFolder) FatalError = null; } - public void CheckForDuplicates() + public void CheckForDuplicatesInThings() { - foreach (var (name, registrations) in registeredNames) + foreach (var (name, nameSites) in namesInThings) { - if (registrations.Count > 1) + if (nameSites.Count > 1) { - foreach (var (filename, lineNumber) in registrations) + foreach (var (filename, lineNumber) in nameSites) { AddError(ErrorLevel.Error, $"Duplicate use of generated name '{name}' across Thing Descriptions.", filename, lineNumber, crossRef: name); } @@ -42,32 +44,67 @@ public void CheckForDuplicates() } } - public void RegisterName(string name, string filename, int lineNumber) + public void CheckForDuplicatesInSchemas() { - if (!registeredNames.TryGetValue(name, out Dictionary? registrations)) + foreach (var (name, nameSites) in schemaNames) { - registrations = new(); - registeredNames[name] = registrations; - } - - if (!registrations.TryGetValue(filename, out int extantLineNumber) || extantLineNumber < 0) - { - registrations[filename] = lineNumber; + if (nameSites.Count > 1) + { + foreach (var (filename, lineNumber) in nameSites) + { + AddError(ErrorLevel.Error, $"Duplicate use of generated name '{name}' across schema definitions.", filename, lineNumber, crossRef: name); + } + } } } - public void RegisterReference(string refPath, string filename, int lineNumber, string refValue) + public void RegisterReferenceFromThing(string refPath, string filename, int lineNumber, string refValue) { string fullPath = Path.GetFullPath(Path.Combine(this.defaultFolder, refValue)).Replace('\\', '/'); - if (!registeredReferences.TryGetValue(refPath, out List? references)) + if (!referencesFromThings.TryGetValue(refPath, out List? references)) { references = new(); - registeredReferences[refPath] = references; + referencesFromThings[refPath] = references; } references.Add(new ExternalReference(filename, lineNumber, refValue)); } + public void RegisterNameInThing(string name, string filename, int lineNumber) + { + if (!namesInThings.TryGetValue(name, out Dictionary? nameSites)) + { + nameSites = new(); + namesInThings[name] = nameSites; + } + + if (!nameSites.TryGetValue(filename, out int extantLineNumber) || extantLineNumber < 0) + { + nameSites[filename] = lineNumber; + } + } + + public void RegisterSchemaName(string name, string filename, string dirpath, int lineNumber) + { + if (!schemaNames.TryGetValue(name, out List>? nameSites)) + { + nameSites = new(); + schemaNames[name] = nameSites; + } + + if (dirpath.Equals(this.defaultFolder) && namesInThings.TryGetValue(name, out Dictionary? thingNameSites)) + { + foreach (KeyValuePair thingNameSite in thingNameSites) + { + nameSites.Add(thingNameSite); + } + } + else + { + nameSites.Add(new KeyValuePair(filename, lineNumber)); + } + } + public void AddError(ErrorLevel level, string message, string filename, int lineNumber, int cfLineNumber = -1, string crossRef = "") { ErrorRecord errorRecord = new(message, filename, lineNumber, cfLineNumber, crossRef); @@ -87,7 +124,7 @@ public void AddError(ErrorLevel level, string message, string filename, int line public void AddReferenceError(string refPath, string description, string reason, string filename, int lineNumber, string refValue) { - if (registeredReferences.TryGetValue(refPath, out List? references)) + if (referencesFromThings.TryGetValue(refPath, out List? references)) { foreach (ExternalReference reference in references) { diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs index 58d444b59d..f07208e637 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs @@ -21,15 +21,20 @@ public ErrorReporter(ErrorLog errorLog, string filePath, byte[]? byteStream = nu this.byteStream = byteStream; } - public void RegisterName(string name, long byteIndex) + public void RegisterReferenceFromThing(long byteIndex, string refValue) { - this.errorLog.RegisterName(name, this.filename, GetLineNumber(byteIndex)); + string refPath = Path.GetDirectoryName(refValue) == string.Empty ? refValue : Path.GetFullPath(Path.Combine(this.basePath, refValue)).Replace('\\', '/'); + this.errorLog.RegisterReferenceFromThing(refPath, this.filename, GetLineNumber(byteIndex), refValue); } - public void RegisterReference(long byteIndex, string refValue) + public void RegisterNameInThing(string name, long byteIndex) { - string refPath = Path.GetDirectoryName(refValue) == string.Empty ? refValue : Path.GetFullPath(Path.Combine(this.basePath, refValue)).Replace('\\', '/'); - this.errorLog.RegisterReference(refPath, this.filename, GetLineNumber(byteIndex), refValue); + this.errorLog.RegisterNameInThing(name, this.filename, GetLineNumber(byteIndex)); + } + + public void RegisterSchemaName(string name, long byteIndex) + { + this.errorLog.RegisterSchemaName(name, this.filename, this.basePath, GetLineNumber(byteIndex)); } public void ReportError(string message, long byteIndex, long cfByteIndex = -1, ErrorLevel level = ErrorLevel.Error) diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs index 56e099c72a..c40450e6fc 100644 --- a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs @@ -54,7 +54,7 @@ public static int GenerateCode(OptionContainer options) Dictionary> generatedSchemas = SchemaGenerator.GenerateSchemas(parsedThings, projectName, options.WorkingDir); - errorLog.CheckForDuplicates(); + errorLog.CheckForDuplicatesInThings(); if (errorLog.HasErrors) { DisplayErrors("Schema generation", errorLog); @@ -89,6 +89,7 @@ public static int GenerateCode(OptionContainer options) generatedTypes.AddRange(typeGenerator.GenerateTypes(schemaTextsByName, new CodeName(options.GenNamespace), projectName, options.OutputSourceSubdir)); } + errorLog.CheckForDuplicatesInSchemas(); if (errorLog.HasErrors) { DisplayErrors("Type generation", errorLog); @@ -220,7 +221,7 @@ private static bool TryGetThings(ErrorReporter errorReporter, byte[] thingBytes, if (item is ValueTracker dataSchema && dataSchema.Value.Ref != null) { - errorReporter.RegisterReference(dataSchema.Value.Ref.TokenIndex, dataSchema.Value.Ref.Value.Value); + errorReporter.RegisterReferenceFromThing(dataSchema.Value.Ref.TokenIndex, dataSchema.Value.Ref.Value.Value); } } } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs index 2d84f7494e..e989c0464b 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs @@ -81,7 +81,7 @@ private static void ComputeClosureOfSchemaSpec(ErrorReporter errorReporter, Sche } closedSchemaSpecs[schemaName] = schemaSpec; - errorReporter.RegisterName(schemaName, schemaSpec.TokenIndex); + errorReporter.RegisterNameInThing(schemaName, schemaSpec.TokenIndex); if (schemaSpec is ObjectSpec objectSpec) { @@ -109,7 +109,7 @@ private static void ComputeClosureOfDataSchema(ErrorReporter errorReporter, Sche } closedSchemaSpecs[schemaName] = schemaSpec; - errorReporter.RegisterName(schemaName, schemaSpec.TokenIndex); + errorReporter.RegisterNameInThing(schemaName, schemaSpec.TokenIndex); } if (dataSchema.Value.Properties?.Entries != null) @@ -131,8 +131,7 @@ private static void ComputeClosureOfDataSchema(ErrorReporter errorReporter, Sche private static bool IsProxy(TDDataSchema dataSchema) { - return (dataSchema.Type?.Value.Value == TDValues.TypeObject && (dataSchema.AdditionalProperties == null || dataSchema.AdditionalProperties == null) && dataSchema.Properties == null) || - (dataSchema.Type?.Value.Value == TDValues.TypeArray && dataSchema.Items == null); + return dataSchema.Type?.Value.Value == TDValues.TypeObject && dataSchema.AdditionalProperties == null && dataSchema.Properties == null; } private static bool IsLocalDuplicate(ErrorReporter errorReporter, string schemaName, SchemaSpec schemaSpec, Dictionary closedSchemaSpecs) diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs index aa8e866d50..47048c2846 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs @@ -281,12 +281,7 @@ private bool TryGetReferenceSchemaType( CodeName schemaName = new CodeName(this.typeNamer.GenerateTypeName(docName, null, titleTracker.GetString())); if (!refType.SchemaName.Equals(schemaName)) { - if (schemaTypes.ContainsKey(schemaName)) - { - errorReporter?.ReportError($"JSON Schema defines duplicate type name '{schemaName.AsGiven}'", schemaTracker.TokenIndex); - return false; - } - + errorReporter?.RegisterSchemaName(schemaName.AsGiven, schemaTracker.TokenIndex); string? description = schemaTracker.TryGetProperty(JsonSchemaValues.PropertyDescription, out JsonTracker descTracker) ? descTracker.GetString() : null; schemaTypes[schemaName] = new AliasType(schemaName, description, refType.SchemaName, orNull: false); } @@ -456,14 +451,8 @@ private bool TryGetObjectSchemaType( if (schemaTypes != null) { - if (schemaTypes.ContainsKey(schemaName)) - { - errorReporter?.ReportError($"JSON Schema defines duplicate type name '{schemaName.AsGiven}'", schemaTracker.TokenIndex); - return false; - } - + errorReporter?.RegisterSchemaName(schemaName.AsGiven, schemaTracker.TokenIndex); string? description = schemaTracker.TryGetProperty(JsonSchemaValues.PropertyDescription, out JsonTracker descTracker) ? descTracker.GetString() : null; - schemaTypes[schemaName] = new ObjectType( schemaName, description, @@ -704,14 +693,8 @@ private bool TryGetStringSchemaType( if (schemaTypes != null) { - if (schemaTypes.ContainsKey(schemaName)) - { - errorReporter?.ReportError($"JSON Schema defines duplicate type name '{schemaName.AsGiven}'", schemaTracker.TokenIndex); - return false; - } - + errorReporter?.RegisterSchemaName(schemaName.AsGiven, schemaTracker.TokenIndex); string? description = schemaTracker.TryGetProperty(JsonSchemaValues.PropertyDescription, out JsonTracker descTracker) ? descTracker.GetString() : null; - schemaTypes[schemaName] = new EnumType( schemaName, description, From 328a71e4d5bcbe06bca60b1e73a3485a85312a3d Mon Sep 17 00:00:00 2001 From: Auto Gen Date: Fri, 5 Dec 2025 14:45:42 -0800 Subject: [PATCH 17/52] add ThingValidator --- .../eval/wot/TelemetryComplexSchemas.TD.json | 4 +- codegen2/eval/wot/TwoThings.TD.json | 32 +- codegen2/schema/aio-td-json-schema.json | 4 +- .../ErrorLog.cs | 6 +- .../ErrorReporter.cs | 13 +- .../TDValues.cs | 1 - .../ThingSupport.cs | 2 +- .../ThingValidator.cs | 1748 +++++++++++++++++ .../ActionEnvoyGenerator.cs | 2 +- .../EnvoyGenerator.cs | 2 +- .../dotnet/Service/t4/DotNetService.tt | 2 +- .../CommandHandler.cs | 25 +- .../ActionSchemaGenerator.cs | 2 +- .../json/JsonSchemaSupport.cs | 5 +- .../MapTracker.cs | 8 + .../Model/TDAction.cs | 23 +- .../Model/TDDataSchema.cs | 53 +- .../Model/TDEvent.cs | 17 +- .../Model/TDForm.cs | 29 +- .../Model/TDLink.cs | 26 +- .../Model/TDProperty.cs | 12 +- .../Model/TDSchemaReference.cs | 14 +- .../Model/TDThing.cs | 32 +- .../ParsingSupport.cs | 24 + 24 files changed, 1990 insertions(+), 96 deletions(-) create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TDParser/ParsingSupport.cs diff --git a/codegen2/eval/wot/TelemetryComplexSchemas.TD.json b/codegen2/eval/wot/TelemetryComplexSchemas.TD.json index e9c41980cf..10702aa9e7 100644 --- a/codegen2/eval/wot/TelemetryComplexSchemas.TD.json +++ b/codegen2/eval/wot/TelemetryComplexSchemas.TD.json @@ -123,9 +123,7 @@ }, "proximity": { "data": { - "descriptions": { - "en": "An enumerated value for expressing qualitative distance." - }, + "description": "An enumerated value for expressing qualitative distance.", "type": "integer", "minimum": -2147483648, "maximum": 2147483647 diff --git a/codegen2/eval/wot/TwoThings.TD.json b/codegen2/eval/wot/TwoThings.TD.json index 6208a31e5a..b42f7654f7 100644 --- a/codegen2/eval/wot/TwoThings.TD.json +++ b/codegen2/eval/wot/TwoThings.TD.json @@ -37,12 +37,24 @@ "Alpha": { "data": { "type": "string" - } + }, + "forms": [ + { + "href": "dtmi:jsonTest:ThingOne;1", + "op": "subscribeevent" + } + ] }, "Beta": { "data": { "type": "string" - } + }, + "forms": [ + { + "href": "dtmi:jsonTest:ThingOne;1", + "op": "subscribeevent" + } + ] } } }, @@ -84,12 +96,24 @@ "Gamma": { "data": { "type": "string" - } + }, + "forms": [ + { + "href": "dtmi:jsonTest:ThingTwo;1", + "op": "subscribeevent" + } + ] }, "Beta": { "data": { "type": "string" - } + }, + "forms": [ + { + "href": "dtmi:jsonTest:ThingTwo;1", + "op": "subscribeevent" + } + ] } } } diff --git a/codegen2/schema/aio-td-json-schema.json b/codegen2/schema/aio-td-json-schema.json index 57100f6ad9..beaa80dfcd 100644 --- a/codegen2/schema/aio-td-json-schema.json +++ b/codegen2/schema/aio-td-json-schema.json @@ -640,13 +640,13 @@ "oneOf": [ { "type": "string", - "enum": [ "invokeaction", "queryaction" ] + "enum": [ "invokeaction" ] }, { "type": "array", "items": { "type": "string", - "enum": [ "invokeaction", "queryaction" ] + "enum": [ "invokeaction" ] }, "minItems": 1 } diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs index a168266e6e..f46d68c300 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs @@ -60,11 +60,11 @@ public void CheckForDuplicatesInSchemas() public void RegisterReferenceFromThing(string refPath, string filename, int lineNumber, string refValue) { - string fullPath = Path.GetFullPath(Path.Combine(this.defaultFolder, refValue)).Replace('\\', '/'); - if (!referencesFromThings.TryGetValue(refPath, out List? references)) + string fullPath = Path.GetFullPath(Path.Combine(this.defaultFolder, refPath)).Replace('\\', '/'); + if (!referencesFromThings.TryGetValue(fullPath, out List? references)) { references = new(); - referencesFromThings[refPath] = references; + referencesFromThings[fullPath] = references; } references.Add(new ExternalReference(filename, lineNumber, refValue)); diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs index f07208e637..06da5dfdb2 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs @@ -11,9 +11,9 @@ public class ErrorReporter private ErrorLog errorLog; private string filename; private string basePath; - private byte[]? byteStream; + private byte[] byteStream; - public ErrorReporter(ErrorLog errorLog, string filePath, byte[]? byteStream = null) + public ErrorReporter(ErrorLog errorLog, string filePath, byte[] byteStream) { this.errorLog = errorLog; this.filename = Path.GetFileName(filePath); @@ -23,7 +23,7 @@ public ErrorReporter(ErrorLog errorLog, string filePath, byte[]? byteStream = nu public void RegisterReferenceFromThing(long byteIndex, string refValue) { - string refPath = Path.GetDirectoryName(refValue) == string.Empty ? refValue : Path.GetFullPath(Path.Combine(this.basePath, refValue)).Replace('\\', '/'); + string refPath = refValue.Contains('/') ? Path.GetFullPath(Path.Combine(this.basePath, refValue)).Replace('\\', '/') : refValue; this.errorLog.RegisterReferenceFromThing(refPath, this.filename, GetLineNumber(byteIndex), refValue); } @@ -76,14 +76,9 @@ public void ReportJsonException(Exception ex) private int GetLineNumber(long byteIndex) { - if (this.byteStream == null) - { - return byteIndex < 0 ? -1 : 0; - } - if (byteIndex < 0 || byteIndex >= this.byteStream.Length) { - return -1; + return 0; } int lineNum = 1; diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/TDValues.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/TDValues.cs index 7e000c4cfb..28330d6e7d 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/TDValues.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/TDValues.cs @@ -9,7 +9,6 @@ public static class TDValues public const string ContentTypeJson = "application/json"; public const string OpInvokeAction = "invokeaction"; - public const string OpQueryAction = "queryaction"; public const string OpReadProp = "readproperty"; public const string OpWriteProp = "writeproperty"; public const string OpSubEvent = "subscribeevent"; diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingSupport.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingSupport.cs index 884bc79469..6bcb74dd1e 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingSupport.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingSupport.cs @@ -86,7 +86,7 @@ private static void AddFormatsFromLinks(ErrorReporter errorReporter, IEnumerable { foreach (ValueTracker link in links) { - AddFormatFromContentType(errorReporter, link.Value.ContentType, formats); + AddFormatFromContentType(errorReporter, link.Value.Type, formats); } } } diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs new file mode 100644 index 0000000000..bd7923cae4 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs @@ -0,0 +1,1748 @@ +namespace Azure.Iot.Operations.CodeGeneration +{ + using System; + using System.Collections.Generic; + using System.Linq; + using System.Text.RegularExpressions; + using Azure.Iot.Operations.TDParser; + using Azure.Iot.Operations.TDParser.Model; + + public class ThingValidator + { + private const string TdContextUri = "https://www.w3.org/2022/wot/td/v1.1"; + private const string AioContextUriBase = "http://azure.com/DigitalTwins/dtmi#"; + private const string AioContextPrefix = "dtv"; + + private const string LinkRelSchemaNamer = "service-desc"; + + private const string Iso8601DurationExample = "P3Y6M4DT12H30M5S"; + private const string DecimalExample = "1234567890.0987654321"; + private const string AnArbitraryString = "Pretty12345Tricky67890"; + + private static readonly Regex TitleRegex = new(@"^[A-Z][A-Za-z0-9]*$", RegexOptions.Compiled); + private static readonly Regex RefCharRegex = new(@"^(?:[!#$&-;=?-\[\]_a-z~]|\%[0-9a-fA-F]{2})+$", RegexOptions.Compiled); + private static readonly Regex EnumValueRegex = new(@"^[A-Za-z][A-Za-z0-9_]*$", RegexOptions.Compiled); + + private ErrorReporter errorReporter; + + public ThingValidator(ErrorReporter errorReporter) + { + this.errorReporter = errorReporter; + } + + public bool TryValidateThng(TDThing thing) + { + bool hasError = false; + + if (!TryValidateContext(thing.Context)) + { + hasError = true; + } + + if (!TryValidateId(thing.Id)) + { + hasError = true; + } + + if (!TryValidateTitle(thing.Title)) + { + hasError = true; + } + + if (!TryValidateLinks(thing.Links)) + { + hasError = true; + } + + if (!TryValidateSchemaDefinitions(thing.SchemaDefinitions)) + { + hasError = true; + } + + if (!TryValidateRootForms(thing.Forms, thing.SchemaDefinitions)) + { + hasError = true; + } + + if (!TryValidateActions(thing.Actions, thing.SchemaDefinitions)) + { + hasError = true; + } + + if (!TryValidateProperties(thing.Properties, thing.SchemaDefinitions)) + { + hasError = true; + } + + if (!TryValidateEvents(thing.Events, thing.SchemaDefinitions)) + { + hasError = true; + } + + if (hasError) + { + return true; + } + + if (!TryValidateCrossFormConsistency(thing.Forms, thing.Actions)) + { + hasError = true; + } + + if (!TryValidateCrossFormConsistency(thing.Forms, thing.Properties)) + { + hasError = true; + } + + if (!TryValidateCrossFormConsistency(thing.Forms, thing.Events)) + { + hasError = true; + } + + CheckSchemaDefinitionsCoverage(thing.SchemaDefinitions, thing.Actions, thing.Properties); + + return !hasError; + } + + private void CheckSchemaDefinitionsCoverage(MapTracker? schemaDefinitions, MapTracker? actions, MapTracker? properties) + { + if (schemaDefinitions?.Entries == null) + { + return; + } + + HashSet unreferencedSchemaKeys = new(schemaDefinitions.Entries.Where(d => d.Value.Value.Const == null).Select(d => d.Key)); + + if (actions?.Entries != null) + { + foreach (ValueTracker action in actions.Entries.Values) + { + foreach (ValueTracker form in action.Value.Forms?.Elements ?? new()) + { + foreach (ValueTracker schemaReference in form.Value.AdditionalResponses?.Elements ?? new()) + { + if (schemaReference.Value.Schema?.Value != null) + { + unreferencedSchemaKeys.Remove(schemaReference.Value.Schema.Value.Value); + } + } + + foreach (ValueTracker schemaReference in form.Value.HeaderInfo?.Elements ?? new()) + { + if (schemaReference.Value.Schema?.Value != null) + { + unreferencedSchemaKeys.Remove(schemaReference.Value.Schema.Value.Value); + } + } + + if (form.Value.HeaderCode?.Value != null) + { + unreferencedSchemaKeys.Remove(form.Value.HeaderCode.Value.Value); + } + } + } + } + + if (properties?.Entries != null) + { + foreach (ValueTracker property in properties.Entries.Values) + { + foreach (ValueTracker form in property.Value.Forms?.Elements ?? new()) + { + foreach (ValueTracker schemaReference in form.Value.AdditionalResponses?.Elements ?? new()) + { + if (schemaReference.Value.Schema?.Value != null) + { + unreferencedSchemaKeys.Remove(schemaReference.Value.Schema.Value.Value); + } + } + } + } + } + + foreach (string unreferencedSchemaKey in unreferencedSchemaKeys) + { + errorReporter.ReportWarning($"Schema definition '{unreferencedSchemaKey}' is defined in '{TDThing.SchemaDefinitionsName}' but is neither a constant declaration nor a type that is referenced by any action or property.", schemaDefinitions.Entries[unreferencedSchemaKey].TokenIndex); + } + } + + private bool TryValidateRootForms(ArrayTracker? forms, MapTracker? schemaDefinitions) + { + if (forms?.Elements == null) + { + return true; + } + + if (!TryValidateForms(forms, FormsKind.Root, schemaDefinitions)) + { + return false; + } + + List> aggregateOps = forms.Elements.SelectMany(form => form.Value.Op?.Elements ?? new()).ToList(); + ValueTracker? writeMultiOp = aggregateOps.FirstOrDefault(op => op.Value.Value == TDValues.OpWriteMultProps); + ValueTracker? readAllOp = aggregateOps.FirstOrDefault(op => op.Value.Value == TDValues.OpReadAllProps); + if (writeMultiOp != null && readAllOp == null) + { + errorReporter.ReportError($"'{TDThing.FormsName}' array contains '{TDForm.OpName}' property with value '{TDValues.OpWriteMultProps}' but no '{TDForm.OpName}' property with value '{TDValues.OpReadAllProps}'.", writeMultiOp.TokenIndex, forms.TokenIndex); + return false; + } + + return true; + } + + private bool TryValidateCrossFormConsistency(ArrayTracker? rootForms, MapTracker? actions) + { + bool hasError = false; + + if (actions?.Entries != null) + { + foreach (KeyValuePair> action in actions.Entries) + { + if (!(action.Value.Value.Forms?.Elements?.Any(f => f.Value.Topic != null) ?? false)) + { + errorReporter.ReportError($"Action '{action.Key}' has no '{TDAction.FormsName}' element with a '{TDForm.TopicName}' property, so it cannot be invoked.", action.Value.TokenIndex); + hasError = true; + } + } + } + + return !hasError; + } + + private bool TryValidateCrossFormConsistency(ArrayTracker? rootForms, MapTracker? properties) + { + bool hasError = false; + + ValueTracker? readAllForm = rootForms?.Elements?.FirstOrDefault(f => f.Value.Op?.Elements != null && f.Value.Op.Elements.Any(op => op.Value.Value == TDValues.OpReadAllProps)); + ValueTracker? writeMultiForm = rootForms?.Elements?.FirstOrDefault(f => f.Value.Op?.Elements != null && f.Value.Op.Elements.Any(op => op.Value.Value == TDValues.OpWriteMultProps)); + + bool aggregateReadHasAdditionalResponses = (readAllForm?.Value.AdditionalResponses?.Elements?.Count ?? 0) > 0; + bool aggregateWriteHasAdditionalResponses = (writeMultiForm?.Value.AdditionalResponses?.Elements?.Count ?? 0) > 0; + + if (readAllForm != null) + { + if (properties?.Entries == null || properties.Entries.Count == 0) + { + errorReporter.ReportError($"Root-level form has '{TDForm.OpName}' property with value '{TDValues.OpReadAllProps}' to read the aggregation of all properties, but Thing Description has no properties defined.", + readAllForm.Value.Op!.Elements!.First(op => op.Value.Value == TDValues.OpReadAllProps).TokenIndex, + properties?.TokenIndex ?? -1); + hasError = true; + } + else if (aggregateReadHasAdditionalResponses && !properties.Entries.Any(p => p.Value.Value.Forms!.Elements!.Any(f => (f.Value.Op?.Elements?.Any(op => op.Value.Value == TDValues.OpReadProp) ?? true) && (f.Value.AdditionalResponses?.Elements?.Count ?? 0) > 0))) + { + errorReporter.ReportWarning($"Root-level form has '{TDForm.OpName}' value of '{TDValues.OpReadAllProps}' and an '{TDForm.AdditionalResponsesName}' value; however, no readable '{TDThing.PropertiesName}' element has a form with an '{TDForm.AdditionalResponsesName}' value to aggregate.", + readAllForm.TokenIndex, + properties?.TokenIndex ?? -1); + } + } + + if (writeMultiForm != null) + { + if (properties?.Entries == null || properties.Entries.Count(p => p.Value.Value.ReadOnly?.Value.Value != true && p.Value.Value.Forms!.Elements!.Any(f => f.Value.Op?.Elements?.Any(op => op.Value.Value == TDValues.OpWriteProp) ?? true)) == 0) + { + errorReporter.ReportError($"Root-level form has '{TDForm.OpName}' property with value '{TDValues.OpWriteMultProps}' to write a selected aggregation of writable properties, but Thing Description has no writable properties.", + writeMultiForm.Value.Op!.Elements!.First(op => op.Value.Value == TDValues.OpWriteMultProps).TokenIndex, + properties?.TokenIndex ?? -1); + hasError = true; + } + else if (aggregateWriteHasAdditionalResponses && !properties.Entries.Any(p => p.Value.Value.ReadOnly?.Value.Value != true && p.Value.Value.Forms!.Elements!.Any(f => (f.Value.Op?.Elements?.Any(op => op.Value.Value == TDValues.OpWriteProp) ?? true) && (f.Value.AdditionalResponses?.Elements?.Count ?? 0) > 0))) + { + errorReporter.ReportWarning($"Root-level form has '{TDForm.OpName}' value of '{TDValues.OpWriteMultProps}' and an '{TDForm.AdditionalResponsesName}' value; however, no writable '{TDThing.PropertiesName}' element has a form with an '{TDForm.AdditionalResponsesName}' value to aggregate.", + writeMultiForm.TokenIndex, + properties?.TokenIndex ?? -1); + } + } + + if (properties?.Entries != null) + { + foreach (KeyValuePair> prop in properties.Entries) + { + foreach (ValueTracker form in prop.Value.Value.Forms!.Elements!) + { + bool propFormHasAdditionalResponses = (form.Value.AdditionalResponses?.Elements?.Count ?? 0) > 0; + + if (form.Value.Topic == null) + { + if (form.Value.Op == null) + { + if (readAllForm == null) + { + errorReporter.ReportError($"Property '{prop.Key}' has '{TDProperty.FormsName}' element with no '{TDForm.TopicName}' property, so it cannot be read individually; however, there is no root-level form with an '{TDForm.OpName}' property that has value '{TDValues.OpReadAllProps}', so this property also cannot be read in aggregate.", + form.TokenIndex, + rootForms?.TokenIndex ?? -1); + hasError = true; + } + else if (propFormHasAdditionalResponses && !aggregateReadHasAdditionalResponses && !aggregateWriteHasAdditionalResponses) + { + errorReporter.ReportError($"Property '{prop.Key}' has '{TDProperty.FormsName}' element with no '{TDForm.TopicName}' property, so its '{TDForm.AdditionalResponsesName}' value cannot be returned on an individual read or write, nor can it be returned on an aggregate read or write because no root-level form with '{TDForm.OpName}' value of '{TDValues.OpReadAllProps}' or '{TDValues.OpWriteMultProps}' has an '{TDForm.AdditionalResponsesName}' value.", + form.TokenIndex, + rootForms?.TokenIndex ?? -1); + hasError = true; + } + } + + if (form.Value.Op?.Elements != null && form.Value.Op.Elements.Any(op => op.Value.Value == TDValues.OpReadProp)) + { + if (readAllForm == null) + { + errorReporter.ReportError($"Property '{prop.Key}' has '{TDProperty.FormsName}' element with '{TDForm.OpName}' value of '{TDValues.OpReadProp}' but no '{TDForm.TopicName}' property, so it cannot be read individually; however, there is no root-level form with an '{TDForm.OpName}' property that has value '{TDValues.OpReadAllProps}', so this property also cannot be read in aggregate.", + form.TokenIndex, + rootForms?.TokenIndex ?? -1); + hasError = true; + } + else if (propFormHasAdditionalResponses && !aggregateReadHasAdditionalResponses) + { + errorReporter.ReportError($"Property '{prop.Key}' has '{TDProperty.FormsName}' element with '{TDForm.OpName}' value of '{TDValues.OpReadProp}' but no '{TDForm.TopicName}' property, so its '{TDForm.AdditionalResponsesName}' value cannot be returned on an individual read, nor can it be returned on an aggregate read because the root-level form with '{TDForm.OpName}' value of '{TDValues.OpReadAllProps}' has no '{TDForm.AdditionalResponsesName}' value.", + form.TokenIndex, + readAllForm.TokenIndex); + hasError = true; + } + } + + if (form.Value.Op?.Elements != null && form.Value.Op.Elements.Any(op => op.Value.Value == TDValues.OpWriteProp)) + { + if (writeMultiForm == null) + { + errorReporter.ReportError($"Property '{prop.Key}' has '{TDProperty.FormsName}' element with '{TDForm.OpName}' value of '{TDValues.OpWriteProp}' but no '{TDForm.TopicName}' property, so it cannot be written individually; however, there is no root-level form with an '{TDForm.OpName}' property that has value '{TDValues.OpWriteMultProps}', so this property also cannot be written in aggregate.", + form.TokenIndex, + rootForms?.TokenIndex ?? -1); + hasError = true; + } + else if (propFormHasAdditionalResponses && (writeMultiForm.Value.AdditionalResponses?.Elements?.Count ?? 0) == 0) + { + errorReporter.ReportError($"Property '{prop.Key}' has '{TDProperty.FormsName}' element with '{TDForm.OpName}' value of '{TDValues.OpWriteProp}' but no '{TDForm.TopicName}' property, so its '{TDForm.AdditionalResponsesName}' value cannot be returned on an individual write, nor can it be returned on an aggregate write because the root-level form with '{TDForm.OpName}' value of '{TDValues.OpWriteMultProps}' has no '{TDForm.AdditionalResponsesName}' value.", + form.TokenIndex, + writeMultiForm.TokenIndex); + hasError = true; + } + } + } + } + } + } + + return !hasError; + } + + private bool TryValidateCrossFormConsistency(ArrayTracker? rootForms, MapTracker? events) + { + ValueTracker? subAllForm = rootForms?.Elements?.FirstOrDefault(f => f.Value.Op?.Elements != null && f.Value.Op.Elements.Any(op => op.Value.Value == TDValues.OpSubAllEvents)); + + bool hasError = false; + + if (events?.Entries == null || events.Entries.Count == 0) + { + if (subAllForm != null) + { + errorReporter.ReportError($"Root-level form has '{TDForm.OpName}' property with value '{TDValues.OpSubAllEvents}' to subscribe to the aggregation of all events, but Thing Description has no events defined.", + subAllForm.Value.Op!.Elements!.First(op => op.Value.Value == TDValues.OpSubAllEvents).TokenIndex, + events?.TokenIndex ?? -1); + hasError = true; + } + } + else if (subAllForm == null) + { + foreach (KeyValuePair> evt in events.Entries) + { + if (!(evt.Value.Value.Forms?.Elements?.Any(f => f.Value.Topic != null) ?? false)) + { + errorReporter.ReportError($"Event '{evt.Key}' has no '{TDEvent.FormsName}' element with a '{TDForm.TopicName}' property, so it cannot be subscribed individually; however, there is no root-level form with an '{TDForm.OpName}' property that has value '{TDValues.OpSubAllEvents}', so this event also cannot be subscribed in aggregate.", + evt.Value.TokenIndex, + rootForms?.TokenIndex ?? -1); + hasError = true; + } + } + } + + return !hasError; + } + + private bool TryValidateContext(ArrayTracker? context) + { + bool hasError = false; + + if (context?.Elements == null) + { + errorReporter.ReportError($"Thing Description is missing required '{TDThing.ContextName}' property.", -1); + return false; + } + + bool tdContextPresent = false; + bool aioContextPresent = false; + + foreach (ValueTracker contextSpecifier in context.Elements) + { + if (contextSpecifier.Value?.Remote?.Value != null) + { + string remoteContext = contextSpecifier.Value.Remote.Value.Value; + if (remoteContext != TdContextUri) + { + errorReporter.ReportWarning($"Unrecognized remote {TDThing.ContextName} \"{remoteContext}\"; value will be ignored.", contextSpecifier.TokenIndex); + } + else + { + tdContextPresent = true; + } + } + else if (contextSpecifier.Value?.Local?.Entries != null) + { + foreach (KeyValuePair> localContext in contextSpecifier.Value.Local.Entries) + { + string prefix = localContext.Key; + if (localContext.Key != AioContextPrefix) + { + errorReporter.ReportWarning($"Unrecognized local {TDThing.ContextName} term \"{localContext.Key}\"; value will be ignored.", contextSpecifier.TokenIndex); + } + else if (localContext.Value.Value.Value != AioContextUriBase) + { + errorReporter.ReportError($"Local {TDThing.ContextName} term \"{localContext.Key}\" has incorrect URI value \"{localContext.Value.Value.Value}\".", contextSpecifier.TokenIndex); + hasError = true; + } + else + { + aioContextPresent = true; + } + } + } + } + + if (!tdContextPresent) + { + errorReporter.ReportError($"Thing Description is missing required '{TDThing.ContextName}' remote URI \"{TdContextUri}\".", context.TokenIndex); + hasError = true; + } + + if (!aioContextPresent) + { + errorReporter.ReportError($"Thing Description is missing required '{TDThing.ContextName}' local term \"{AioContextPrefix}\" with URI value \"{AioContextUriBase}\".", context.TokenIndex); + hasError = true; + } + + return !hasError; + } + + private bool TryValidateId(ValueTracker? id) + { + if (id == null) + { + errorReporter.ReportError($"Thing Description is missing required '{TDThing.IdName}' property.", -1); + return false; + } + + if (string.IsNullOrWhiteSpace(id.Value.Value)) + { + errorReporter.ReportError($"Thing Description '{TDThing.IdName}' property has empty value.", id.TokenIndex); + return false; + } + + return true; + } + + private bool TryValidateTitle(ValueTracker? title) + { + if (title == null) + { + errorReporter.ReportError($"Thing Description is missing required '{TDThing.TitleName}' property.", -1); + return false; + } + + if (string.IsNullOrWhiteSpace(title.Value.Value)) + { + errorReporter.ReportError($"Thing Description '{TDThing.TitleName}' property has empty value.", title.TokenIndex); + return false; + } + + if (!TitleRegex.IsMatch(title.Value.Value)) + { + errorReporter?.ReportError($"Thing Description '{TDThing.TitleName}' property value \"{title.Value.Value}\" does not conform to codegen type naming rules -- it must start with an uppercase letter and contain only alphanumeric characters", title.TokenIndex); + return false; + } + + return true; + } + + private bool TryValidateLinks(ArrayTracker? links) + { + if (links?.Elements == null) + { + return true; + } + + bool hasError = false; + int relSchemaNamerCount = 0; + + foreach (ValueTracker link in links.Elements) + { + if (link.Value.Rel == null) + { + errorReporter.ReportWarning($"Link element is missing '{TDLink.RelName}' property; element will be ignored.", link.TokenIndex); + continue; + } + if (link.Value.Rel.Value.Value != LinkRelSchemaNamer) + { + errorReporter.ReportWarning($"Link element {TDLink.RelName} property has unrecognized value '{link.Value.Rel.Value.Value}'; element will be ignored.", link.Value.Rel.TokenIndex); + continue; + } + + relSchemaNamerCount++; + + if (link.Value.Href == null) + { + errorReporter.ReportError($"Link element with {TDLink.RelName}='{LinkRelSchemaNamer}' is missing required '{TDLink.HrefName}' property.", link.TokenIndex); + hasError = true; + } + else if (string.IsNullOrWhiteSpace(link.Value.Href.Value.Value)) + { + errorReporter.ReportError($"Link element with {TDLink.RelName}='{LinkRelSchemaNamer}' has empty '{TDLink.HrefName}' property value.", link.Value.Href.TokenIndex); + hasError = true; + } + + if (link.Value.Type == null) + { + errorReporter.ReportError($"Link element with {TDLink.RelName}='{LinkRelSchemaNamer}' is missing required '{TDLink.TypeName}' property.", link.TokenIndex); + hasError = true; + } + else if (string.IsNullOrWhiteSpace(link.Value.Type.Value.Value)) + { + errorReporter.ReportError($"Link element with {TDLink.RelName}='{LinkRelSchemaNamer}' has empty '{TDLink.TypeName}' property value.", link.Value.Type.TokenIndex); + hasError = true; + } + else if (link.Value.Type.Value.Value != TDValues.ContentTypeJson) + { + errorReporter.ReportError($"Link element with {TDLink.RelName}='{LinkRelSchemaNamer}' has '{TDLink.TypeName}' property with unsupported value '{link.Value.Type.Value.Value}'.", link.Value.Type.TokenIndex); + hasError = true; + } + + foreach (KeyValuePair propertyName in link.Value.PropertyNames) + { + if (propertyName.Key != TDLink.HrefName && propertyName.Key != TDLink.TypeName && propertyName.Key != TDLink.RelName) + { + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) + { + errorReporter.ReportWarning($"Link has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); + } + else + { + errorReporter.ReportError($"Link has '{propertyName.Key}' property, which is not supported.", propertyName.Value); + hasError = true; + } + } + } + } + + if (relSchemaNamerCount > 1) + { + errorReporter.ReportError($"Thing Description has multiple links with '{TDLink.RelName}' property value '{LinkRelSchemaNamer}'; only one is allowed.", links.TokenIndex); + hasError = true; + } + + return !hasError; + } + + private bool TryValidateSchemaDefinitions(MapTracker? schemaDefinitions) + { + if (schemaDefinitions?.Entries == null) + { + return true; + } + + bool hasError = false; + + foreach (KeyValuePair> schemaDefinition in schemaDefinitions.Entries) + { + if (!TryValidateDataSchema(schemaDefinition.Value, null, DataSchemaKind.SchemaDefinition)) + { + hasError = true; + } + } + + return !hasError; + } + + private bool TryValidateActions(MapTracker? actions, MapTracker? schemaDefinitions) + { + if (actions?.Entries == null) + { + return true; + } + + bool hasError = false; + + foreach (KeyValuePair> action in actions.Entries) + { + if (!TryValidateAction(action.Key, action.Value, schemaDefinitions)) + { + hasError = true; + } + } + + return !hasError; + } + + private bool TryValidateAction(string name, ValueTracker action, MapTracker? schemaDefinitions) + { + bool hasError = false; + + if (action.Value.Input != null && !TryValidateActionDataSchema(action.Value.Input, TDAction.InputName)) + { + hasError = true; + } + + if (action.Value.Output != null && !TryValidateActionDataSchema(action.Value.Output, TDAction.OutputName)) + { + hasError = true; + } + + if (action.Value.Forms == null) + { + errorReporter.ReportError($"Action '{name}' element is missing required '{TDAction.FormsName}' property.", action.TokenIndex); + hasError = true; + } + else if (!TryValidateForms(action.Value.Forms, FormsKind.Action, schemaDefinitions)) + { + hasError = true; + } + + foreach (KeyValuePair propertyName in action.Value.PropertyNames) + { + if (propertyName.Key != TDAction.DescriptionName && propertyName.Key != TDAction.InputName && propertyName.Key != TDAction.OutputName && propertyName.Key != TDAction.IdempotentName && propertyName.Key != TDAction.SafeName && propertyName.Key != TDAction.FormsName) + { + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) + { + errorReporter.ReportWarning($"Action '{name}' has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); + } + else + { + errorReporter.ReportError($"Action '{name}' has '{propertyName.Key}' property, which is not supported.", propertyName.Value); + hasError = true; + } + } + } + + return !hasError; + } + + private bool TryValidateActionDataSchema(ValueTracker dataSchema, string propertyName) + where T : TDDataSchema, IDeserializable + { + bool isStructuredObject = dataSchema.Value.Type?.Value.Value == TDValues.TypeObject && dataSchema.Value.Properties != null; + bool isReference = dataSchema.Value.Ref != null; + if (!isStructuredObject && !isReference) + { + errorReporter.ReportError($"'{TDThing.ActionsName}' element '{propertyName}' property must have a schema of (or a reference to) a structured object type.", dataSchema.TokenIndex); + return false; + } + + return TryValidateDataSchema(dataSchema, null, DataSchemaKind.Affordance); + } + + private bool TryValidateProperties(MapTracker? properties, MapTracker? schemaDefinitions) + { + if (properties?.Entries == null) + { + return true; + } + + bool hasError = false; + + foreach (KeyValuePair> property in properties.Entries) + { + if (!TryValidateProperty(property.Key, property.Value, schemaDefinitions)) + { + hasError = true; + } + } + + return !hasError; + } + + private bool TryValidateProperty(string name, ValueTracker property, MapTracker? schemaDefinitions) + { + bool hasError = false; + + if (!TryValidateDataSchema(property, (propName) => propName == TDProperty.ReadOnlyName || propName == TDProperty.PlaceholderName || propName == TDProperty.FormsName, DataSchemaKind.Affordance)) + { + hasError = true; + } + + if (property.Value.Forms == null) + { + errorReporter.ReportError($"Property '{name}' element is missing required '{TDProperty.FormsName}' property.", property.TokenIndex); + hasError = true; + } + else if (!TryValidatePropertyForms(name, property.Value.Forms, schemaDefinitions, property.Value.ReadOnly)) + { + hasError = true; + } + + return !hasError; + } + + private bool TryValidatePropertyForms(string name, ArrayTracker forms, MapTracker? schemaDefinitions, ValueTracker? readOnly) + { + if (!TryValidateForms(forms, FormsKind.Property, schemaDefinitions)) + { + return false; + } + + bool hasError = false; + + List> aggregateOps = forms.Elements!.SelectMany(form => form.Value.Op?.Elements ?? new()).ToList(); + ValueTracker? writeOp = aggregateOps.FirstOrDefault(op => op.Value.Value == TDValues.OpWriteProp); + ValueTracker? readOp = aggregateOps.FirstOrDefault(op => op.Value.Value == TDValues.OpReadProp); + + if (writeOp != null) + { + if (readOnly?.Value.Value == true) + { + errorReporter.ReportError($"'{TDProperty.FormsName}' array contains '{TDForm.OpName}' property with value '{TDValues.OpWriteProp}' but the property has '{TDProperty.ReadOnlyName}' true.", writeOp.TokenIndex, readOnly.TokenIndex); + hasError = true; + } + if (readOp == null) + { + errorReporter.ReportError($"'{TDProperty.FormsName}' array contains '{TDForm.OpName}' property with value '{TDValues.OpWriteProp}' but no '{TDForm.OpName}' property with value '{TDValues.OpReadProp}'.", writeOp.TokenIndex, forms.TokenIndex); + hasError = true; + } + else + { + ValueTracker? topicalWriteForm = forms.Elements!.FirstOrDefault(form => form.Value.Topic != null && (form.Value.Op?.Elements?.Any(op => op.Value.Value == TDValues.OpWriteProp) ?? false)); + bool hasTopicalReadForm = forms.Elements!.Any(form => form.Value.Topic != null && (form.Value.Op?.Elements?.Any(op => op.Value.Value == TDValues.OpReadProp) ?? false)); + if (topicalWriteForm != null && !hasTopicalReadForm) + { + errorReporter.ReportError($"'{TDProperty.FormsName}' array contains entry with '{TDForm.TopicName}' property and '{TDForm.OpName}' property with value '{TDValues.OpWriteProp}' but no entry with '{TDForm.TopicName}' property and '{TDForm.OpName}' property with value '{TDValues.OpReadProp}'.", topicalWriteForm.TokenIndex, forms.TokenIndex); + hasError = true; + } + } + } + else if (readOp != null) + { + if (readOnly == null) + { + errorReporter.ReportWarning($"Property '{name}' is effectively read-only because the only '{TDForm.OpName}' value in '{TDProperty.FormsName}' is '{TDValues.OpReadProp}'; however, the property has no '{TDProperty.ReadOnlyName}' property with value true.", readOp.TokenIndex); + } + else if (readOnly.Value.Value == false) + { + errorReporter.ReportError($"Property '{name}' is effectively read-only because the only '{TDForm.OpName}' value in '{TDProperty.FormsName}' is '{TDValues.OpReadProp}'; however, the property has a '{TDProperty.ReadOnlyName}' property with value false.", readOp.TokenIndex, readOnly.TokenIndex); + hasError = true; + } + } + + return !hasError; + } + + private bool TryValidateEvents(MapTracker? evts, MapTracker? schemaDefinitions) + { + if (evts?.Entries == null) + { + return true; + } + + bool hasError = false; + + foreach (KeyValuePair> evt in evts.Entries) + { + if (!TryValidateEvent(evt.Key, evt.Value, schemaDefinitions)) + { + hasError = true; + } + } + + return !hasError; + } + + private bool TryValidateEvent(string name, ValueTracker evt, MapTracker? schemaDefinitions) + { + bool hasError = false; + + if (evt.Value.Data != null && !TryValidateDataSchema(evt.Value.Data, null, DataSchemaKind.Affordance)) + { + hasError = true; + } + + if (evt.Value.Forms == null) + { + errorReporter.ReportError($"Event '{name}' element is missing required '{TDEvent.FormsName}' property.", evt.TokenIndex); + hasError = true; + } + else if (!TryValidateForms(evt.Value.Forms, FormsKind.Event, schemaDefinitions)) + { + hasError = true; + } + + foreach (KeyValuePair propertyName in evt.Value.PropertyNames) + { + if (propertyName.Key != TDEvent.DescriptionName && propertyName.Key != TDEvent.DataName && propertyName.Key != TDEvent.PlaceholderName && propertyName.Key != TDEvent.FormsName) + { + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) + { + errorReporter.ReportWarning($"Event '{name}' has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); + } + else + { + errorReporter.ReportError($"Event '{name}' has '{propertyName.Key}' property, which is not supported.", propertyName.Value); + hasError = true; + } + } + } + + return !hasError; + } + + private bool TryValidateForms(ArrayTracker forms, FormsKind formsKind, MapTracker? schemaDefinitions) + { + if (forms.Elements!.Count == 0) + { + errorReporter.ReportError($"Property '{TDEvent.FormsName}' array value contains no elements; at least one form is required.", forms.TokenIndex); + return false; + } + + bool hasError = false; + + foreach (ValueTracker form in forms.Elements) + { + if (!TryValidateForm(form, formsKind, schemaDefinitions)) + { + hasError = true; + } + } + + if (hasError) + { + return false; + } + + ValueTracker? oplessForm = forms.Elements.FirstOrDefault(f => f.Value.Op == null); + if (oplessForm != null && forms.Elements.Count > 1) + { + errorReporter.ReportError($"'{TDThing.FormsName}' array contains a form with no '{TDForm.OpName}' property, so it must be the only form in the array.", oplessForm.TokenIndex, forms.TokenIndex); + return false; + } + + List> aggregateOps = forms.Elements.SelectMany(form => form.Value.Op?.Elements ?? new()).ToList(); + + foreach (IGrouping> dupOpGroup in aggregateOps.GroupBy(op => op.Value.Value).Where(g => g.Count() > 1)) + { + errorReporter.ReportError($"'{TDThing.FormsName}' array contains '{TDForm.OpName}' properties that duplicate value '{dupOpGroup.Key}'.", dupOpGroup.First().TokenIndex, dupOpGroup.Skip(1).First().TokenIndex); + hasError = true; + } + + return !hasError; + } + + private bool TryValidateForm(ValueTracker form, FormsKind formsKind, MapTracker? schemaDefinitions) + { + bool hasError = false; + + if (form.Value.Href == null) + { + errorReporter.ReportError($"Form is missing required '{TDForm.HrefName}' property.", form.TokenIndex); + hasError = true; + } + else if (string.IsNullOrWhiteSpace(form.Value.Href.Value.Value)) + { + errorReporter.ReportError($"Form '{TDForm.HrefName}' property has empty value.", form.Value.Href.TokenIndex); + hasError = true; + } + + if (form.Value.Op?.Elements == null) + { + if (formsKind == FormsKind.Root) + { + errorReporter.ReportError($"Root-level form is missing required '{TDForm.OpName}' property.", form.TokenIndex); + hasError = true; + } + } + else if (form.Value.Op.Elements.Count == 0) + { + errorReporter.ReportError($"Form '{TDForm.OpName}' property has no values.", form.Value.Op.TokenIndex); + hasError = true; + } + + if (form.Value.Topic == null) + { + if (formsKind == FormsKind.Root) + { + errorReporter.ReportError($"Root-level form is missing required '{TDForm.TopicName}' property.", form.TokenIndex); + hasError = true; + } + } + else + { + if (string.IsNullOrWhiteSpace(form.Value.Topic.Value.Value)) + { + errorReporter.ReportError($"Form '{TDForm.TopicName}' property has empty value.", form.Value.Topic.TokenIndex); + hasError = true; + } + + if (form.Value.ContentType == null) + { + errorReporter.ReportError($"Form missing '{TDForm.ContentTypeName}' property, which is required when '{TDForm.TopicName}' property present.", form.TokenIndex, form.Value.Topic.TokenIndex); + hasError = true; + } + } + + if (form.Value.ContentType != null) + { + if (string.IsNullOrWhiteSpace(form.Value.ContentType.Value.Value)) + { + errorReporter.ReportError($"Form '{TDForm.ContentTypeName}' property has empty value.", form.Value.ContentType.TokenIndex); + hasError = true; + } + else if (form.Value.ContentType.Value.Value != TDValues.ContentTypeJson) + { + errorReporter.ReportError($"Form '{TDForm.ContentTypeName}' property has unsupported value '{form.Value.ContentType.Value.Value}'; only '{TDValues.ContentTypeJson}' is supported.", form.Value.ContentType.TokenIndex); + hasError = true; + } + } + + if (form.Value.ServiceGroupId != null) + { + if (formsKind == FormsKind.Root && !(form.Value.Op?.Elements?.Any(op => op.Value.Value == TDValues.OpSubAllEvents) ?? false)) + { + errorReporter.ReportError($"'{TDForm.ServiceGroupIdName}' property is not allowed in root-level '{TDThing.FormsName}' property without an '{TDForm.OpName}' property value of '{TDValues.OpSubAllEvents}'.", form.Value.ServiceGroupId.TokenIndex); + hasError = true; + } + else if (formsKind == FormsKind.Property) + { + errorReporter.ReportError($"'{TDForm.ServiceGroupIdName}' property is not allowed in '{TDProperty.FormsName}' property of a '{TDThing.PropertiesName}' element.", form.Value.ServiceGroupId.TokenIndex); + hasError = true; + } + else if (string.IsNullOrWhiteSpace(form.Value.ServiceGroupId.Value.Value)) + { + errorReporter.ReportError($"Form '{TDForm.ServiceGroupIdName}' property has empty value.", form.Value.ServiceGroupId.TokenIndex); + hasError = true; + } + } + + if (hasError) + { + return false; + } + + foreach (ValueTracker op in form.Value.Op?.Elements ?? new()) + { + if (string.IsNullOrWhiteSpace(op.Value.Value)) + { + errorReporter.ReportError($"Form '{TDForm.OpName}' property has empty value.", op.TokenIndex); + hasError = true; + continue; + } + + switch (formsKind) + { + case FormsKind.Root: + if (op.Value.Value != TDValues.OpReadAllProps && op.Value.Value != TDValues.OpWriteMultProps && op.Value.Value != TDValues.OpSubAllEvents) + { + errorReporter.ReportError($"Form '{TDForm.OpName}' property has unsupported value '{op.Value.Value}' for a root-level form; supported values are '{TDValues.OpReadAllProps}', '{TDValues.OpWriteMultProps}', and '{TDValues.OpSubAllEvents}'.", op.TokenIndex); + hasError = true; + } + break; + case FormsKind.Property: + if (op.Value.Value != TDValues.OpReadProp && op.Value.Value != TDValues.OpWriteProp) + { + errorReporter.ReportError($"Form '{TDForm.OpName}' property has unsupported value '{op.Value.Value}' for a property form; supported values are '{TDValues.OpReadProp}' and '{TDValues.OpWriteProp}'.", op.TokenIndex); + hasError = true; + } + break; + case FormsKind.Action: + if (op.Value.Value != TDValues.OpInvokeAction) + { + errorReporter.ReportError($"Form '{TDForm.OpName}' property has unsupported value '{op.Value.Value}' for an action form; only supported value is '{TDValues.OpInvokeAction}'.", op.TokenIndex); + hasError = true; + } + break; + case FormsKind.Event: + if (op.Value.Value != TDValues.OpSubEvent) + { + errorReporter.ReportError($"Form '{TDForm.OpName}' property has unsupported value '{op.Value.Value}' for an event form; only supported value is '{TDValues.OpSubEvent}'.", op.TokenIndex); + hasError = true; + } + break; + } + } + + if (form.Value.Op?.Elements != null) + { + foreach (IGrouping> dupOpGroup in form.Value.Op.Elements.GroupBy(op => op.Value.Value).Where(g => g.Count() > 1)) + { + errorReporter.ReportError($"Form '{TDForm.OpName}' property has duplicate value '{dupOpGroup.Key}'.", form.Value.Op.TokenIndex); + hasError = true; + } + + if (formsKind == FormsKind.Root) + { + bool hasReadAllProps = form.Value.Op.Elements.Any(op => op.Value.Value == TDValues.OpReadAllProps); + bool hasWriteMultProps = form.Value.Op.Elements.Any(op => op.Value.Value == TDValues.OpWriteMultProps); + bool hasSubAllEvents = form.Value.Op.Elements.Any(op => op.Value.Value == TDValues.OpSubAllEvents); + if (hasReadAllProps && hasSubAllEvents) + { + errorReporter.ReportError($"A single form '{TDForm.OpName}' property cannot contain both '{TDValues.OpReadAllProps}' and '{TDValues.OpSubAllEvents}' values.", form.Value.Op.TokenIndex); + hasError = true; + } + if (hasWriteMultProps && hasSubAllEvents) + { + errorReporter.ReportError($"Form '{TDForm.OpName}' property cannot contain both '{TDValues.OpWriteMultProps}' and '{TDValues.OpSubAllEvents}' values.", form.Value.Op.TokenIndex); + hasError = true; + } + } + } + + if (form.Value.HeaderCode != null) + { + if (formsKind != FormsKind.Action) + { + errorReporter.ReportError($"Form '{TDForm.HeaderCodeName}' property is permitted only in action forms.", form.Value.HeaderCode.TokenIndex); + hasError = true; + } + else if (string.IsNullOrWhiteSpace(form.Value.HeaderCode.Value.Value)) + { + errorReporter.ReportError($"Form '{TDForm.HeaderCodeName}' property has empty value.", form.Value.HeaderCode.TokenIndex); + hasError = true; + } + else if (schemaDefinitions?.Entries == null) + { + errorReporter.ReportError($"Form '{TDForm.HeaderCodeName}' property must refer to key in '{TDThing.SchemaDefinitionsName}' property, but TD has no '{TDThing.SchemaDefinitionsName}' property.", form.Value.HeaderCode.TokenIndex); + hasError = true; + } + else if (!schemaDefinitions.Entries.TryGetValue(form.Value.HeaderCode.Value.Value, out ValueTracker? dataSchema)) + { + errorReporter.ReportError($"Form '{TDForm.HeaderCodeName}' property refers to non-existent key '{form.Value.HeaderCode.Value.Value}' in '{TDThing.SchemaDefinitionsName}' property.", form.Value.HeaderCode.TokenIndex, schemaDefinitions.TokenIndex); + hasError = true; + } + else if (dataSchema.Value.Type?.Value.Value != TDValues.TypeString || dataSchema.Value.Enum == null) + { + errorReporter.ReportError($"Form '{TDForm.HeaderCodeName}' property refers to '{TDThing.SchemaDefinitionsName}' key '{form.Value.HeaderCode.Value.Value}', but this is not a string enum.", form.Value.HeaderCode.TokenIndex, dataSchema.TokenIndex); + hasError = true; + } + } + + if (form.Value.AdditionalResponses?.Elements != null) + { + if (formsKind == FormsKind.Event) + { + errorReporter.ReportError($"Form '{TDForm.AdditionalResponsesName}' property is not permitted in an event form.", form.Value.AdditionalResponses.TokenIndex); + hasError = true; + } + else if (formsKind == FormsKind.Root && !form.Value.Op!.Elements!.Any(op => op.Value.Value == TDValues.OpReadAllProps || op.Value.Value == TDValues.OpWriteMultProps)) + { + errorReporter.ReportError($"Form '{TDForm.AdditionalResponsesName}' property is not permitted in a root form without an '{TDForm.OpName}' property value of '{TDValues.OpReadAllProps}' or '{TDValues.OpWriteMultProps}'.", form.Value.AdditionalResponses.TokenIndex, form.Value.Op.TokenIndex); + hasError = true; + } + else if (!TryValidateSchemaReferences(form.Value.AdditionalResponses, formsKind, TDForm.AdditionalResponsesName, schemaDefinitions)) + { + hasError = true; + } + } + + if (form.Value.HeaderInfo?.Elements != null) + { + if (formsKind != FormsKind.Action) + { + errorReporter.ReportError($"Form '{TDForm.HeaderInfoName}' property is permitted only in an action form.", form.Value.HeaderInfo.TokenIndex); + hasError = true; + } + else if (!TryValidateSchemaReferences(form.Value.HeaderInfo, formsKind, TDForm.HeaderInfoName, schemaDefinitions)) + { + hasError = true; + } + } + + foreach (KeyValuePair propertyName in form.Value.PropertyNames) + { + if (propertyName.Key != TDForm.HrefName && propertyName.Key != TDForm.ContentTypeName && propertyName.Key != TDForm.AdditionalResponsesName && propertyName.Key != TDForm.HeaderInfoName && propertyName.Key != TDForm.HeaderCodeName && propertyName.Key != TDForm.ServiceGroupIdName && propertyName.Key != TDForm.TopicName && propertyName.Key != TDForm.OpName) + { + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) + { + errorReporter.ReportWarning($"Form has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); + } + else + { + errorReporter.ReportError($"Form has '{propertyName.Key}' property, which is not supported.", propertyName.Value); + hasError = true; + } + } + } + + return !hasError; + } + + private bool TryValidateSchemaReferences(ArrayTracker schemaReferences, FormsKind formsKind, string propertyName, MapTracker? schemaDefinitions) + { + bool hasError = false; + + foreach (ValueTracker schemaReference in schemaReferences.Elements!) + { + if (!TryValidateSchemaReference(schemaReference, formsKind, propertyName, schemaDefinitions)) + { + hasError = true; + } + } + + if (schemaReferences.Elements.Count > 1) + { + errorReporter.ReportError($"No more than one element is permitted in '{propertyName}' array.", schemaReferences.TokenIndex); + hasError = true; + } + + return !hasError; + } + + private bool TryValidateSchemaReference(ValueTracker schemaReference, FormsKind formsKind, string parentPropName, MapTracker? schemaDefinitions) + { + bool hasError = false; + + if (schemaReference.Value.ContentType == null) + { + if (parentPropName == TDForm.HeaderInfoName) + { + errorReporter.ReportError($"'{parentPropName}' element is missing required '{TDSchemaReference.ContentTypeName}' property.", schemaReference.TokenIndex); + hasError = true; + } + } + else if (string.IsNullOrWhiteSpace(schemaReference.Value.ContentType.Value.Value)) + { + errorReporter.ReportError($"'{parentPropName}' element has empty '{TDSchemaReference.ContentTypeName}' property value.", schemaReference.Value.ContentType.TokenIndex); + hasError = true; + } + else if (schemaReference.Value.ContentType.Value.Value != TDValues.ContentTypeJson) + { + errorReporter.ReportError($"'{parentPropName}' element has '{TDSchemaReference.ContentTypeName}' property with unsupported value '{schemaReference.Value.ContentType.Value.Value}'.", schemaReference.Value.ContentType.TokenIndex); + hasError = true; + } + + if (schemaReference.Value.Success == null) + { + if (parentPropName == TDForm.AdditionalResponsesName) + { + errorReporter.ReportError($"'{parentPropName}' element is missing required '{TDSchemaReference.SuccessName}' property.", schemaReference.TokenIndex); + hasError = true; + } + } + else if (schemaReference.Value.Success.Value.Value == true) + { + errorReporter.ReportError($"'{parentPropName}' element has '{TDSchemaReference.SuccessName}' property value of true, which is not supported.", schemaReference.TokenIndex); + hasError = true; + } + + if (schemaReference.Value.Schema == null) + { + if (formsKind != FormsKind.Root) + { + errorReporter.ReportError($"'{parentPropName}' element is missing '{TDSchemaReference.SchemaName}' property, which is required except within root-level '{TDThing.FormsName}' elements.", schemaReference.TokenIndex); + hasError = true; + } + } + else if (formsKind == FormsKind.Root) + { + errorReporter.ReportError($"'{parentPropName}' element has '{TDSchemaReference.SchemaName}' property, which is not allowed within root-level '{TDThing.FormsName}' element because schema is automatically composed from schema definitions in affordance '{TDThing.FormsName}' elements.", schemaReference.TokenIndex); + hasError = true; + } + else if (string.IsNullOrWhiteSpace(schemaReference.Value.Schema.Value.Value)) + { + errorReporter.ReportError($"'{parentPropName}' element '{TDSchemaReference.SchemaName}' property has empty value.", schemaReference.Value.Schema.TokenIndex); + hasError = true; + } + else if (schemaDefinitions?.Entries == null) + { + errorReporter.ReportError($"'{parentPropName}' element '{TDSchemaReference.SchemaName}' property must refer to key in '{TDThing.SchemaDefinitionsName}' property, but TD has no '{TDThing.SchemaDefinitionsName}' property.", schemaReference.Value.Schema.TokenIndex); + hasError = true; + } + else if (!schemaDefinitions.Entries.TryGetValue(schemaReference.Value.Schema.Value.Value, out ValueTracker? dataSchema)) + { + errorReporter.ReportError($"'{parentPropName}' element '{TDSchemaReference.SchemaName}' property refers to non-existent key '{schemaReference.Value.Schema.Value.Value}' in '{TDThing.SchemaDefinitionsName}' property.", schemaReference.Value.Schema.TokenIndex, schemaDefinitions.TokenIndex); + hasError = true; + } + else if (dataSchema.Value.Type?.Value.Value != TDValues.TypeObject) + { + errorReporter.ReportError($"'{parentPropName}' element '{TDSchemaReference.SchemaName}' property refers to '{TDThing.SchemaDefinitionsName}' key '{schemaReference.Value.Schema.Value.Value}', but this is not a structured object definition.", schemaReference.Value.Schema.TokenIndex, dataSchema.TokenIndex); + hasError = true; + } + else if (dataSchema.Value.Properties == null) + { + errorReporter.ReportError($"'{parentPropName}' element '{TDSchemaReference.SchemaName}' property refers to '{TDThing.SchemaDefinitionsName}' key '{schemaReference.Value.Schema.Value.Value}', but this defines a map, whereas a structured object is required.", schemaReference.Value.Schema.TokenIndex, dataSchema.TokenIndex); + hasError = true; + } + + foreach (KeyValuePair propertyName in schemaReference.Value.PropertyNames) + { + if (propertyName.Key != TDSchemaReference.SuccessName && propertyName.Key != TDSchemaReference.ContentTypeName && propertyName.Key != TDSchemaReference.SchemaName) + { + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) + { + errorReporter.ReportWarning($"Schema reference has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); + } + else + { + errorReporter.ReportError($"Schema reference has '{propertyName.Key}' property, which is not supported.", propertyName.Value); + hasError = true; + } + } + } + + return !hasError; + } + + private bool TryValidateDataSchema(ValueTracker dataSchema, Func? propertyApprover, DataSchemaKind dataSchemaKind = DataSchemaKind.Undistinguished) + where T : TDDataSchema, IDeserializable + { + if (dataSchema.Value.Ref != null && dataSchemaKind != DataSchemaKind.Affordance) + { + errorReporter.ReportError($"The '{TDDataSchema.RefName}' property is permitted only in the first level of an affordance schema definition ('{TDThing.PropertiesName}', '{TDThing.EventsName}'/'{TDEvent.DataName}', '{TDThing.ActionsName}'/'{TDAction.InputName}', and '{TDThing.ActionsName}'/'{TDAction.OutputName}').", dataSchema.Value.Ref.TokenIndex); + return false; + } + + if (dataSchema.Value.Ref == null && dataSchema.Value.Type == null) + { + errorReporter.ReportError($"Data schema must have either '{TDDataSchema.RefName}' or '{TDDataSchema.TypeName}' property.", dataSchema.TokenIndex); + return false; + } + + if (dataSchema.Value.Ref != null && dataSchema.Value.Type != null) + { + errorReporter.ReportError($"Data schema cannot have both '{TDDataSchema.RefName}' and '{TDDataSchema.TypeName}' properties.", dataSchema.Value.Ref.TokenIndex, dataSchema.Value.Type.TokenIndex); + return false; + } + + if (dataSchema.Value.Ref != null) + { + return TryValidateReferenceDataSchema(dataSchema, propertyApprover); + } + + switch (dataSchema.Value.Type!.Value.Value) + { + case TDValues.TypeObject: + return TryValidateObjectDataSchema(dataSchema, dataSchemaKind, propertyApprover); + case TDValues.TypeArray: + return TryValidateArrayDataSchema(dataSchema, propertyApprover); + case TDValues.TypeString: + return TryValidateStringDataSchema(dataSchema, dataSchemaKind, propertyApprover); + case TDValues.TypeNumber: + return TryValidateNumberDataSchema(dataSchema, dataSchemaKind, propertyApprover); + case TDValues.TypeInteger: + return TryValidateIntegerDataSchema(dataSchema, dataSchemaKind, propertyApprover); + case TDValues.TypeBoolean: + return TryValidateBooleanDataSchema(dataSchema, dataSchemaKind, propertyApprover); + default: + errorReporter.ReportError($"Data schema '{TDDataSchema.TypeName}' property has unsupported value '{dataSchema.Value.Type.Value.Value}'.", dataSchema.Value.Type.TokenIndex); + return false; + } + } + + private bool TryValidateReferenceDataSchema(ValueTracker dataSchema, Func? propertyApprover) + where T : TDDataSchema, IDeserializable + { + bool hasError = false; + + string refValue = dataSchema.Value.Ref!.Value.Value; + long tokenIndex = dataSchema.Value.Ref.TokenIndex; + + if (string.IsNullOrWhiteSpace(refValue)) + { + errorReporter.ReportError($"Data schema '{TDDataSchema.RefName}' property has empty value.", tokenIndex); + hasError = true; + } + else if (!RefCharRegex.IsMatch(refValue)) + { + errorReporter.ReportError($"Data schema '{TDDataSchema.RefName}' property value \"{refValue}\" contains one or more illegal characters.", tokenIndex); + hasError = true; + } + else if (refValue.StartsWith('#')) + { + errorReporter.ReportError($"Data schema '{TDDataSchema.RefName}' property value \"{refValue}\" may not begin with a '#' character.", tokenIndex); + hasError = true; + } + else + { + bool isRelative = refValue.StartsWith("./") || refValue.StartsWith("../"); + bool hasPathSegs = refValue.Contains('/') && refValue.IndexOf('/') < (refValue.Contains('#') ? refValue.IndexOf('#') : refValue.Length); + if (!isRelative && hasPathSegs) + { + errorReporter.ReportError($"Data schema '{TDDataSchema.RefName}' property value \"{refValue}\" must be relative (start with \"./\" or \"../\") if it has any path segments.", tokenIndex); + hasError = true; + } + } + + foreach (KeyValuePair propertyName in dataSchema.Value.PropertyNames) + { + if (propertyApprover?.Invoke(propertyName.Key) != true && propertyName.Key != "dtv:ref" && propertyName.Key != TDDataSchema.TitleName && propertyName.Key != TDDataSchema.DescriptionName) + { + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) + { + errorReporter.ReportWarning($"Data schema has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); + } + else + { + errorReporter.ReportError($"Data schema has '{TDDataSchema.RefName}' property, which does not support '{propertyName.Key}' property.", propertyName.Value, tokenIndex); + hasError = true; + } + } + } + + return !hasError; + } + + private bool TryValidateObjectDataSchema(ValueTracker dataSchema, DataSchemaKind dataSchemaKind, Func? propertyApprover) + where T : TDDataSchema, IDeserializable + { + if (dataSchema.Value.Properties?.Entries == null && dataSchema.Value.AdditionalProperties == null) + { + errorReporter.ReportError($"Data schema with '{TDDataSchema.TypeName}' of '{TDValues.TypeObject}' must have either '{TDDataSchema.PropertiesName}' or 'dtv:additionalProperties' property.", dataSchema.TokenIndex); + return false; + } + + if (dataSchema.Value.Properties?.Entries != null && dataSchema.Value.AdditionalProperties != null) + { + errorReporter.ReportError($"Data schema with '{TDDataSchema.TypeName}' of '{TDValues.TypeObject}' cannot have both '{TDDataSchema.PropertiesName}' and 'dtv:additionalProperties' properties.", dataSchema.Value.Properties.TokenIndex, dataSchema.Value.AdditionalProperties.TokenIndex); + return false; + } + + bool hasError = false; + if (dataSchema.Value.Properties?.Entries != null) + { + foreach (KeyValuePair> property in dataSchema.Value.Properties.Entries) + { + if (!TryValidateDataSchema(property.Value, null)) + { + hasError = true; + } + } + + if (dataSchema.Value.Title != null && !TitleRegex.IsMatch(dataSchema.Value.Title.Value.Value)) + { + errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a 'service-desc' linked schema naming file", dataSchema.Value.Title.TokenIndex); + } + + if (dataSchema.Value.Required?.Elements != null) + { + foreach (ValueTracker requiredProperty in dataSchema.Value.Required.Elements) + { + if (!dataSchema.Value.Properties.Entries.ContainsKey(requiredProperty.Value.Value)) + { + errorReporter.ReportError($"Data schema '{TDDataSchema.RequiredName}' property names non-existent property '{requiredProperty.Value.Value}'.", requiredProperty.TokenIndex, dataSchema.Value.Properties.TokenIndex); + hasError = true; + } + } + } + + if (dataSchema.Value.ErrorMessage != null) + { + if (dataSchemaKind != DataSchemaKind.SchemaDefinition) + { + errorReporter.ReportError($"The '{TDDataSchema.ErrorMessageName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.ErrorMessage.TokenIndex); + hasError = true; + } + } + + foreach (KeyValuePair propertyName in dataSchema.Value.PropertyNames) + { + if (propertyApprover?.Invoke(propertyName.Key) != true && propertyName.Key != TDDataSchema.TypeName && propertyName.Key != TDDataSchema.TitleName && propertyName.Key != TDDataSchema.DescriptionName && propertyName.Key != TDDataSchema.PropertiesName && propertyName.Key != TDDataSchema.RequiredName && propertyName.Key != TDDataSchema.ErrorMessageName) + { + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) + { + errorReporter.ReportWarning($"Data schema has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); + } + else + { + errorReporter.ReportError($"Data schema defines a structured object, which does not support '{propertyName.Key}' property.", propertyName.Value); + hasError = true; + } + } + } + } + else + { + if (!TryValidateDataSchema(dataSchema.Value.AdditionalProperties!, null)) + { + hasError = true; + } + + foreach (KeyValuePair propertyName in dataSchema.Value.PropertyNames) + { + if (propertyApprover?.Invoke(propertyName.Key) != true && propertyName.Key != TDDataSchema.TypeName && propertyName.Key != TDDataSchema.TitleName && propertyName.Key != TDDataSchema.DescriptionName && propertyName.Key != TDDataSchema.AdditionalPropertiesName) + { + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) + { + errorReporter.ReportWarning($"Data schema has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); + } + else + { + errorReporter.ReportError($"Data schema defines a map, which does not support '{propertyName.Key}' property.", propertyName.Value); + hasError = true; + } + } + } + } + + return !hasError; + } + + private bool TryValidateArrayDataSchema(ValueTracker dataSchema, Func? propertyApprover) + where T : TDDataSchema, IDeserializable + { + if (dataSchema.Value.Items == null) + { + errorReporter.ReportError($"Data schema with '{TDDataSchema.TypeName}' of '{TDValues.TypeArray}' must have '{TDDataSchema.ItemsName}' property.", dataSchema.TokenIndex); + return false; + } + + bool hasError = false; + + if (!TryValidateDataSchema(dataSchema.Value.Items!, null)) + { + hasError = true; + } + + foreach (KeyValuePair propertyName in dataSchema.Value.PropertyNames) + { + if (propertyApprover?.Invoke(propertyName.Key) != true && propertyName.Key != TDDataSchema.TypeName && propertyName.Key != TDDataSchema.TitleName && propertyName.Key != TDDataSchema.DescriptionName && propertyName.Key != TDDataSchema.ItemsName) + { + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) + { + errorReporter.ReportWarning($"Data schema has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); + } + else + { + errorReporter.ReportError($"Data schema defines an array, which does not support '{propertyName.Key}' property.", propertyName.Value); + hasError = true; + } + } + } + + return !hasError; + } + + private bool TryValidateStringDataSchema(ValueTracker dataSchema, DataSchemaKind dataSchemaKind, Func? propertyApprover) + where T : TDDataSchema, IDeserializable + { + if (dataSchema.Value.Const != null && dataSchemaKind != DataSchemaKind.SchemaDefinition) + { + errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.Const.TokenIndex); + return false; + } + + bool hasError = false; + + if (dataSchema.Value.Enum?.Elements != null) + { + if (dataSchema.Value.Title != null && !TitleRegex.IsMatch(dataSchema.Value.Title.Value.Value)) + { + errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a 'service-desc' linked schema naming file", dataSchema.Value.Title.TokenIndex); + } + + foreach (ValueTracker enumValue in dataSchema.Value.Enum.Elements) + { + if (!EnumValueRegex.IsMatch(enumValue.Value.Value)) + { + errorReporter.ReportError($"Data schema '{TDDataSchema.EnumName}' property has value \"{enumValue.Value.Value}\" that does not conform to codegen enum member naming rules -- it must start with a letter and contain only alphanumeric characters and underscores", enumValue.TokenIndex); + hasError = true; + } + } + + foreach (KeyValuePair propertyName in dataSchema.Value.PropertyNames) + { + if (propertyApprover?.Invoke(propertyName.Key) != true && propertyName.Key != TDDataSchema.TypeName && propertyName.Key != TDDataSchema.TitleName && propertyName.Key != TDDataSchema.DescriptionName && propertyName.Key != TDDataSchema.EnumName) + { + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) + { + errorReporter.ReportWarning($"Data schema has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); + } + else + { + errorReporter.ReportError($"Data schema defines an enumerated string, which does not support '{propertyName.Key}' property.", propertyName.Value); + hasError = true; + } + } + } + } + else + { + List exclusiveProperties = new(); + if (dataSchema.Value.Const != null) + { + exclusiveProperties.Add(TDDataSchema.ConstName); + } + if (dataSchema.Value.Format != null) + { + exclusiveProperties.Add(TDDataSchema.FormatName); + } + if (dataSchema.Value.Pattern != null) + { + exclusiveProperties.Add(TDDataSchema.PatternName); + } + if (dataSchema.Value.ContentEncoding != null) + { + exclusiveProperties.Add(TDDataSchema.ContentEncodingName); + } + + if (exclusiveProperties.Count > 1) + { + errorReporter.ReportError($"Data schema string type cannot have more than one of the following properties: {string.Join(", ", exclusiveProperties)}.", dataSchema.TokenIndex); + hasError = true; + } + + if (dataSchema.Value.Format != null) + { + string formatValue = dataSchema.Value.Format.Value.Value; + if (formatValue != TDValues.FormatDateTime && formatValue != TDValues.FormatDate && formatValue != TDValues.FormatTime && formatValue != TDValues.FormatUuid) + { + errorReporter.ReportError($"Data schema '{TDDataSchema.FormatName}' property has unsupported value '{formatValue}'; supported values are '{TDValues.FormatDateTime}', '{TDValues.FormatDate}', '{TDValues.FormatTime}', and '{TDValues.FormatUuid}'.", dataSchema.Value.Format.TokenIndex); + hasError = true; + } + } + + if (dataSchema.Value.ContentEncoding != null) + { + string contentEncodingValue = dataSchema.Value.ContentEncoding.Value.Value; + if (contentEncodingValue != TDValues.ContentEncodingBase64) + { + errorReporter.ReportError($"Data schema '{TDDataSchema.ContentEncodingName}' property has unsupported value '{contentEncodingValue}'; only supported value is '{TDValues.ContentEncodingBase64}'.", dataSchema.Value.ContentEncoding.TokenIndex); + hasError = true; + } + } + + if (dataSchema.Value.Pattern != null) + { + string patternValue = dataSchema.Value.Pattern.Value.Value; + try + { + Regex patternRegex = new Regex(patternValue); + + if (patternRegex.IsMatch(AnArbitraryString)) + { + errorReporter.ReportWarning($"Data schema '{TDDataSchema.PatternName}' property value \"{patternValue}\" matches an arbitrary test string value, so no type restriction will be applied.", dataSchema.Value.Pattern.TokenIndex); + } + else if (!patternRegex.IsMatch(Iso8601DurationExample) && !patternRegex.IsMatch(DecimalExample)) + { + errorReporter.ReportError($"Data schema '{TDDataSchema.PatternName}' property value \"{patternValue}\" matches neither an ISO 8601 duration value (e.g., \"{Iso8601DurationExample}\") nor a decimal value (e.g., \"{DecimalExample}\"), so indended type is indeterminate.", dataSchema.Value.Pattern.TokenIndex); + hasError = true; + } + } + catch (RegexParseException) + { + errorReporter.ReportError($"Data schema '{TDDataSchema.PatternName}' property has invalid regular expression pattern '{patternValue}'", dataSchema.Value.Pattern.TokenIndex); + hasError = true; + } + } + + foreach (KeyValuePair propertyName in dataSchema.Value.PropertyNames) + { + if (propertyApprover?.Invoke(propertyName.Key) != true && propertyName.Key != TDDataSchema.TypeName && propertyName.Key != TDDataSchema.TitleName && propertyName.Key != TDDataSchema.DescriptionName && propertyName.Key != TDDataSchema.ConstName && propertyName.Key != TDDataSchema.FormatName && propertyName.Key != TDDataSchema.ContentEncodingName && propertyName.Key != TDDataSchema.PatternName) + { + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) + { + errorReporter.ReportWarning($"Data schema has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); + } + else + { + errorReporter.ReportError($"Data schema defines a string type, which does not support '{propertyName.Key}' property.", propertyName.Value); + hasError = true; + } + } + } + } + + return !hasError; + } + + private bool TryValidateNumberDataSchema(ValueTracker dataSchema, DataSchemaKind dataSchemaKind, Func? propertyApprover) + where T : TDDataSchema, IDeserializable + { + bool hasError = false; + + if (dataSchema.Value.Const?.Value.Value != null && dataSchemaKind != DataSchemaKind.SchemaDefinition) + { + errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.Const.TokenIndex); + return false; + } + + if (dataSchema.Value.Minimum?.Value.Value != null && dataSchema.Value.Maximum?.Value.Value != null && dataSchema.Value.Maximum.Value.Value < dataSchema.Value.Minimum.Value.Value) + { + errorReporter.ReportError($"The '{TDDataSchema.MaximumName}' property value ({dataSchema.Value.Maximum.Value.Value}) cannot be less than the '{TDDataSchema.MinimumName}' property value ({dataSchema.Value.Minimum.Value.Value}).", dataSchema.Value.Maximum.TokenIndex, dataSchema.Value.Minimum.TokenIndex); + hasError = true; + } + + if (dataSchema.Value.Const?.Value.Value != null) + { + if (dataSchema.Value.Title != null && !TitleRegex.IsMatch(dataSchema.Value.Title.Value.Value)) + { + errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a 'service-desc' linked schema naming file", dataSchema.Value.Title.TokenIndex); + } + + if (dataSchema.Value.Const.Value.Value is double constValue) + { + if (dataSchema.Value.Minimum?.Value.Value != null && constValue < dataSchema.Value.Minimum.Value.Value) + { + errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property value ({constValue}) cannot be less than the '{TDDataSchema.MinimumName}' property value ({dataSchema.Value.Minimum.Value.Value}).", dataSchema.Value.Const.TokenIndex, dataSchema.Value.Minimum.TokenIndex); + hasError = true; + } + if (dataSchema.Value.Maximum?.Value.Value != null && constValue > dataSchema.Value.Maximum.Value.Value) + { + errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property value ({constValue}) cannot be greater than the '{TDDataSchema.MaximumName}' property value ({dataSchema.Value.Maximum.Value.Value}).", dataSchema.Value.Const.TokenIndex, dataSchema.Value.Maximum.TokenIndex); + hasError = true; + } + } + else + { + errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property value must be a number.", dataSchema.Value.Const.TokenIndex); + hasError = true; + } + } + + foreach (KeyValuePair propertyName in dataSchema.Value.PropertyNames) + { + if (propertyApprover?.Invoke(propertyName.Key) != true && propertyName.Key != TDDataSchema.TypeName && propertyName.Key != TDDataSchema.TitleName && propertyName.Key != TDDataSchema.DescriptionName && propertyName.Key != TDDataSchema.ConstName && propertyName.Key != TDDataSchema.MinimumName && propertyName.Key != TDDataSchema.MaximumName) + { + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) + { + errorReporter.ReportWarning($"Data schema has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); + } + else + { + errorReporter.ReportError($"Data schema defines a number type, which does not support '{propertyName.Key}' property.", propertyName.Value); + hasError = true; + } + } + } + + return !hasError; + } + + private bool TryValidateIntegerDataSchema(ValueTracker dataSchema, DataSchemaKind dataSchemaKind, Func? propertyApprover) + where T : TDDataSchema, IDeserializable + { + bool hasError = false; + + if (dataSchema.Value.Const?.Value.Value != null && dataSchemaKind != DataSchemaKind.SchemaDefinition) + { + errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.Const.TokenIndex); + return false; + } + + if (dataSchema.Value.Minimum?.Value.Value != null && !double.IsInteger(dataSchema.Value.Minimum.Value.Value)) + { + errorReporter.ReportError($"The '{TDDataSchema.MinimumName}' property value must be an integer.", dataSchema.Value.Minimum.TokenIndex); + hasError = true; + } + if (dataSchema.Value.Maximum?.Value.Value != null && !double.IsInteger(dataSchema.Value.Maximum.Value.Value)) + { + errorReporter.ReportError($"The '{TDDataSchema.MaximumName}' property value must be an integer.", dataSchema.Value.Maximum.TokenIndex); + hasError = true; + } + + if (hasError) + { + return false; + } + + if (dataSchema.Value.Minimum?.Value.Value != null && dataSchema.Value.Maximum?.Value.Value != null && dataSchema.Value.Maximum.Value.Value < dataSchema.Value.Minimum.Value.Value) + { + errorReporter.ReportError($"The '{TDDataSchema.MaximumName}' property value ({dataSchema.Value.Maximum.Value.Value}) cannot be less than the '{TDDataSchema.MinimumName}' property value ({dataSchema.Value.Minimum.Value.Value}).", dataSchema.Value.Maximum.TokenIndex, dataSchema.Value.Minimum.TokenIndex); + hasError = true; + } + + if (dataSchema.Value.Const?.Value.Value != null) + { + if (dataSchema.Value.Title != null && !TitleRegex.IsMatch(dataSchema.Value.Title.Value.Value)) + { + errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a 'service-desc' linked schema naming file", dataSchema.Value.Title.TokenIndex); + } + + if (dataSchema.Value.Const.Value.Value is double constValue && double.IsInteger(constValue)) + { + if (dataSchema.Value.Minimum?.Value.Value != null && constValue < dataSchema.Value.Minimum.Value.Value) + { + errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property value ({constValue}) cannot be less than the '{TDDataSchema.MinimumName}' property value ({dataSchema.Value.Minimum.Value.Value}).", dataSchema.Value.Const.TokenIndex, dataSchema.Value.Minimum.TokenIndex); + hasError = true; + } + if (dataSchema.Value.Maximum?.Value.Value != null && constValue > dataSchema.Value.Maximum.Value.Value) + { + errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property value ({constValue}) cannot be greater than the '{TDDataSchema.MaximumName}' property value ({dataSchema.Value.Maximum.Value.Value}).", dataSchema.Value.Const.TokenIndex, dataSchema.Value.Maximum.TokenIndex); + hasError = true; + } + } + else + { + errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property value must be an integer.", dataSchema.Value.Const.TokenIndex); + hasError = true; + } + } + + foreach (KeyValuePair propertyName in dataSchema.Value.PropertyNames) + { + if (propertyApprover?.Invoke(propertyName.Key) != true && propertyName.Key != TDDataSchema.TypeName && propertyName.Key != TDDataSchema.TitleName && propertyName.Key != TDDataSchema.DescriptionName && propertyName.Key != TDDataSchema.ConstName && propertyName.Key != TDDataSchema.MinimumName && propertyName.Key != TDDataSchema.MaximumName) + { + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) + { + errorReporter.ReportWarning($"Data schema has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); + } + else + { + errorReporter.ReportError($"Data schema defines a integer type, which does not support '{propertyName.Key}' property.", propertyName.Value); + hasError = true; + } + } + } + + return !hasError; + } + + private bool TryValidateBooleanDataSchema(ValueTracker dataSchema, DataSchemaKind dataSchemaKind, Func? propertyApprover) + where T : TDDataSchema, IDeserializable + { + if (dataSchema.Value.Const != null && dataSchemaKind != DataSchemaKind.SchemaDefinition) + { + errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.Const.TokenIndex); + return false; + } + + bool hasError = false; + + if (dataSchema.Value.Const?.Value.Value != null) + { + if (dataSchema.Value.Title != null && !TitleRegex.IsMatch(dataSchema.Value.Title.Value.Value)) + { + errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a 'service-desc' linked schema naming file", dataSchema.Value.Title.TokenIndex); + } + + if (dataSchema.Value.Const.Value.Value is not bool constValue) + { + errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property value must be Boolean.", dataSchema.Value.Const.TokenIndex); + hasError = true; + } + } + + foreach (KeyValuePair propertyName in dataSchema.Value.PropertyNames) + { + if (propertyApprover?.Invoke(propertyName.Key) != true && propertyName.Key != TDDataSchema.TypeName && propertyName.Key != TDDataSchema.TitleName && propertyName.Key != TDDataSchema.DescriptionName && propertyName.Key != TDDataSchema.ConstName) + { + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) + { + errorReporter.ReportWarning($"Data schema has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); + } + else + { + errorReporter.ReportError($"Data schema defines a number type, which does not support '{propertyName.Key}' property.", propertyName.Value); + hasError = true; + } + } + } + + return !hasError; + } + + private enum DataSchemaKind + { + Undistinguished, + Affordance, + SchemaDefinition, + } + + private enum FormsKind + { + Root, + Action, + Property, + Event, + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs index 9f2c2b144d..13cef289d0 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs @@ -20,7 +20,7 @@ internal static List GenerateActionEnvoys(ErrorReporter errorReporte continue; } - FormInfo? actionForm = FormInfo.CreateFromForm(errorReporter, action.Forms?.Elements?.FirstOrDefault(f => (f.Value.Op?.Elements?.Any(e => e.Value.Value == TDValues.OpInvokeAction) ?? false) || (f.Value.Op?.Elements?.Any(e => e.Value.Value == TDValues.OpQueryAction) ?? false))?.Value, tdThing.SchemaDefinitions?.Entries); + FormInfo? actionForm = FormInfo.CreateFromForm(errorReporter, action.Forms?.Elements?.FirstOrDefault(f => f.Value.Op?.Elements?.Any(e => e.Value.Value == TDValues.OpInvokeAction) ?? false)?.Value, tdThing.SchemaDefinitions?.Entries); actionForm ??= FormInfo.CreateFromForm(errorReporter, action.Forms?.Elements?.FirstOrDefault(f => f.Value.Op == null)?.Value, tdThing.SchemaDefinitions?.Entries); if (actionForm?.TopicPattern != null && actionForm.Format != SerializationFormat.None) diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs index 4e7d390d5a..433ceef4c6 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs @@ -37,7 +37,7 @@ public static List GenerateEnvoys( throw new System.InvalidOperationException($"Thing defined in file '{parsedThing.FileName}' is missing a root-level 'title' property."); } - CodeName serviceName = new CodeName(parsedThing.Thing.Title?.Value.Value ?? genNamespace); + CodeName serviceName = new CodeName(parsedThing.Thing.Title.Value.Value); List actionSpecs = ActionEnvoyGenerator.GenerateActionEnvoys(parsedThing.ErrorReporter, parsedThing.Thing, parsedThing.SchemaNamer, serviceName, envoyFactory, transforms, errorSpecs, typesToSerialize); List eventSpecs = EventEnvoyGenerator.GenerateEventEnvoys(parsedThing.ErrorReporter, parsedThing.Thing, parsedThing.SchemaNamer, serviceName, envoyFactory, transforms, typesToSerialize); diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Service/t4/DotNetService.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Service/t4/DotNetService.tt index 9d45303f12..85ba373449 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Service/t4/DotNetService.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Service/t4/DotNetService.tt @@ -625,7 +625,7 @@ namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage. } } <# } #> -<# if (propSpec.WriteErrorName != null) { #> +<# if (propSpec.WriteReqSchema != null && propSpec.WriteErrorName != null) { #> private async Task>> <#=propSpec.Name.GetMethodName(TargetLanguage.CSharp, "int", prefix: "write")#>(<#=propSpec.WriteReqSchema.GetTypeName(TargetLanguage.CSharp)#> request, CommandRequestMetadata? requestMetadata, Dictionary? prefixedAdditionalTopicTokenMap, TimeSpan? commandTimeout, CancellationToken cancellationToken) { diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs index c40450e6fc..3637463819 100644 --- a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs @@ -49,6 +49,7 @@ public static int GenerateCode(OptionContainer options) if (errorLog.HasErrors) { DisplayErrors("Parsing", errorLog); + DisplayWarnings(errorLog); return 1; } @@ -58,6 +59,7 @@ public static int GenerateCode(OptionContainer options) if (errorLog.HasErrors) { DisplayErrors("Schema generation", errorLog); + DisplayWarnings(errorLog); return 1; } @@ -93,6 +95,7 @@ public static int GenerateCode(OptionContainer options) if (errorLog.HasErrors) { DisplayErrors("Type generation", errorLog); + DisplayWarnings(errorLog); return 1; } @@ -143,21 +146,25 @@ private static List ParseThings(FileInfo[] thingFiles, ErrorLog err string thingText = thingReader.ReadToEnd(); byte[] thingBytes = Encoding.UTF8.GetBytes(thingText); ErrorReporter errorReporter = new ErrorReporter(errorLog, thingFile.FullName, thingBytes); + ThingValidator thingValidator = new ThingValidator(errorReporter); if (TryGetThings(errorReporter, thingBytes, out List? things)) { int thingCount = 0; foreach (TDThing thing in things) { - ValueTracker? schemaNamesFilename = thing.Links?.Elements?.FirstOrDefault(l => l.Value.Rel?.Value.Value == TDValues.RelationSchemaNaming)?.Value.Href; - if (TryGetSchemaNamer(errorReporter, thingFile.DirectoryName!, schemaNamesFilename, out SchemaNamer? schemaNamer)) + if (thingValidator.TryValidateThng(thing)) { - thingCount++; - parsedThings.Add(new ParsedThing(thing, thingFile.Name, thingFile.DirectoryName!, schemaNamer, errorReporter)); + ValueTracker? schemaNamesFilename = thing.Links?.Elements?.FirstOrDefault(l => l.Value.Rel?.Value.Value == TDValues.RelationSchemaNaming)?.Value.Href; + if (TryGetSchemaNamer(errorReporter, thingFile.DirectoryName!, schemaNamesFilename, out SchemaNamer? schemaNamer)) + { + thingCount++; + parsedThings.Add(new ParsedThing(thing, thingFile.Name, thingFile.DirectoryName!, schemaNamer, errorReporter)); + } } } - Console.WriteLine($" {thingCount} {(thingCount == 1 ? "TD" : "TDs")} parsed"); + Console.WriteLine($" {thingCount} {(thingCount == 1 ? "TD" : "TDs")} validly parsed"); } } } @@ -199,6 +206,8 @@ private static bool TryGetSchemaNamer(ErrorReporter errorReporter, string folder private static bool TryGetThings(ErrorReporter errorReporter, byte[] thingBytes, [NotNullWhen(true)] out List? things) { + bool hasError = false; + try { things = TDParser.Parse(thingBytes); @@ -217,6 +226,7 @@ private static bool TryGetThings(ErrorReporter errorReporter, byte[] thingBytes, if (item is ISourceTracker tracker && tracker.DeserializingFailed) { errorReporter.ReportError($"TD deserialization error: {tracker.DeserializationError ?? string.Empty}.", tracker.TokenIndex); + hasError = true; } if (item is ValueTracker dataSchema && dataSchema.Value.Ref != null) @@ -226,7 +236,7 @@ private static bool TryGetThings(ErrorReporter errorReporter, byte[] thingBytes, } } - return true; + return !hasError; } private static void WriteItems(List generatedItems, DirectoryInfo destDir) @@ -380,8 +390,7 @@ private static string FormatErrorRecord(ErrorRecord error) { string cfLineInfo = error.CfLineNumber > 0 ? $", cf. Line: {error.CfLineNumber}" : string.Empty; string lineInfo = error.LineNumber > 0 ? $", Line: {error.LineNumber}" : string.Empty; - string sourceInfo = error.LineNumber >= 0 ? $" (File: {error.Filename}{lineInfo}{cfLineInfo})" : string.Empty; - return $"{error.Message}{sourceInfo}"; + return $"{error.Message} (File: {error.Filename}{lineInfo}{cfLineInfo})"; } } } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs index 43fc1f80c8..9c1fbfe8cd 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs @@ -40,7 +40,7 @@ private static void ProcessAction( Dictionary schemaSpecs, Dictionary> referencedSchemas) { - FormInfo? actionForm = FormInfo.CreateFromForm(errorReporter, tdAction.Forms?.Elements?.FirstOrDefault(f => (f.Value.Op?.Elements?.Any(e => e.Value.Value == TDValues.OpInvokeAction) ?? false) || (f.Value.Op?.Elements?.Any(e => e.Value.Value == TDValues.OpQueryAction) ?? false))?.Value, schemaDefinitions); + FormInfo? actionForm = FormInfo.CreateFromForm(errorReporter, tdAction.Forms?.Elements?.FirstOrDefault(f => f.Value.Op?.Elements?.Any(e => e.Value.Value == TDValues.OpInvokeAction) ?? false)?.Value, schemaDefinitions); actionForm ??= FormInfo.CreateFromForm(errorReporter, tdAction.Forms?.Elements?.FirstOrDefault(f => f.Value.Op == null)?.Value, schemaDefinitions); if (actionForm?.TopicPattern != null) diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs index f0e0d02632..33b8dce5ad 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs @@ -10,7 +10,7 @@ internal class JsonSchemaSupport { private const string Iso8601DurationExample = "P3Y6M4DT12H30M5S"; private const string DecimalExample = "1234567890.0987654321"; - private const string AnArbitraryString = "HelloWorld"; + private const string AnArbitraryString = "Pretty12345Tricky67890"; private const string DecimalPattern = @"^(?:\\+|-)?(?:[1-9][0-9]*|0)(?:\\.[0-9]*)?$"; private readonly SchemaNamer schemaNamer; @@ -30,8 +30,7 @@ internal string GetFragmented(string typeAndAddenda, bool require) internal string GetReferencePath(string reference, string refBase) { - return Path.GetDirectoryName(reference) == string.Empty ? $"./{reference}" : - Path.GetRelativePath(this.workingDir.FullName, Path.Combine(refBase, reference)).Replace('\\', '/'); + return reference.Contains('/') ? Path.GetRelativePath(this.workingDir.FullName, Path.Combine(refBase, reference)).Replace('\\', '/') : $"./{reference}"; } internal string GetTypeAndAddenda(ValueTracker tdSchema, string backupSchemaName, string refBase) diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/MapTracker.cs b/codegen2/src/Azure.Iot.Operations.TDParser/MapTracker.cs index 5ba19a859e..f8f5f70382 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/MapTracker.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/MapTracker.cs @@ -104,6 +104,7 @@ public IEnumerable Traverse() public static MapTracker Deserialize(ref Utf8JsonReader reader) { long tokenIndex = reader.TokenStartIndex; + string? deserializationError = null; if (reader.TokenType != JsonTokenType.StartObject) { @@ -123,12 +124,19 @@ public static MapTracker Deserialize(ref Utf8JsonReader reader) string propertyName = reader.GetString()!; reader.Read(); + if (entries.ContainsKey(propertyName)) + { + deserializationError = $"duplicate property name '{propertyName}' found in map"; + } + entries[propertyName] = ValueTracker.Deserialize(ref reader); reader.Read(); } return new MapTracker { + DeserializingFailed = deserializationError != null, + DeserializationError = deserializationError, Entries = entries, TokenIndex = tokenIndex, }; diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAction.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAction.cs index 3bac46fed8..1c68555a8c 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAction.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAction.cs @@ -6,6 +6,13 @@ public class TDAction : IEquatable, IDeserializable { + public const string DescriptionName = "description"; + public const string InputName = "input"; + public const string OutputName = "output"; + public const string IdempotentName = "idempotent"; + public const string SafeName = "safe"; + public const string FormsName = "forms"; + public ValueTracker? Description { get; set; } public ValueTracker? Input { get; set; } @@ -18,6 +25,8 @@ public class TDAction : IEquatable, IDeserializable public ArrayTracker? Forms { get; set; } + public Dictionary PropertyNames { get; set; } = new(); + public virtual bool Equals(TDAction? other) { if (other == null) @@ -136,26 +145,28 @@ public static TDAction Deserialize(ref Utf8JsonReader reader) while (reader.TokenType == JsonTokenType.PropertyName) { string propertyName = reader.GetString()!; + ParsingSupport.CheckForDuplicatePropertyName(ref reader, propertyName, action.PropertyNames, "action"); + action.PropertyNames[propertyName] = reader.TokenStartIndex; reader.Read(); switch (propertyName) { - case "description": + case DescriptionName: action.Description = ValueTracker.Deserialize(ref reader); break; - case "input": + case InputName: action.Input = ValueTracker.Deserialize(ref reader); break; - case "output": + case OutputName: action.Output = ValueTracker.Deserialize(ref reader); break; - case "idempotent": + case IdempotentName: action.Idempotent = ValueTracker.Deserialize(ref reader); break; - case "safe": + case SafeName: action.Safe = ValueTracker.Deserialize(ref reader); break; - case "forms": + case FormsName: action.Forms = ArrayTracker.Deserialize(ref reader); break; default: diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs index 1413add024..affc322d19 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs @@ -7,6 +7,23 @@ public class TDDataSchema : IEquatable, IDeserializable { + public const string RefName = "dtv:ref"; + public const string TitleName = "title"; + public const string DescriptionName = "description"; + public const string TypeName = "type"; + public const string ConstName = "const"; + public const string MinimumName = "minimum"; + public const string MaximumName = "maximum"; + public const string FormatName = "format"; + public const string PatternName = "pattern"; + public const string ContentEncodingName = "contentEncoding"; + public const string AdditionalPropertiesName = "dtv:additionalProperties"; + public const string EnumName = "enum"; + public const string RequiredName = "required"; + public const string ErrorMessageName = "dtv:errorMessage"; + public const string PropertiesName = "properties"; + public const string ItemsName = "items"; + public ValueTracker? Ref { get; set; } public ValueTracker? Title { get; set; } @@ -39,6 +56,8 @@ public class TDDataSchema : IEquatable, IDeserializable? Items { get; set; } + public Dictionary PropertyNames { get; set; } = new(); + public override int GetHashCode() { return (Title, Description, Type, Const, Minimum, Maximum, Format, Pattern, ContentEncoding, AdditionalProperties, Enum, Required, ErrorMessage, Properties, Items).GetHashCode(); @@ -121,6 +140,8 @@ public static TDDataSchema Deserialize(ref Utf8JsonReader reader) while (reader.TokenType == JsonTokenType.PropertyName) { string propertyName = reader.GetString()!; + ParsingSupport.CheckForDuplicatePropertyName(ref reader, propertyName, dataSchema.PropertyNames, "data schema"); + dataSchema.PropertyNames[propertyName] = reader.TokenStartIndex; reader.Read(); if (!TryLoadPropertyValues(dataSchema, propertyName, ref reader)) @@ -254,52 +275,52 @@ protected static bool TryLoadPropertyValues(TDDataSchema dataSchema, string prop { switch (propertyName) { - case "dtv:ref": + case RefName: dataSchema.Ref = ValueTracker.Deserialize(ref reader); return true; - case "title": + case TitleName: dataSchema.Title = ValueTracker.Deserialize(ref reader); return true; - case "description": + case DescriptionName: dataSchema.Description = ValueTracker.Deserialize(ref reader); return true; - case "type": + case TypeName: dataSchema.Type = ValueTracker.Deserialize(ref reader); return true; - case "const": + case ConstName: dataSchema.Const = ValueTracker.Deserialize(ref reader); return true; - case "minimum": + case MinimumName: dataSchema.Minimum = ValueTracker.Deserialize(ref reader); return true; - case "maximum": + case MaximumName: dataSchema.Maximum = ValueTracker.Deserialize(ref reader); return true; - case "format": + case FormatName: dataSchema.Format = ValueTracker.Deserialize(ref reader); return true; - case "pattern": + case PatternName: dataSchema.Pattern = ValueTracker.Deserialize(ref reader); return true; - case "contentEncoding": + case ContentEncodingName: dataSchema.ContentEncoding = ValueTracker.Deserialize(ref reader); return true; - case "dtv:additionalProperties": + case AdditionalPropertiesName: dataSchema.AdditionalProperties = ValueTracker.Deserialize(ref reader); return true; - case "enum": + case EnumName: dataSchema.Enum = ArrayTracker.Deserialize(ref reader); return true; - case "required": + case RequiredName: dataSchema.Required = ArrayTracker.Deserialize(ref reader); return true; - case "dtv:errorMessage": + case ErrorMessageName: dataSchema.ErrorMessage = ValueTracker.Deserialize(ref reader); return true; - case "properties": + case PropertiesName: dataSchema.Properties = MapTracker.Deserialize(ref reader); return true; - case "items": + case ItemsName: dataSchema.Items = ValueTracker.Deserialize(ref reader); return true; default: diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDEvent.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDEvent.cs index a31026663d..110e83558c 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDEvent.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDEvent.cs @@ -6,6 +6,11 @@ public class TDEvent : IEquatable, IDeserializable { + public const string DescriptionName = "description"; + public const string DataName = "data"; + public const string PlaceholderName = "dtv:placeholder"; + public const string FormsName = "forms"; + public ValueTracker? Description { get; set; } public ValueTracker? Data { get; set; } @@ -14,6 +19,8 @@ public class TDEvent : IEquatable, IDeserializable public ArrayTracker? Forms { get; set; } + public Dictionary PropertyNames { get; set; } = new(); + public virtual bool Equals(TDEvent? other) { if (other == null) @@ -116,20 +123,22 @@ public static TDEvent Deserialize(ref Utf8JsonReader reader) while (reader.TokenType == JsonTokenType.PropertyName) { string propertyName = reader.GetString()!; + ParsingSupport.CheckForDuplicatePropertyName(ref reader, propertyName, evt.PropertyNames, "event"); + evt.PropertyNames[propertyName] = reader.TokenStartIndex; reader.Read(); switch (propertyName) { - case "description": + case DescriptionName: evt.Description = ValueTracker.Deserialize(ref reader); break; - case "data": + case DataName: evt.Data = ValueTracker.Deserialize(ref reader); break; - case "dtv:placeholder": + case PlaceholderName: evt.Placeholder = ValueTracker.Deserialize(ref reader); break; - case "forms": + case FormsName: evt.Forms = ArrayTracker.Deserialize(ref reader); break; default: diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDForm.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDForm.cs index 14ad05708c..ea019e293e 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDForm.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDForm.cs @@ -6,6 +6,15 @@ public class TDForm : IEquatable, IDeserializable { + public const string HrefName = "href"; + public const string ContentTypeName = "contentType"; + public const string AdditionalResponsesName = "additionalResponses"; + public const string HeaderInfoName = "dtv:headerInfo"; + public const string HeaderCodeName = "dtv:headerCode"; + public const string ServiceGroupIdName = "dtv:serviceGroupId"; + public const string TopicName = "dtv:topic"; + public const string OpName = "op"; + public ValueTracker? Href { get; set; } public ValueTracker? ContentType { get; set; } @@ -22,6 +31,8 @@ public class TDForm : IEquatable, IDeserializable public ArrayTracker? Op { get; set; } + public Dictionary PropertyNames { get; set; } = new(); + public virtual bool Equals(TDForm? other) { if (other == null) @@ -156,32 +167,34 @@ public static TDForm Deserialize(ref Utf8JsonReader reader) while (reader.TokenType == JsonTokenType.PropertyName) { string propertyName = reader.GetString()!; + ParsingSupport.CheckForDuplicatePropertyName(ref reader, propertyName, form.PropertyNames, "form"); + form.PropertyNames[propertyName] = reader.TokenStartIndex; reader.Read(); switch (propertyName) { - case "href": + case HrefName: form.Href = ValueTracker.Deserialize(ref reader); break; - case "contentType": + case ContentTypeName: form.ContentType = ValueTracker.Deserialize(ref reader); break; - case "additionalResponses": + case AdditionalResponsesName: form.AdditionalResponses = ArrayTracker.Deserialize(ref reader); break; - case "dtv:headerInfo": + case HeaderInfoName: form.HeaderInfo = ArrayTracker.Deserialize(ref reader); break; - case "dtv:headerCode": + case HeaderCodeName: form.HeaderCode = ValueTracker.Deserialize(ref reader); break; - case "dtv:serviceGroupId": + case ServiceGroupIdName: form.ServiceGroupId = ValueTracker.Deserialize(ref reader); break; - case "dtv:topic": + case TopicName: form.Topic = ValueTracker.Deserialize(ref reader); break; - case "op": + case OpName: form.Op = ArrayTracker.Deserialize(ref reader); break; default: diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDLink.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDLink.cs index e2025da57d..b4543ebe17 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDLink.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDLink.cs @@ -6,12 +6,18 @@ public class TDLink : IEquatable, IDeserializable { + public const string HrefName = "href"; + public const string TypeName = "type"; + public const string RelName = "rel"; + public ValueTracker? Href { get; set; } - public ValueTracker? ContentType { get; set; } + public ValueTracker? Type { get; set; } public ValueTracker? Rel { get; set; } + public Dictionary PropertyNames { get; set; } = new(); + public virtual bool Equals(TDLink? other) { if (other == null) @@ -20,13 +26,13 @@ public virtual bool Equals(TDLink? other) } else { - return Href == other.Href && ContentType == other.ContentType && Rel == other.Rel; + return Href == other.Href && Type == other.Type && Rel == other.Rel; } } public override int GetHashCode() { - return (Href, ContentType, Rel).GetHashCode(); + return (Href, Type, Rel).GetHashCode(); } public static bool operator ==(TDLink? left, TDLink? right) @@ -75,9 +81,9 @@ public IEnumerable Traverse() yield return item; } } - if (ContentType != null) + if (Type != null) { - foreach (ITraversable item in ContentType.Traverse()) + foreach (ITraversable item in Type.Traverse()) { yield return item; } @@ -104,17 +110,19 @@ public static TDLink Deserialize(ref Utf8JsonReader reader) while (reader.TokenType == JsonTokenType.PropertyName) { string propertyName = reader.GetString()!; + ParsingSupport.CheckForDuplicatePropertyName(ref reader, propertyName, link.PropertyNames, "link"); + link.PropertyNames[propertyName] = reader.TokenStartIndex; reader.Read(); switch (propertyName) { - case "href": + case HrefName: link.Href = ValueTracker.Deserialize(ref reader); break; - case "contentType": - link.ContentType = ValueTracker.Deserialize(ref reader); + case TypeName: + link.Type = ValueTracker.Deserialize(ref reader); break; - case "rel": + case RelName: link.Rel = ValueTracker.Deserialize(ref reader); break; default: diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDProperty.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDProperty.cs index 1c82dc0d17..ba9d8ff9d9 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDProperty.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDProperty.cs @@ -6,6 +6,10 @@ public class TDProperty : TDDataSchema, IEquatable, IDeserializable { + public const string ReadOnlyName = "readOnly"; + public const string PlaceholderName = "dtv:placeholder"; + public const string FormsName = "forms"; + public ValueTracker? ReadOnly { get; set; } public ValueTracker? Placeholder { get; set; } @@ -112,19 +116,21 @@ public override IEnumerable Traverse() while (reader.TokenType == JsonTokenType.PropertyName) { string propertyName = reader.GetString()!; + ParsingSupport.CheckForDuplicatePropertyName(ref reader, propertyName, prop.PropertyNames, "property"); + prop.PropertyNames[propertyName] = reader.TokenStartIndex; reader.Read(); if (!TryLoadPropertyValues(prop, propertyName, ref reader)) { switch (propertyName) { - case "readOnly": + case ReadOnlyName: prop.ReadOnly = ValueTracker.Deserialize(ref reader); break; - case "dtv:placeholder": + case PlaceholderName: prop.Placeholder = ValueTracker.Deserialize(ref reader); break; - case "forms": + case FormsName: prop.Forms = ArrayTracker.Deserialize(ref reader); break; default: diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDSchemaReference.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDSchemaReference.cs index fe1fef5260..303552b4a0 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDSchemaReference.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDSchemaReference.cs @@ -6,12 +6,18 @@ public class TDSchemaReference : IEquatable, IDeserializable { + public const string SuccessName = "success"; + public const string ContentTypeName = "contentType"; + public const string SchemaName = "schema"; + public ValueTracker? Success { get; set; } public ValueTracker? ContentType { get; set; } public ValueTracker? Schema { get; set; } + public Dictionary PropertyNames { get; set; } = new(); + public virtual bool Equals(TDSchemaReference? other) { if (other == null) @@ -104,17 +110,19 @@ public static TDSchemaReference Deserialize(ref Utf8JsonReader reader) while (reader.TokenType == JsonTokenType.PropertyName) { string propertyName = reader.GetString()!; + ParsingSupport.CheckForDuplicatePropertyName(ref reader, propertyName, schemaRef.PropertyNames, "schema reference"); + schemaRef.PropertyNames[propertyName] = reader.TokenStartIndex; reader.Read(); switch (propertyName) { - case "success": + case SuccessName: schemaRef.Success = ValueTracker.Deserialize(ref reader); break; - case "contentType": + case ContentTypeName: schemaRef.ContentType = ValueTracker.Deserialize(ref reader); break; - case "schema": + case SchemaName: schemaRef.Schema = ValueTracker.Deserialize(ref reader); break; default: diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDThing.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDThing.cs index e22a05ae36..c9888c2c55 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDThing.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDThing.cs @@ -6,6 +6,16 @@ public class TDThing : IEquatable, IDeserializable { + public const string ContextName = "@context"; + public const string IdName = "id"; + public const string TitleName = "title"; + public const string LinksName = "links"; + public const string SchemaDefinitionsName = "schemaDefinitions"; + public const string FormsName = "forms"; + public const string ActionsName = "actions"; + public const string PropertiesName = "properties"; + public const string EventsName = "events"; + public ArrayTracker? Context { get; set; } public ValueTracker? Id { get; set; } @@ -24,6 +34,8 @@ public class TDThing : IEquatable, IDeserializable public MapTracker? Events { get; set; } + public Dictionary PropertyNames { get; set; } = new(); + public virtual bool Equals(TDThing? other) { if (other == null) @@ -166,35 +178,37 @@ public static TDThing Deserialize(ref Utf8JsonReader reader) while (reader.TokenType == JsonTokenType.PropertyName) { string propertyName = reader.GetString()!; + ParsingSupport.CheckForDuplicatePropertyName(ref reader, propertyName, thing.PropertyNames, "thing"); + thing.PropertyNames[propertyName] = reader.TokenStartIndex; reader.Read(); switch (propertyName) { - case "@context": + case ContextName: thing.Context = ArrayTracker.Deserialize(ref reader); break; - case "id": + case IdName: thing.Id = ValueTracker.Deserialize(ref reader); break; - case "title": + case TitleName: thing.Title = ValueTracker.Deserialize(ref reader); break; - case "links": + case LinksName: thing.Links = ArrayTracker.Deserialize(ref reader); break; - case "schemaDefinitions": + case SchemaDefinitionsName: thing.SchemaDefinitions = MapTracker.Deserialize(ref reader); break; - case "forms": + case FormsName: thing.Forms = ArrayTracker.Deserialize(ref reader); break; - case "actions": + case ActionsName: thing.Actions = MapTracker.Deserialize(ref reader); break; - case "properties": + case PropertiesName: thing.Properties = MapTracker.Deserialize(ref reader); break; - case "events": + case EventsName: thing.Events = MapTracker.Deserialize(ref reader); break; default: diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/ParsingSupport.cs b/codegen2/src/Azure.Iot.Operations.TDParser/ParsingSupport.cs new file mode 100644 index 0000000000..bd1db8b2b4 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TDParser/ParsingSupport.cs @@ -0,0 +1,24 @@ +namespace Azure.Iot.Operations.TDParser +{ + using System; + using System.Collections.Generic; + using System.Text.Json; + + public static class ParsingSupport + { + public static void CheckForDuplicatePropertyName(ref Utf8JsonReader reader, string propertyName, Dictionary propertyNames, string objectDesc) + { + if (propertyNames.ContainsKey(propertyName)) + { + while (reader.TokenType == JsonTokenType.PropertyName) + { + reader.Read(); + reader.Skip(); + reader.Read(); + } + + throw new InvalidOperationException($"duplicate property name '{propertyName}' found in {objectDesc} object"); + } + } + } +} From 6662c3c776608cc633a7f41d71e794ead2fbd671 Mon Sep 17 00:00:00 2001 From: Auto Gen Date: Mon, 8 Dec 2025 12:15:38 -0800 Subject: [PATCH 18/52] flag action reference type errors --- .../ErrorLog.cs | 37 +++++++++++++-- .../ErrorReporter.cs | 14 +++++- .../ThingValidator.cs | 2 +- .../ActionSchemaGenerator.cs | 14 ++++-- .../AliasSpec.cs | 2 +- .../FieldSpec.cs | 5 +- .../PropertySchemaGenerator.cs | 2 +- .../json/t4/AliasJsonSchema.tt | 3 ++ .../ArrayTracker.cs | 6 +-- .../MapTracker.cs | 10 ++-- .../Model/TDAction.cs | 12 ++--- .../Model/TDContextSpecifier.cs | 4 +- .../Model/TDDataSchema.cs | 32 ++++++------- .../Model/TDEvent.cs | 8 ++-- .../Model/TDForm.cs | 16 +++---- .../Model/TDLink.cs | 6 +-- .../Model/TDProperty.cs | 6 +-- .../Model/TDSchemaReference.cs | 6 +-- .../Model/TDThing.cs | 18 ++++---- .../ValueTracker.cs | 6 ++- .../JsonSchemaStandardizer.cs | 46 +++++++++++++++---- 21 files changed, 169 insertions(+), 86 deletions(-) diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs index f46d68c300..b84af4f762 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs @@ -6,6 +6,7 @@ public class ErrorLog { private readonly Dictionary> referencesFromThings; + private readonly Dictionary<(string, string), List> typedReferencesFromThings; private readonly Dictionary> namesInThings; private readonly Dictionary>> schemaNames; private readonly string defaultFolder; @@ -21,6 +22,7 @@ public class ErrorLog public ErrorLog(string defaultFolder) { this.referencesFromThings = new Dictionary>(); + this.typedReferencesFromThings = new Dictionary<(string, string), List>(); this.namesInThings = new Dictionary>(); this.schemaNames = new Dictionary>>(); this.defaultFolder = defaultFolder; @@ -61,15 +63,28 @@ public void CheckForDuplicatesInSchemas() public void RegisterReferenceFromThing(string refPath, string filename, int lineNumber, string refValue) { string fullPath = Path.GetFullPath(Path.Combine(this.defaultFolder, refPath)).Replace('\\', '/'); + if (!referencesFromThings.TryGetValue(fullPath, out List? references)) { references = new(); referencesFromThings[fullPath] = references; } - references.Add(new ExternalReference(filename, lineNumber, refValue)); } + public void RegisterTypedReferenceFromThing(string refPath, string filename, int lineNumber, string type, string refValue) + { + string fullPath = Path.GetFullPath(Path.Combine(this.defaultFolder, refPath)).Replace('\\', '/'); + var key = (fullPath, type); + + if (!typedReferencesFromThings.TryGetValue(key, out List? typedReferences)) + { + typedReferences = new(); + typedReferencesFromThings[key] = typedReferences; + } + typedReferences.Add(new ExternalReference(filename, lineNumber, refValue)); + } + public void RegisterNameInThing(string name, string filename, int lineNumber) { if (!namesInThings.TryGetValue(name, out Dictionary? nameSites)) @@ -122,9 +137,9 @@ public void AddError(ErrorLevel level, string message, string filename, int line } } - public void AddReferenceError(string refPath, string description, string reason, string filename, int lineNumber, string refValue) + public void AddReferenceError(string refPath, string description, string reason, string filename, string dirpath, int lineNumber, string refValue) { - if (referencesFromThings.TryGetValue(refPath, out List? references)) + if (dirpath.Equals(this.defaultFolder) && referencesFromThings.TryGetValue(refPath, out List? references)) { foreach (ExternalReference reference in references) { @@ -136,5 +151,21 @@ public void AddReferenceError(string refPath, string description, string reason, AddError(ErrorLevel.Error, $"{description} \"{refValue}\" not resolvable; {reason}", filename, lineNumber); } } + + public void AddReferenceTypeError(string refPath, string description, string filename, string dirpath, int lineNumber, string refValue, string refType, string actualType) + { + var key = (refPath, refType); + if (dirpath.Equals(this.defaultFolder) && typedReferencesFromThings.TryGetValue(key, out List? typedReferences)) + { + foreach (ExternalReference reference in typedReferences) + { + AddError(ErrorLevel.Error, $"External schema reference \"{reference.RefValue}\" is expected to define a schema of type \"{refType}\", but it defines a schema of type \"{actualType}\"", reference.Filename, reference.LineNumber); + } + } + else + { + AddError(ErrorLevel.Error, $"{description} \"{refValue}\" is expected to define a schema of type \"{refType}\", but it defines a schema of type \"{actualType}\"", filename, lineNumber); + } + } } } diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs index 06da5dfdb2..68c453f818 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs @@ -27,6 +27,12 @@ public void RegisterReferenceFromThing(long byteIndex, string refValue) this.errorLog.RegisterReferenceFromThing(refPath, this.filename, GetLineNumber(byteIndex), refValue); } + public void RegisterTypedReferenceFromThing(long byteIndex, string type, string refValue) + { + string refPath = refValue.Contains('/') ? Path.GetFullPath(Path.Combine(this.basePath, refValue)).Replace('\\', '/') : refValue; + this.errorLog.RegisterTypedReferenceFromThing(refPath, this.filename, GetLineNumber(byteIndex), type, refValue); + } + public void RegisterNameInThing(string name, long byteIndex) { this.errorLog.RegisterNameInThing(name, this.filename, GetLineNumber(byteIndex)); @@ -55,7 +61,13 @@ public void ReportFatal(string message, long byteIndex, long cfByteIndex = -1) public void ReportReferenceError(string description, string reason, string refValue, long byteIndex) { string refPath = Path.GetFullPath(Path.Combine(this.basePath, refValue)).Replace('\\', '/'); - this.errorLog.AddReferenceError(refPath, description, reason, this.filename, GetLineNumber(byteIndex), refValue); + this.errorLog.AddReferenceError(refPath, description, reason, this.filename, this.basePath, GetLineNumber(byteIndex), refValue); + } + + public void ReportReferenceTypeError(string description, string refValue, long byteIndex, string refType, string actualType) + { + string refPath = Path.GetFullPath(Path.Combine(this.basePath, refValue)).Replace('\\', '/'); + this.errorLog.AddReferenceTypeError(refPath, description, this.filename, this.basePath, GetLineNumber(byteIndex), refValue, refType, actualType); } public void ReportJsonException(Exception ex) diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs index bd7923cae4..23de726b43 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs @@ -162,7 +162,7 @@ private void CheckSchemaDefinitionsCoverage(MapTracker? schemaDefi foreach (string unreferencedSchemaKey in unreferencedSchemaKeys) { - errorReporter.ReportWarning($"Schema definition '{unreferencedSchemaKey}' is defined in '{TDThing.SchemaDefinitionsName}' but is neither a constant declaration nor a type that is referenced by any action or property.", schemaDefinitions.Entries[unreferencedSchemaKey].TokenIndex); + errorReporter.ReportWarning($"'{TDThing.SchemaDefinitionsName}' key '{unreferencedSchemaKey}' has a value that is neither a constant declaration nor a type that is referenced by any action or property; definition will be ignored.", schemaDefinitions.Entries[unreferencedSchemaKey].TokenIndex); } } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs index 9c1fbfe8cd..62e233b477 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs @@ -8,6 +8,8 @@ internal static class ActionSchemaGenerator { + private const string InputOutputType = "object"; + internal static void GenerateActionSchemas(ErrorReporter errorReporter, TDThing tdThing, string dirName, SchemaNamer schemaNamer, string projectName, Dictionary schemaSpecs, Dictionary> referencedSchemas) { foreach (KeyValuePair> actionKvp in tdThing.Actions?.Entries ?? new()) @@ -45,10 +47,12 @@ private static void ProcessAction( if (actionForm?.TopicPattern != null) { - if (tdAction.Input?.Value?.Ref?.Value != null) + ValueTracker? inputRef = tdAction.Input?.Value?.Ref; + if (inputRef != null) { string inputSchemaName = schemaNamer.GetActionInSchema(null, actionName); - schemaSpecs[inputSchemaName] = new AliasSpec(null, tdAction.Input.Value.Ref.Value.Value, actionForm.Format, inputSchemaName, dirName, TokenIndex: -1); + schemaSpecs[inputSchemaName] = new AliasSpec(null, InputOutputType, inputRef.Value.Value, actionForm.Format, inputSchemaName, dirName, TokenIndex: -1); + errorReporter.RegisterTypedReferenceFromThing(inputRef.TokenIndex, InputOutputType, inputRef.Value.Value); } else if (tdAction.Input?.Value != null) { @@ -58,10 +62,12 @@ private static void ProcessAction( } Dictionary responseFields = new(); - if (tdAction.Output?.Value?.Ref?.Value != null) + ValueTracker? outputRef = tdAction.Output?.Value?.Ref; + if (outputRef != null) { string outputSchemaName = schemaNamer.GetActionOutSchema(null, actionName); - schemaSpecs[outputSchemaName] = new AliasSpec(null, tdAction.Output.Value.Ref.Value.Value, actionForm.Format, outputSchemaName, dirName, TokenIndex: -1); + schemaSpecs[outputSchemaName] = new AliasSpec(null, InputOutputType, outputRef.Value.Value, actionForm.Format, outputSchemaName, dirName, TokenIndex: -1); + errorReporter.RegisterTypedReferenceFromThing(outputRef.TokenIndex, InputOutputType, outputRef.Value.Value); } else if (tdAction.Output?.Value != null) { diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/AliasSpec.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/AliasSpec.cs index fa70724765..2fb8dbe16b 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/AliasSpec.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/AliasSpec.cs @@ -2,5 +2,5 @@ { using Azure.Iot.Operations.CodeGeneration; - internal record AliasSpec(string? Description, string Ref, SerializationFormat Format, string SchemaName, string Base, long TokenIndex) : SchemaSpec(Format, TokenIndex); + internal record AliasSpec(string? Description, string? Type, string Ref, SerializationFormat Format, string SchemaName, string Base, long TokenIndex) : SchemaSpec(Format, TokenIndex); } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/FieldSpec.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/FieldSpec.cs index 33a10cc5b2..35b9c2a083 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/FieldSpec.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/FieldSpec.cs @@ -12,10 +12,11 @@ internal static FieldSpec CreateFixed(string title, string description, string b description, new ValueTracker { + PropertyName = string.Empty, Value = new TDDataSchema { - Title = new ValueTracker { Value = new StringHolder { Value = title } }, - Type = new ValueTracker { Value = new StringHolder { Value = TDValues.TypeObject } }, + Title = new ValueTracker { PropertyName = string.Empty, Value = new StringHolder { Value = title } }, + Type = new ValueTracker { PropertyName = string.Empty, Value = new StringHolder { Value = TDValues.TypeObject } }, }, }, Require: false, diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/PropertySchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/PropertySchemaGenerator.cs index 8999067f2b..7fe9131a06 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/PropertySchemaGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/PropertySchemaGenerator.cs @@ -115,7 +115,7 @@ private static void ProcessProperty( FieldSpec propFieldSpec = new( tdProperty.Description?.Value.Value ?? (isRead ? $"The '{propName}' Property value." : $"Value for the '{propName}' Property."), - new ValueTracker { Value = tdProperty as TDDataSchema }, + new ValueTracker { PropertyName = string.Empty, Value = tdProperty as TDDataSchema }, BackupSchemaName: schemaNamer.GetPropValueSchema(propName), Require: isRead, Base: dirName, diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/AliasJsonSchema.tt b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/AliasJsonSchema.tt index 9891b1c06d..241562c955 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/AliasJsonSchema.tt +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/AliasJsonSchema.tt @@ -2,6 +2,9 @@ { "$schema": "https://json-schema.org/draft-07/schema", "title": "<#=this.schemaName#>", +<# if (this.aliasSpec.Type != null) { #> + "type": "<#=this.aliasSpec.Type#>", +<# } #> <# if (this.aliasSpec.Description != null) { #> "description": "<#=this.aliasSpec.Description#>", <# } #> diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/ArrayTracker.cs b/codegen2/src/Azure.Iot.Operations.TDParser/ArrayTracker.cs index 58286eddc5..d4a65eb5c5 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/ArrayTracker.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/ArrayTracker.cs @@ -101,13 +101,13 @@ public IEnumerable Traverse() } } - public static ArrayTracker Deserialize(ref Utf8JsonReader reader) + public static ArrayTracker Deserialize(ref Utf8JsonReader reader, string propertyName) { long tokenIndex = reader.TokenStartIndex; if (reader.TokenType != JsonTokenType.StartArray) { - ValueTracker valueTracker = ValueTracker.Deserialize(ref reader); + ValueTracker valueTracker = ValueTracker.Deserialize(ref reader, propertyName); return new ArrayTracker { @@ -121,7 +121,7 @@ public static ArrayTracker Deserialize(ref Utf8JsonReader reader) reader.Read(); while (reader.TokenType != JsonTokenType.EndArray) { - elements.Add(ValueTracker.Deserialize(ref reader)); + elements.Add(ValueTracker.Deserialize(ref reader, propertyName)); reader.Read(); } diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/MapTracker.cs b/codegen2/src/Azure.Iot.Operations.TDParser/MapTracker.cs index f8f5f70382..34177479f1 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/MapTracker.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/MapTracker.cs @@ -101,7 +101,7 @@ public IEnumerable Traverse() } } - public static MapTracker Deserialize(ref Utf8JsonReader reader) + public static MapTracker Deserialize(ref Utf8JsonReader reader, string propertyName) { long tokenIndex = reader.TokenStartIndex; string? deserializationError = null; @@ -121,15 +121,15 @@ public static MapTracker Deserialize(ref Utf8JsonReader reader) reader.Read(); while (reader.TokenType == JsonTokenType.PropertyName) { - string propertyName = reader.GetString()!; + string keyName = reader.GetString()!; reader.Read(); - if (entries.ContainsKey(propertyName)) + if (entries.ContainsKey(keyName)) { - deserializationError = $"duplicate property name '{propertyName}' found in map"; + deserializationError = $"duplicate property name '{keyName}' found in map"; } - entries[propertyName] = ValueTracker.Deserialize(ref reader); + entries[keyName] = ValueTracker.Deserialize(ref reader, propertyName); reader.Read(); } diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAction.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAction.cs index 1c68555a8c..832fbf675e 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAction.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAction.cs @@ -152,22 +152,22 @@ public static TDAction Deserialize(ref Utf8JsonReader reader) switch (propertyName) { case DescriptionName: - action.Description = ValueTracker.Deserialize(ref reader); + action.Description = ValueTracker.Deserialize(ref reader, DescriptionName); break; case InputName: - action.Input = ValueTracker.Deserialize(ref reader); + action.Input = ValueTracker.Deserialize(ref reader, InputName); break; case OutputName: - action.Output = ValueTracker.Deserialize(ref reader); + action.Output = ValueTracker.Deserialize(ref reader, OutputName); break; case IdempotentName: - action.Idempotent = ValueTracker.Deserialize(ref reader); + action.Idempotent = ValueTracker.Deserialize(ref reader, IdempotentName); break; case SafeName: - action.Safe = ValueTracker.Deserialize(ref reader); + action.Safe = ValueTracker.Deserialize(ref reader, SafeName); break; case FormsName: - action.Forms = ArrayTracker.Deserialize(ref reader); + action.Forms = ArrayTracker.Deserialize(ref reader, FormsName); break; default: reader.Skip(); diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDContextSpecifier.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDContextSpecifier.cs index 0e90f356d4..ad86d975f8 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDContextSpecifier.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDContextSpecifier.cs @@ -94,12 +94,12 @@ public static TDContextSpecifier Deserialize(ref Utf8JsonReader reader) case JsonTokenType.StartObject: return new TDContextSpecifier { - Local = MapTracker.Deserialize(ref reader), + Local = MapTracker.Deserialize(ref reader, string.Empty), }; case JsonTokenType.String: return new TDContextSpecifier { - Remote = ValueTracker.Deserialize(ref reader), + Remote = ValueTracker.Deserialize(ref reader, string.Empty), }; default: throw new InvalidOperationException($"expected string or JSON object but found {reader.TokenType}"); diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs index affc322d19..2d31845f4c 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs @@ -276,52 +276,52 @@ protected static bool TryLoadPropertyValues(TDDataSchema dataSchema, string prop switch (propertyName) { case RefName: - dataSchema.Ref = ValueTracker.Deserialize(ref reader); + dataSchema.Ref = ValueTracker.Deserialize(ref reader, RefName); return true; case TitleName: - dataSchema.Title = ValueTracker.Deserialize(ref reader); + dataSchema.Title = ValueTracker.Deserialize(ref reader, TitleName); return true; case DescriptionName: - dataSchema.Description = ValueTracker.Deserialize(ref reader); + dataSchema.Description = ValueTracker.Deserialize(ref reader, DescriptionName); return true; case TypeName: - dataSchema.Type = ValueTracker.Deserialize(ref reader); + dataSchema.Type = ValueTracker.Deserialize(ref reader, TypeName); return true; case ConstName: - dataSchema.Const = ValueTracker.Deserialize(ref reader); + dataSchema.Const = ValueTracker.Deserialize(ref reader, ConstName); return true; case MinimumName: - dataSchema.Minimum = ValueTracker.Deserialize(ref reader); + dataSchema.Minimum = ValueTracker.Deserialize(ref reader, MinimumName); return true; case MaximumName: - dataSchema.Maximum = ValueTracker.Deserialize(ref reader); + dataSchema.Maximum = ValueTracker.Deserialize(ref reader, MaximumName); return true; case FormatName: - dataSchema.Format = ValueTracker.Deserialize(ref reader); + dataSchema.Format = ValueTracker.Deserialize(ref reader, FormatName); return true; case PatternName: - dataSchema.Pattern = ValueTracker.Deserialize(ref reader); + dataSchema.Pattern = ValueTracker.Deserialize(ref reader, PatternName); return true; case ContentEncodingName: - dataSchema.ContentEncoding = ValueTracker.Deserialize(ref reader); + dataSchema.ContentEncoding = ValueTracker.Deserialize(ref reader, ContentEncodingName); return true; case AdditionalPropertiesName: - dataSchema.AdditionalProperties = ValueTracker.Deserialize(ref reader); + dataSchema.AdditionalProperties = ValueTracker.Deserialize(ref reader, AdditionalPropertiesName); return true; case EnumName: - dataSchema.Enum = ArrayTracker.Deserialize(ref reader); + dataSchema.Enum = ArrayTracker.Deserialize(ref reader, EnumName); return true; case RequiredName: - dataSchema.Required = ArrayTracker.Deserialize(ref reader); + dataSchema.Required = ArrayTracker.Deserialize(ref reader, RequiredName); return true; case ErrorMessageName: - dataSchema.ErrorMessage = ValueTracker.Deserialize(ref reader); + dataSchema.ErrorMessage = ValueTracker.Deserialize(ref reader, ErrorMessageName); return true; case PropertiesName: - dataSchema.Properties = MapTracker.Deserialize(ref reader); + dataSchema.Properties = MapTracker.Deserialize(ref reader, PropertiesName); return true; case ItemsName: - dataSchema.Items = ValueTracker.Deserialize(ref reader); + dataSchema.Items = ValueTracker.Deserialize(ref reader, ItemsName); return true; default: return false; diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDEvent.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDEvent.cs index 110e83558c..0e9d3a5e67 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDEvent.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDEvent.cs @@ -130,16 +130,16 @@ public static TDEvent Deserialize(ref Utf8JsonReader reader) switch (propertyName) { case DescriptionName: - evt.Description = ValueTracker.Deserialize(ref reader); + evt.Description = ValueTracker.Deserialize(ref reader, DescriptionName); break; case DataName: - evt.Data = ValueTracker.Deserialize(ref reader); + evt.Data = ValueTracker.Deserialize(ref reader, DataName); break; case PlaceholderName: - evt.Placeholder = ValueTracker.Deserialize(ref reader); + evt.Placeholder = ValueTracker.Deserialize(ref reader, PlaceholderName); break; case FormsName: - evt.Forms = ArrayTracker.Deserialize(ref reader); + evt.Forms = ArrayTracker.Deserialize(ref reader, FormsName); break; default: reader.Skip(); diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDForm.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDForm.cs index ea019e293e..ffb5e9b3d8 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDForm.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDForm.cs @@ -174,28 +174,28 @@ public static TDForm Deserialize(ref Utf8JsonReader reader) switch (propertyName) { case HrefName: - form.Href = ValueTracker.Deserialize(ref reader); + form.Href = ValueTracker.Deserialize(ref reader, HrefName); break; case ContentTypeName: - form.ContentType = ValueTracker.Deserialize(ref reader); + form.ContentType = ValueTracker.Deserialize(ref reader, ContentTypeName); break; case AdditionalResponsesName: - form.AdditionalResponses = ArrayTracker.Deserialize(ref reader); + form.AdditionalResponses = ArrayTracker.Deserialize(ref reader, AdditionalResponsesName); break; case HeaderInfoName: - form.HeaderInfo = ArrayTracker.Deserialize(ref reader); + form.HeaderInfo = ArrayTracker.Deserialize(ref reader, HeaderInfoName); break; case HeaderCodeName: - form.HeaderCode = ValueTracker.Deserialize(ref reader); + form.HeaderCode = ValueTracker.Deserialize(ref reader, HeaderCodeName); break; case ServiceGroupIdName: - form.ServiceGroupId = ValueTracker.Deserialize(ref reader); + form.ServiceGroupId = ValueTracker.Deserialize(ref reader, ServiceGroupIdName); break; case TopicName: - form.Topic = ValueTracker.Deserialize(ref reader); + form.Topic = ValueTracker.Deserialize(ref reader, TopicName); break; case OpName: - form.Op = ArrayTracker.Deserialize(ref reader); + form.Op = ArrayTracker.Deserialize(ref reader, OpName); break; default: reader.Skip(); diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDLink.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDLink.cs index b4543ebe17..06c430904c 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDLink.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDLink.cs @@ -117,13 +117,13 @@ public static TDLink Deserialize(ref Utf8JsonReader reader) switch (propertyName) { case HrefName: - link.Href = ValueTracker.Deserialize(ref reader); + link.Href = ValueTracker.Deserialize(ref reader, HrefName); break; case TypeName: - link.Type = ValueTracker.Deserialize(ref reader); + link.Type = ValueTracker.Deserialize(ref reader, TypeName); break; case RelName: - link.Rel = ValueTracker.Deserialize(ref reader); + link.Rel = ValueTracker.Deserialize(ref reader, RelName); break; default: reader.Skip(); diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDProperty.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDProperty.cs index ba9d8ff9d9..fdc5fdb6fb 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDProperty.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDProperty.cs @@ -125,13 +125,13 @@ public override IEnumerable Traverse() switch (propertyName) { case ReadOnlyName: - prop.ReadOnly = ValueTracker.Deserialize(ref reader); + prop.ReadOnly = ValueTracker.Deserialize(ref reader, ReadOnlyName); break; case PlaceholderName: - prop.Placeholder = ValueTracker.Deserialize(ref reader); + prop.Placeholder = ValueTracker.Deserialize(ref reader, PlaceholderName); break; case FormsName: - prop.Forms = ArrayTracker.Deserialize(ref reader); + prop.Forms = ArrayTracker.Deserialize(ref reader, FormsName); break; default: reader.Skip(); diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDSchemaReference.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDSchemaReference.cs index 303552b4a0..2483758525 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDSchemaReference.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDSchemaReference.cs @@ -117,13 +117,13 @@ public static TDSchemaReference Deserialize(ref Utf8JsonReader reader) switch (propertyName) { case SuccessName: - schemaRef.Success = ValueTracker.Deserialize(ref reader); + schemaRef.Success = ValueTracker.Deserialize(ref reader, SuccessName); break; case ContentTypeName: - schemaRef.ContentType = ValueTracker.Deserialize(ref reader); + schemaRef.ContentType = ValueTracker.Deserialize(ref reader, ContentTypeName); break; case SchemaName: - schemaRef.Schema = ValueTracker.Deserialize(ref reader); + schemaRef.Schema = ValueTracker.Deserialize(ref reader, SchemaName); break; default: reader.Skip(); diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDThing.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDThing.cs index c9888c2c55..bb4d72cfa7 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDThing.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDThing.cs @@ -185,31 +185,31 @@ public static TDThing Deserialize(ref Utf8JsonReader reader) switch (propertyName) { case ContextName: - thing.Context = ArrayTracker.Deserialize(ref reader); + thing.Context = ArrayTracker.Deserialize(ref reader, ContextName); break; case IdName: - thing.Id = ValueTracker.Deserialize(ref reader); + thing.Id = ValueTracker.Deserialize(ref reader, IdName); break; case TitleName: - thing.Title = ValueTracker.Deserialize(ref reader); + thing.Title = ValueTracker.Deserialize(ref reader, TitleName); break; case LinksName: - thing.Links = ArrayTracker.Deserialize(ref reader); + thing.Links = ArrayTracker.Deserialize(ref reader, LinksName); break; case SchemaDefinitionsName: - thing.SchemaDefinitions = MapTracker.Deserialize(ref reader); + thing.SchemaDefinitions = MapTracker.Deserialize(ref reader, SchemaDefinitionsName); break; case FormsName: - thing.Forms = ArrayTracker.Deserialize(ref reader); + thing.Forms = ArrayTracker.Deserialize(ref reader, FormsName); break; case ActionsName: - thing.Actions = MapTracker.Deserialize(ref reader); + thing.Actions = MapTracker.Deserialize(ref reader, ActionsName); break; case PropertiesName: - thing.Properties = MapTracker.Deserialize(ref reader); + thing.Properties = MapTracker.Deserialize(ref reader, PropertiesName); break; case EventsName: - thing.Events = MapTracker.Deserialize(ref reader); + thing.Events = MapTracker.Deserialize(ref reader, EventsName); break; default: reader.Skip(); diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/ValueTracker.cs b/codegen2/src/Azure.Iot.Operations.TDParser/ValueTracker.cs index 9534d724db..776b8ae477 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/ValueTracker.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/ValueTracker.cs @@ -7,6 +7,8 @@ public class ValueTracker : IEquatable>, ISourceTracker where T : IDeserializable { + public required string PropertyName { get; set; } + public required T Value { get; set; } public bool DeserializingFailed { get; set; } @@ -86,7 +88,7 @@ public IEnumerable Traverse() } } - public static ValueTracker Deserialize(ref Utf8JsonReader reader) + public static ValueTracker Deserialize(ref Utf8JsonReader reader, string propertyName) { long tokenIndex = reader.TokenStartIndex; @@ -95,6 +97,7 @@ public static ValueTracker Deserialize(ref Utf8JsonReader reader) T value = T.Deserialize(ref reader); return new ValueTracker { + PropertyName = propertyName, Value = value, TokenIndex = tokenIndex, }; @@ -105,6 +108,7 @@ public static ValueTracker Deserialize(ref Utf8JsonReader reader) return new ValueTracker { + PropertyName = propertyName, Value = default!, DeserializingFailed = true, DeserializationError = ex.Message, diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs index 47048c2846..3c06c94b95 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs @@ -33,7 +33,7 @@ public bool TryGetStandardizedSchemas(Dictionary schemaTextsByNa foreach (KeyValuePair namedSchemaRoot in schemaRootsByName) { - if (!TryGetSchemaType(namedSchemaRoot.Key, null, namedSchemaRoot.Value.JsonTracker, false, schemaTypeDict, schemaRootsByName, namedSchemaRoot.Value.ErrorReporter, out _, true)) + if (!TryGetSchemaType(namedSchemaRoot.Key, null, namedSchemaRoot.Value.JsonTracker, false, schemaTypeDict, schemaRootsByName, namedSchemaRoot.Value.ErrorReporter, out _, out _, true)) { hasError = true; } @@ -44,7 +44,7 @@ public bool TryGetStandardizedSchemas(Dictionary schemaTextsByNa { foreach (KeyValuePair defProp in defsTracker.EnumerateObject()) { - if (!TryGetSchemaType(namedSchemaRoot.Key, defProp.Key, defProp.Value, false, schemaTypeDict, schemaRootsByName, namedSchemaRoot.Value.ErrorReporter, out _, false)) + if (!TryGetSchemaType(namedSchemaRoot.Key, defProp.Key, defProp.Value, false, schemaTypeDict, schemaRootsByName, namedSchemaRoot.Value.ErrorReporter, out _, out _, false)) { hasError = true; } @@ -84,9 +84,11 @@ private bool TryGetSchemaType( Dictionary schemaRootsByName, ErrorReporter? errorReporter, [NotNullWhen(true)] out SchemaType? schemaType, + [NotNullWhen(true)] out string? jsonSchemaType, bool isTopLevel = false) { schemaType = null; + jsonSchemaType = null; bool hasError = false; if (schemaTracker.ValueKind != JsonValueKind.Object) @@ -131,7 +133,7 @@ private bool TryGetSchemaType( if (schemaTracker.TryGetProperty(JsonSchemaValues.PropertyRef, out _)) { - return TryGetReferenceSchemaType(docName, defKey, schemaTracker, orNull, schemaTypes, schemaRootsByName, errorReporter, out schemaType) && !hasError; + return TryGetReferenceSchemaType(docName, defKey, schemaTracker, orNull, schemaTypes, schemaRootsByName, errorReporter, out schemaType, out jsonSchemaType) && !hasError; } if (!schemaTracker.TryGetProperty(JsonSchemaValues.PropertyType, out JsonTracker typeTracker)) @@ -151,7 +153,8 @@ private bool TryGetSchemaType( return false; } - switch (typeTracker.GetString()!) + jsonSchemaType = typeTracker.GetString(); + switch (jsonSchemaType) { case JsonSchemaValues.TypeObject: return TryGetObjectSchemaType(docName, defKey, schemaTracker, orNull, schemaTypes, schemaRootsByName, errorReporter, out schemaType, isTopLevel); @@ -248,9 +251,11 @@ private bool TryGetReferenceSchemaType( Dictionary? schemaTypes, Dictionary schemaRootsByName, ErrorReporter? errorReporter, - [NotNullWhen(true)] out SchemaType? schemaType) + [NotNullWhen(true)] out SchemaType? schemaType, + [NotNullWhen(true)] out string? jsonSchemaType) { schemaType = null; + jsonSchemaType = null; bool hasError = false; JsonTracker referencingTracker = schemaTracker.GetProperty(JsonSchemaValues.PropertyRef); @@ -264,6 +269,7 @@ private bool TryGetReferenceSchemaType( { if (prop.Key != JsonSchemaValues.PropertySchema && prop.Key != JsonSchemaValues.PropertyRef && + prop.Key != JsonSchemaValues.PropertyType && prop.Key != JsonSchemaValues.PropertyTitle && prop.Key != JsonSchemaValues.PropertyDescription) { @@ -271,11 +277,28 @@ private bool TryGetReferenceSchemaType( } } - if (hasError || !TryGetSchemaType(refName, refKey, refTracker, orNull, null, schemaRootsByName, null, out schemaType)) + if (hasError || !TryGetSchemaType(refName, refKey, refTracker, orNull, null, schemaRootsByName, null, out schemaType, out jsonSchemaType)) { return false; } + if (schemaTracker.TryGetProperty(JsonSchemaValues.PropertyType, out JsonTracker refTypeTracker)) + { + if (refTypeTracker.ValueKind != JsonValueKind.String || string.IsNullOrEmpty(refTypeTracker.GetString())) + { + errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyType}' property has non-string or empty value", refTypeTracker.TokenIndex); + return false; + } + + string referencedType = refTypeTracker.GetString(); + if (jsonSchemaType != referencedType) + { + string refString = referencingTracker.GetString(); + errorReporter?.ReportReferenceTypeError($"JSON Schema '{JsonSchemaValues.PropertyRef}' value", refString, referencingTracker.TokenIndex, referencedType, jsonSchemaType); + return false; + } + } + if (schemaTypes != null && schemaTracker.TryGetProperty(JsonSchemaValues.PropertyTitle, out JsonTracker titleTracker) && schemaType is ReferenceType refType) { CodeName schemaName = new CodeName(this.typeNamer.GenerateTypeName(docName, null, titleTracker.GetString())); @@ -333,7 +356,8 @@ private bool TryGetObjectSchemaType( schemaTypes, schemaRootsByName, errorReporter, - out SchemaType? valueSchemaType)) + out SchemaType? valueSchemaType, + out _)) { return false; } @@ -403,7 +427,8 @@ private bool TryGetObjectSchemaType( schemaTypes, schemaRootsByName, errorReporter, - out SchemaType? fieldSchemaType)) + out SchemaType? fieldSchemaType, + out _)) { string? fieldDesc = objProp.Value.TryGetProperty(JsonSchemaValues.PropertyDescription, out JsonTracker fieldDescTracker) ? fieldDescTracker.GetString() : null; objectFields[new CodeName(objProp.Key)] = new ObjectType.FieldInfo(fieldSchemaType, isRequired, fieldDesc); @@ -512,7 +537,8 @@ private bool TryGetArraySchemaType( schemaTypes, schemaRootsByName, errorReporter, - out SchemaType? itemSchemaType)) + out SchemaType? itemSchemaType, + out _)) { return false; } @@ -884,7 +910,7 @@ private bool TryGetReferenceInfo( return false; } - string refString = referencingTracker.GetString()!; + string refString = referencingTracker.GetString(); string unescapedString = Uri.UnescapeDataString(refString); int fragIx = unescapedString.IndexOf('#'); From 77ab73496a6365d16f5dc0aab9ead3491646a6ac Mon Sep 17 00:00:00 2001 From: Auto Gen Date: Wed, 10 Dec 2025 16:49:24 -0800 Subject: [PATCH 19/52] add Dtdl2Wot tool --- codegen2/codegen.sln | 6 + codegen2/res/conversion/SchemaNames.json | 49 ++ .../ThingValidator.cs | 21 +- .../ActionEnvoyGenerator.cs | 5 +- .../EnvoyGenerator.cs | 2 +- .../CommandHandler.cs | 41 +- .../ActionSchemaGenerator.cs | 4 +- .../json/JsonSchemaSupport.cs | 4 +- .../json/code/AliasJsonSchema.cs | 2 +- .../json/code/EnumJsonSchema.cs | 2 +- .../json/code/ObjectJsonSchema.cs | 2 +- .../JsonSchemaStandardizer.cs | 10 +- .../Dtdl2Wot/Array/code/ArrayThingSchema.cs | 22 + .../src/Dtdl2Wot/Array/t4/ArrayThingSchema.cs | 313 ++++++++++++ .../src/Dtdl2Wot/Array/t4/ArrayThingSchema.tt | 12 + codegen2/src/Dtdl2Wot/CodeName.cs | 223 +++++++++ .../Command/code/CommandAffordance.cs | 63 +++ .../Dtdl2Wot/Command/t4/CommandAffordance.cs | 446 ++++++++++++++++++ .../Dtdl2Wot/Command/t4/CommandAffordance.tt | 118 +++++ codegen2/src/Dtdl2Wot/Dtdl2Wot.csproj | 110 +++++ .../src/Dtdl2Wot/DtdlMqttExtensionValues.cs | 68 +++ .../src/Dtdl2Wot/Enum/code/EnumThingSchema.cs | 43 ++ .../src/Dtdl2Wot/Enum/t4/EnumThingSchema.cs | 321 +++++++++++++ .../src/Dtdl2Wot/Enum/t4/EnumThingSchema.tt | 17 + codegen2/src/Dtdl2Wot/ITemplateTransform.cs | 11 + .../Dtdl2Wot/Interface/code/InterfaceThing.cs | 80 ++++ .../Dtdl2Wot/Interface/t4/InterfaceThing.cs | 443 +++++++++++++++++ .../Dtdl2Wot/Interface/t4/InterfaceThing.tt | 122 +++++ .../src/Dtdl2Wot/Map/code/MapThingSchema.cs | 22 + .../src/Dtdl2Wot/Map/t4/MapThingSchema.cs | 313 ++++++++++++ .../src/Dtdl2Wot/Map/t4/MapThingSchema.tt | 12 + codegen2/src/Dtdl2Wot/MqttTopicTokens.cs | 58 +++ .../Dtdl2Wot/Object/code/ObjectThingSchema.cs | 36 ++ .../Dtdl2Wot/Object/t4/ObjectThingSchema.cs | 343 ++++++++++++++ .../Dtdl2Wot/Object/t4/ObjectThingSchema.tt | 30 ++ codegen2/src/Dtdl2Wot/PayloadFormat.cs | 36 ++ codegen2/src/Dtdl2Wot/Program.cs | 55 +++ .../Property/code/PropertyAffordance.cs | 46 ++ .../Property/t4/PropertyAffordance.cs | 355 ++++++++++++++ .../Property/t4/PropertyAffordance.tt | 50 ++ codegen2/src/Dtdl2Wot/RecursionException.cs | 15 + .../Telemetry/code/TelemetryAffordance.cs | 31 ++ .../Telemetry/t4/TelemetryAffordance.cs | 335 +++++++++++++ .../Telemetry/t4/TelemetryAffordance.tt | 30 ++ codegen2/src/Dtdl2Wot/ThingDescriber.cs | 132 ++++++ codegen2/src/Dtdl2Wot/ThingGenerator.cs | 52 ++ .../Protocol/CloudEvents/ValueExtractor.cs | 4 +- .../ReadCloudEvents/ValueExtractor.cs | 4 +- 48 files changed, 4499 insertions(+), 20 deletions(-) create mode 100644 codegen2/res/conversion/SchemaNames.json create mode 100644 codegen2/src/Dtdl2Wot/Array/code/ArrayThingSchema.cs create mode 100644 codegen2/src/Dtdl2Wot/Array/t4/ArrayThingSchema.cs create mode 100644 codegen2/src/Dtdl2Wot/Array/t4/ArrayThingSchema.tt create mode 100644 codegen2/src/Dtdl2Wot/CodeName.cs create mode 100644 codegen2/src/Dtdl2Wot/Command/code/CommandAffordance.cs create mode 100644 codegen2/src/Dtdl2Wot/Command/t4/CommandAffordance.cs create mode 100644 codegen2/src/Dtdl2Wot/Command/t4/CommandAffordance.tt create mode 100644 codegen2/src/Dtdl2Wot/Dtdl2Wot.csproj create mode 100644 codegen2/src/Dtdl2Wot/DtdlMqttExtensionValues.cs create mode 100644 codegen2/src/Dtdl2Wot/Enum/code/EnumThingSchema.cs create mode 100644 codegen2/src/Dtdl2Wot/Enum/t4/EnumThingSchema.cs create mode 100644 codegen2/src/Dtdl2Wot/Enum/t4/EnumThingSchema.tt create mode 100644 codegen2/src/Dtdl2Wot/ITemplateTransform.cs create mode 100644 codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs create mode 100644 codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.cs create mode 100644 codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt create mode 100644 codegen2/src/Dtdl2Wot/Map/code/MapThingSchema.cs create mode 100644 codegen2/src/Dtdl2Wot/Map/t4/MapThingSchema.cs create mode 100644 codegen2/src/Dtdl2Wot/Map/t4/MapThingSchema.tt create mode 100644 codegen2/src/Dtdl2Wot/MqttTopicTokens.cs create mode 100644 codegen2/src/Dtdl2Wot/Object/code/ObjectThingSchema.cs create mode 100644 codegen2/src/Dtdl2Wot/Object/t4/ObjectThingSchema.cs create mode 100644 codegen2/src/Dtdl2Wot/Object/t4/ObjectThingSchema.tt create mode 100644 codegen2/src/Dtdl2Wot/PayloadFormat.cs create mode 100644 codegen2/src/Dtdl2Wot/Program.cs create mode 100644 codegen2/src/Dtdl2Wot/Property/code/PropertyAffordance.cs create mode 100644 codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.cs create mode 100644 codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.tt create mode 100644 codegen2/src/Dtdl2Wot/RecursionException.cs create mode 100644 codegen2/src/Dtdl2Wot/Telemetry/code/TelemetryAffordance.cs create mode 100644 codegen2/src/Dtdl2Wot/Telemetry/t4/TelemetryAffordance.cs create mode 100644 codegen2/src/Dtdl2Wot/Telemetry/t4/TelemetryAffordance.tt create mode 100644 codegen2/src/Dtdl2Wot/ThingDescriber.cs create mode 100644 codegen2/src/Dtdl2Wot/ThingGenerator.cs diff --git a/codegen2/codegen.sln b/codegen2/codegen.sln index e36056f259..7fc4b26712 100644 --- a/codegen2/codegen.sln +++ b/codegen2/codegen.sln @@ -17,6 +17,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Azure.Iot.Operations.EnvoyG EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Azure.Iot.Operations.ProtocolCompiler", "src\Azure.Iot.Operations.ProtocolCompiler\Azure.Iot.Operations.ProtocolCompiler.csproj", "{5A83D072-8E7F-424C-B009-4A6011A13CA5}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dtdl2Wot", "src\Dtdl2Wot\Dtdl2Wot.csproj", "{67B4CD3D-17A8-4D63-9996-79A424E628A1}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -51,6 +53,10 @@ Global {5A83D072-8E7F-424C-B009-4A6011A13CA5}.Debug|Any CPU.Build.0 = Debug|Any CPU {5A83D072-8E7F-424C-B009-4A6011A13CA5}.Release|Any CPU.ActiveCfg = Release|Any CPU {5A83D072-8E7F-424C-B009-4A6011A13CA5}.Release|Any CPU.Build.0 = Release|Any CPU + {67B4CD3D-17A8-4D63-9996-79A424E628A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {67B4CD3D-17A8-4D63-9996-79A424E628A1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {67B4CD3D-17A8-4D63-9996-79A424E628A1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {67B4CD3D-17A8-4D63-9996-79A424E628A1}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/codegen2/res/conversion/SchemaNames.json b/codegen2/res/conversion/SchemaNames.json new file mode 100644 index 0000000000..3e5af9a599 --- /dev/null +++ b/codegen2/res/conversion/SchemaNames.json @@ -0,0 +1,49 @@ +{ + "aggregateEventName": "Telemetry", + "aggregateEventSchema": "TelemetryCollection", + "eventSchema": { + "in": [ "eventName" ], + "out": "{eventName}Telemetry", + "capitalize": true + }, + "eventValueSchema": { + "in": [ "eventSchema" ], + "out": "{eventSchema}Schema", + "capitalize": true + }, + "eventSenderBinder": { + "in": [ "eventSchema" ], + "out": "{eventSchema}TelemetrySender", + "capitalize": true + }, + "eventReceiverBinder": { + "in": [ "eventSchema" ], + "out": "{eventSchema}TelemetryReceiver", + "capitalize": true + }, + "actionInSchema": { + "in": [ "actionName" ], + "out": "{actionName}RequestPayload", + "capitalize": true + }, + "actionOutSchema": { + "in": [ "actionName" ], + "out": "{actionName}ResponsePayload", + "capitalize": true + }, + "actionExecutorBinder": { + "in": [ "actionName" ], + "out": "{actionName}CommandExecutor", + "capitalize": true + }, + "actionInvokerBinder": { + "in": [ "actionName" ], + "out": "{actionName}CommandInvoker", + "capitalize": true + }, + "actionRespErrorField": { + "in": [ "actionName", "errorSchemaName" ], + "out": "{actionName}Error", + "capitalize": false + } +} diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs index 23de726b43..6c1a429cc5 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs @@ -101,6 +101,11 @@ public bool TryValidateThng(TDThing thing) CheckSchemaDefinitionsCoverage(thing.SchemaDefinitions, thing.Actions, thing.Properties); + if ((thing.Actions?.Entries?.Count ?? 0) == 0 && (thing.Properties?.Entries?.Count ?? 0) == 0 && (thing.Events?.Entries?.Count ?? 0) == 0) + { + errorReporter.ReportWarning("Thing Description has no actions, properties, or events defined.", -1); + } + return !hasError; } @@ -1480,6 +1485,20 @@ private bool TryValidateStringDataSchema(ValueTracker dataSchema, DataSche hasError = true; } + if (dataSchema.Value.Const?.Value.Value != null) + { + if (dataSchema.Value.Title != null && !TitleRegex.IsMatch(dataSchema.Value.Title.Value.Value)) + { + errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a 'service-desc' linked schema naming file", dataSchema.Value.Title.TokenIndex); + } + + if (dataSchema.Value.Const.Value.Value is not string) + { + errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property value must be a string.", dataSchema.Value.Const.TokenIndex); + hasError = true; + } + } + if (dataSchema.Value.Format != null) { string formatValue = dataSchema.Value.Format.Value.Value; @@ -1704,7 +1723,7 @@ private bool TryValidateBooleanDataSchema(ValueTracker dataSchema, DataSch errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a 'service-desc' linked schema naming file", dataSchema.Value.Title.TokenIndex); } - if (dataSchema.Value.Const.Value.Value is not bool constValue) + if (dataSchema.Value.Const.Value.Value is not bool) { errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property value must be Boolean.", dataSchema.Value.Const.TokenIndex); hasError = true; diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs index 13cef289d0..36e0551639 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs @@ -28,6 +28,7 @@ internal static List GenerateActionEnvoys(ErrorReporter errorReporte string? inputSchemaType = action.Input != null ? schemaNamer.GetActionInSchema(action.Input?.Value, actionKvp.Key) : null; string? outArgsType = action.Output != null ? schemaNamer.GetActionOutSchema(action.Output?.Value, actionKvp.Key) : null; string? outputSchemaType = actionForm.ErrorRespSchema != null ? schemaNamer.GetActionRespSchema(actionKvp.Key) : outArgsType; + string? errRespName = actionForm.ErrorRespName != null ? schemaNamer.GetActionRespErrorField(actionKvp.Key, actionForm.ErrorRespName) : null; string? errSchemaName = schemaNamer.ChooseTitleOrName(actionForm.ErrorRespSchema?.Value.Title?.Value?.Value, actionForm.ErrorRespName); List normalResultNames = action.Output?.Value?.Properties?.Entries?.Keys?.ToList() ?? new(); @@ -46,7 +47,7 @@ internal static List GenerateActionEnvoys(ErrorReporter errorReporte normalResultNames, normalRequiredNames, outArgsType, - actionForm.ErrorRespName, + errRespName, errSchemaName, actionForm.HeaderCodeName, headerCodeSchema, @@ -68,7 +69,7 @@ internal static List GenerateActionEnvoys(ErrorReporter errorReporte normalResultNames, normalRequiredNames, outArgsType, - actionForm.ErrorRespName, + errRespName, errSchemaName, actionForm.HeaderCodeName, headerCodeSchema, diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs index 433ceef4c6..b9cd0e4317 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs @@ -107,7 +107,7 @@ private static void GenerateConstantEnvoys(Dictionary> schemaConstant in schemaConstants) { - foreach (IEnvoyTemplateTransform transform in envoyFactory.GetConstantTransforms(new CodeName(schemaConstant.Key), schemaConstant.Value.Values.OrderBy(c => c.Name.AsGiven).ToList())) + foreach (IEnvoyTemplateTransform transform in envoyFactory.GetConstantTransforms(new CodeName(schemaConstant.Key), schemaConstant.Value.Values.ToList())) { transforms[transform.FileName] = transform; } diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs index 3637463819..c43b028290 100644 --- a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs @@ -2,6 +2,8 @@ { using System; using System.Collections.Generic; + using System.ComponentModel; + using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; @@ -120,6 +122,25 @@ public static int GenerateCode(OptionContainer options) defaultImpl: options.DefaultImpl); WriteItems(generatedEnvoys, options.OutputDir); + if (targetLanguage == TargetLanguage.Rust) + { + GeneratedItem? cargoInfo = generatedEnvoys.FirstOrDefault(e => e.FileName.Equals("Cargo.toml", StringComparison.OrdinalIgnoreCase)); + if (cargoInfo != null) + { + string projectFolder = Path.Combine(options.OutputDir.FullName, cargoInfo.FolderPath); + try + { + RunCargo($"fmt --manifest-path {Path.Combine(projectFolder, "Cargo.toml")}", display: true); + RunCargo("install --locked cargo-machete@0.7.0", display: false); + RunCargo($"machete --fix {projectFolder}", display: true); + } + catch (Win32Exception) + { + Console.WriteLine("cargo tool not found; install per instructions: https://doc.rust-lang.org/cargo/getting-started/installation.html"); + } + } + } + DisplayWarnings(errorLog); } catch (Exception ex) @@ -133,6 +154,24 @@ public static int GenerateCode(OptionContainer options) return 0; } + private static void RunCargo(string args, bool display) + { + if (display) + { + Console.WriteLine($"cargo {args}"); + } + + using (Process cargo = new Process()) + { + cargo.StartInfo.FileName = "cargo"; + cargo.StartInfo.Arguments = args; + cargo.StartInfo.UseShellExecute = false; + cargo.StartInfo.RedirectStandardOutput = true; + cargo.Start(); + cargo.WaitForExit(); + } + } + private static List ParseThings(FileInfo[] thingFiles, ErrorLog errorLog) { List parsedThings = new(); @@ -229,7 +268,7 @@ private static bool TryGetThings(ErrorReporter errorReporter, byte[] thingBytes, hasError = true; } - if (item is ValueTracker dataSchema && dataSchema.Value.Ref != null) + if (item is ValueTracker dataSchema && dataSchema.Value?.Ref != null) { errorReporter.RegisterReferenceFromThing(dataSchema.Value.Ref.TokenIndex, dataSchema.Value.Ref.Value.Value); } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs index 62e233b477..9822aaca26 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs @@ -80,7 +80,7 @@ private static void ProcessAction( if (actionForm?.ErrorRespSchema != null) { responseFields[schemaNamer.GetActionRespErrorField(actionName, actionForm.ErrorRespName!)] = new FieldSpec( - tdAction.Description?.Value.Value ?? $"Read error for the '{actionName}' Action.", + $"Read error for the '{actionName}' Action.", actionForm.ErrorRespSchema, Require: false, BackupSchemaName: actionForm.ErrorRespName!, @@ -88,7 +88,7 @@ private static void ProcessAction( string respSchemaName = schemaNamer.GetActionRespSchema(actionName); ObjectSpec propReadRespObjectSpec = new( - tdAction.Description?.Value.Value ?? $"Response to a '{actionName}' Action.", + tdAction.Output?.Value.Description?.Value.Value ?? $"Response to a '{actionName}' Action.", responseFields, actionForm.Format, respSchemaName, diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs index 33b8dce5ad..290adc6183 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/JsonSchemaSupport.cs @@ -8,6 +8,8 @@ namespace Azure.Iot.Operations.SchemaGenerator internal class JsonSchemaSupport { + internal const string JsonSchemaSuffix = "schema.json"; + private const string Iso8601DurationExample = "P3Y6M4DT12H30M5S"; private const string DecimalExample = "1234567890.0987654321"; private const string AnArbitraryString = "Pretty12345Tricky67890"; @@ -43,7 +45,7 @@ internal string GetTypeAndAddenda(ValueTracker tdSchema, string ba if ((tdSchema.Value.Type?.Value.Value == TDValues.TypeObject && tdSchema.Value.AdditionalProperties?.Value == null) || (tdSchema.Value.Type?.Value.Value == TDValues.TypeString && tdSchema.Value.Enum != null)) { - return $"\"$ref\": \"{this.schemaNamer.ApplyBackupSchemaName(tdSchema.Value.Title?.Value.Value, backupSchemaName)}.json\""; + return $"\"$ref\": \"{this.schemaNamer.ApplyBackupSchemaName(tdSchema.Value.Title?.Value.Value, backupSchemaName)}.{JsonSchemaSuffix}\""; } switch (tdSchema.Value.Type?.Value.Value ?? string.Empty) diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/AliasJsonSchema.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/AliasJsonSchema.cs index 9f7e62616d..21135194e4 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/AliasJsonSchema.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/AliasJsonSchema.cs @@ -18,6 +18,6 @@ internal AliasJsonSchema(JsonSchemaSupport schemaSupport, string schemaName, Ali public SerializationFormat Format { get => SerializationFormat.Json; } - public string FileName { get => $"{this.schemaName}.json"; } + public string FileName { get => $"{this.schemaName}.{JsonSchemaSupport.JsonSchemaSuffix}"; } } } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/EnumJsonSchema.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/EnumJsonSchema.cs index 7b82fa961b..e53aa7a555 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/EnumJsonSchema.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/EnumJsonSchema.cs @@ -15,6 +15,6 @@ internal EnumJsonSchema(string schemaName, EnumSpec enumSpec) public SerializationFormat Format { get => SerializationFormat.Json; } - public string FileName { get => $"{this.schemaName}.json"; } + public string FileName { get => $"{this.schemaName}.{JsonSchemaSupport.JsonSchemaSuffix}"; } } } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/ObjectJsonSchema.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/ObjectJsonSchema.cs index e17c7b09ff..92259e861d 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/ObjectJsonSchema.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/code/ObjectJsonSchema.cs @@ -17,6 +17,6 @@ internal ObjectJsonSchema(JsonSchemaSupport schemaSupport, string schemaName, Ob public SerializationFormat Format { get => SerializationFormat.Json; } - public string FileName { get => $"{this.schemaName}.json"; } + public string FileName { get => $"{this.schemaName}.{JsonSchemaSupport.JsonSchemaSuffix}"; } } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs index 3c06c94b95..03f8a3ea9e 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs @@ -728,7 +728,7 @@ private bool TryGetStringSchemaType( orNull: false); } - schemaType = new ReferenceType(schemaName, isNullable: true, orNull: orNull); + schemaType = new ReferenceType(schemaName, isNullable: false, orNull: orNull); return true; } @@ -804,14 +804,14 @@ private bool TryGetIntegerSchemaType(JsonTracker schemaTracker, bool orNull, Err schemaType = (minimum, maximum) switch { - ( >= (long)sbyte.MinValue, <= (ulong)sbyte.MaxValue) => new ByteType(orNull), ( >= (long)byte.MinValue, <= (ulong)byte.MaxValue) => new UnsignedByteType(orNull), - ( >= (long)short.MinValue, <= (ulong)short.MaxValue) => new ShortType(orNull), ( >= (long)ushort.MinValue, <= (ulong)ushort.MaxValue) => new UnsignedShortType(orNull), - ( >= (long)int.MinValue, <= (ulong)int.MaxValue) => new IntegerType(orNull), ( >= (long)uint.MinValue, <= (ulong)uint.MaxValue) => new UnsignedIntegerType(orNull), - ( >= (long)long.MinValue, <= (ulong)long.MaxValue) => new LongType(orNull), ( >= (long)ulong.MinValue, <= (ulong)ulong.MaxValue) => new UnsignedLongType(orNull), + ( >= (long)sbyte.MinValue, <= (ulong)sbyte.MaxValue) => new ByteType(orNull), + ( >= (long)short.MinValue, <= (ulong)short.MaxValue) => new ShortType(orNull), + ( >= (long)int.MinValue, <= (ulong)int.MaxValue) => new IntegerType(orNull), + ( >= (long)long.MinValue, <= (ulong)long.MaxValue) => new LongType(orNull), _ => new UnsignedLongType(orNull), }; diff --git a/codegen2/src/Dtdl2Wot/Array/code/ArrayThingSchema.cs b/codegen2/src/Dtdl2Wot/Array/code/ArrayThingSchema.cs new file mode 100644 index 0000000000..e4eec34fcd --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Array/code/ArrayThingSchema.cs @@ -0,0 +1,22 @@ +namespace Dtdl2Wot +{ + using DTDLParser.Models; + + public partial class ArrayThingSchema : ITemplateTransform + { + private readonly DTArrayInfo dtArray; + private readonly int indent; + private readonly ThingDescriber thingDescriber; + + public ArrayThingSchema(DTArrayInfo dtArray, int indent, ThingDescriber thingDescriber) + { + this.dtArray = dtArray; + this.indent = indent; + this.thingDescriber = thingDescriber; + } + + public string FileName { get => string.Empty; } + + public string FolderPath { get => string.Empty; } + } +} diff --git a/codegen2/src/Dtdl2Wot/Array/t4/ArrayThingSchema.cs b/codegen2/src/Dtdl2Wot/Array/t4/ArrayThingSchema.cs new file mode 100644 index 0000000000..3358d99d47 --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Array/t4/ArrayThingSchema.cs @@ -0,0 +1,313 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 17.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Dtdl2Wot +{ + using System.Collections.Generic; + using System.Linq; + using DTDLParser.Models; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] + public partial class ArrayThingSchema : ArrayThingSchemaBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.PushIndent(new string(' ', this.indent)); + this.Write("\"type\": \"array\",\r\n\"items\": {\r\n"); + if (this.dtArray.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtArray.Description.First().Value)); + this.Write("\",\r\n"); + } + this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.dtArray.ElementSchema, 2))); + this.Write("\r\n}"); + this.PopIndent(); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] + public class ArrayThingSchemaBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Dtdl2Wot/Array/t4/ArrayThingSchema.tt b/codegen2/src/Dtdl2Wot/Array/t4/ArrayThingSchema.tt new file mode 100644 index 0000000000..d1f0c00671 --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Array/t4/ArrayThingSchema.tt @@ -0,0 +1,12 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="System.Collections.Generic" #> +<#@ import namespace="System.Linq" #> +<#@ import namespace="DTDLParser.Models" #> +<# this.PushIndent(new string(' ', this.indent)); #> +"type": "array", +"items": { +<# if (this.dtArray.Description.Any()) { #> + "description": "<#=this.dtArray.Description.First().Value#>", +<# } #> +<#=this.thingDescriber.GetTypeAndAddenda(this.dtArray.ElementSchema, 2)#> +}<# this.PopIndent(); #> diff --git a/codegen2/src/Dtdl2Wot/CodeName.cs b/codegen2/src/Dtdl2Wot/CodeName.cs new file mode 100644 index 0000000000..fe9b3942dd --- /dev/null +++ b/codegen2/src/Dtdl2Wot/CodeName.cs @@ -0,0 +1,223 @@ +namespace Dtdl2Wot +{ + using System; + using System.Collections.Generic; + using System.Linq; + using System.Text; + using DTDLParser; + + public class CodeName : IEquatable + { + private readonly Dtmi? givenDtmi; + private readonly string givenName; + private readonly string[] components; + private readonly string lowerName; + private readonly string pascalName; + private readonly string camelName; + private readonly string snakeName; + + public CodeName(Dtmi dtmi) + : this(NameFromDtmi(dtmi)) + { + this.givenDtmi = dtmi; + } + + public CodeName(string givenName = "") + : this(givenName, Decompose(givenName)) + { + } + + public CodeName(string baseName, string suffix1, string? suffix2 = null, string? suffix3 = null) + : this(Extend(baseName, suffix1, suffix2, suffix3), DecomposeAndExtend(baseName, suffix1, suffix2, suffix3)) + { + } + + public CodeName(CodeName baseName, string suffix1) + : this(Extend(baseName.AsGiven, suffix1, null, null), baseName.AsComponents.Append(suffix1)) + { + } + + public CodeName(CodeName baseName, string suffix1, string suffix2) + : this(Extend(baseName.AsGiven, suffix1, suffix2, null), baseName.AsComponents.Append(suffix1).Append(suffix2)) + { + } + + public CodeName(CodeName baseName, string suffix1, string suffix2, string suffix3) + : this(Extend(baseName.AsGiven, suffix1, suffix2, suffix3), baseName.AsComponents.Append(suffix1).Append(suffix2).Append(suffix3)) + { + } + + public CodeName(string givenName, IEnumerable components) + { + this.givenName = givenName; + this.components = components.ToArray(); + lowerName = string.Concat(components); + pascalName = string.Concat(components.Select(c => char.ToUpper(c[0]) + c.Substring(1))); + camelName = pascalName.Length > 0 ? char.ToLower(pascalName[0]) + pascalName.Substring(1) : string.Empty; + snakeName = string.Join('_', components); + } + + public override string ToString() + { + throw new Exception($"ToString() called on CodeName({AsGiven})"); + } + + public override bool Equals(object? obj) + { + return Equals(obj as CodeName); + } + + public bool Equals(CodeName? other) + { + return !ReferenceEquals(null, other) && AsGiven == other.AsGiven; + } + + public override int GetHashCode() + { + return AsGiven.GetHashCode(); + } + + public bool IsEmpty => string.IsNullOrEmpty(givenName); + + public Dtmi? AsDtmi => givenDtmi; + + public string AsGiven => givenName; + + private string[] AsComponents => components; + + private string AsLower(string? suffix1 = null, string? suffix2 = null, string? suffix3 = null, string? suffix4 = null, string? prefix = null) + { + return prefix ?? string.Empty + lowerName + suffix1 ?? string.Empty + suffix2 ?? string.Empty + suffix3 ?? string.Empty + suffix4 ?? string.Empty; + } + + private string AsPascal(string? suffix1 = null, string? suffix2 = null, string? suffix3 = null, string? suffix4 = null, string? prefix = null) + { + return GetCapitalized(prefix) + pascalName + GetCapitalized(suffix1) + GetCapitalized(suffix2) + GetCapitalized(suffix3) + GetCapitalized(suffix4); + } + + private string AsCamel(string? suffix1 = null, string? suffix2 = null, string? suffix3 = null, string? suffix4 = null, string? prefix = null) + { + if (!string.IsNullOrEmpty(prefix)) + { + return prefix + pascalName + GetCapitalized(suffix1) + GetCapitalized(suffix2) + GetCapitalized(suffix3) + GetCapitalized(suffix4); + } + else if (!string.IsNullOrEmpty(givenName)) + { + return camelName + GetCapitalized(suffix1) + GetCapitalized(suffix2) + GetCapitalized(suffix3) + GetCapitalized(suffix4); + } + else + { + return suffix1 + GetCapitalized(suffix2) + GetCapitalized(suffix3) + GetCapitalized(suffix4); + } + } + + private string AsSnake(string? suffix1 = null, string? suffix2 = null, string? suffix3 = null, string? suffix4 = null, string? prefix = null) + { + return GetSnakePrefix(prefix) + snakeName + GetSnakeSuffix(suffix1) + GetSnakeSuffix(suffix2) + GetSnakeSuffix(suffix3) + GetSnakeSuffix(suffix4); + } + + private string AsScreamingSnake(string? suffix1 = null, string? suffix2 = null, string? suffix3 = null, string? suffix4 = null, string? prefix = null) + { + return AsSnake(suffix1, suffix2, suffix3, suffix4, prefix: prefix).ToUpperInvariant(); + } + + private static string Extend(string baseName, string suffix1, string? suffix2, string? suffix3) + { + bool snakeWise = baseName.Contains('_'); + StringBuilder givenName = new(baseName); + givenName.Append(Extension(suffix1, snakeWise)); + + if (suffix2 != null) + { + givenName.Append(Extension(suffix2, snakeWise)); + } + + if (suffix3 != null) + { + givenName.Append(Extension(suffix3, snakeWise)); + } + + return givenName.ToString(); + } + + private static List DecomposeAndExtend(string baseName, string suffix1, string? suffix2, string? suffix3) + { + List components = Decompose(baseName); + components.Add(suffix1); + + if (suffix2 != null) + { + components.Add(suffix2); + } + + if (suffix3 != null) + { + components.Add(suffix3); + } + + return components; + } + + private static List Decompose(string givenName) + { + List components = new(); + StringBuilder stringBuilder = new(); + char p = '\0'; + + foreach (char c in givenName) + { + if (((char.IsUpper(c) && char.IsLower(p)) || c == '_') && stringBuilder.Length > 0) + { + components.Add(stringBuilder.ToString()); + stringBuilder.Clear(); + } + + if (c != '_') + { + stringBuilder.Append(char.ToLower(c)); + } + + p = c; + } + + if (stringBuilder.Length > 0) + { + components.Add(stringBuilder.ToString()); + } + + return components; + } + + private static string NameFromDtmi(Dtmi dtmi, int index = -1) + { + if (index < 0) + { + index = dtmi.Labels.Length - 1; + } + + string lastLabel = dtmi.Labels[index]; + string prefix = !lastLabel.StartsWith("_") || lastLabel.StartsWith("__") ? string.Empty : NameFromDtmi(dtmi, index - 1); + return prefix + GetCapitalized(lastLabel.TrimStart('_')); + } + + private static string Extension(string suffix, bool snakeWise) + { + return snakeWise ? GetSnakeSuffix(suffix) : GetCapitalized(suffix); + } + + private static string GetCapitalized(string? suffix) + { + return suffix == null ? string.Empty : char.ToUpperInvariant(suffix[0]) + suffix.Substring(1); + } + + private static string GetSnakeSuffix(string? suffix) + { + return suffix == null ? string.Empty : $"_{suffix}"; + } + + private static string GetSnakePrefix(string? prefix) + { + return prefix == null ? string.Empty : $"{prefix}_"; + } + } +} diff --git a/codegen2/src/Dtdl2Wot/Command/code/CommandAffordance.cs b/codegen2/src/Dtdl2Wot/Command/code/CommandAffordance.cs new file mode 100644 index 0000000000..02ef88518f --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Command/code/CommandAffordance.cs @@ -0,0 +1,63 @@ +namespace Dtdl2Wot +{ + using System.Collections.Generic; + using System.Linq; + using DTDLParser; + using DTDLParser.Models; + + public partial class CommandAffordance : ITemplateTransform + { + private readonly DTCommandInfo dtCommand; + private readonly bool usesTypes; + private readonly string contentType; + private readonly string commandTopic; + private readonly string? serviceGroupId; + private readonly bool isResponseSchemaResult; + private readonly bool isRequestTransparent; + private readonly bool isResponseTransparent; + private readonly bool isCommandIdempotent; + private readonly bool isCommandCacheable; + private readonly string? responseName; + private readonly DTSchemaInfo? responseSchema; + private readonly IReadOnlyDictionary? responseDescription; + private readonly string? errorSchemaName; + private readonly string? infoSchemaName; + private readonly Dictionary codeEnumeration; + private readonly ThingDescriber thingDescriber; + + public CommandAffordance(DTCommandInfo dtCommand, int mqttVersion, bool usesTypes, string contentType, string commandTopic, string? serviceGroupId, ThingDescriber thingDescriber) + { + this.dtCommand = dtCommand; + this.usesTypes = usesTypes; + this.contentType = contentType; + this.commandTopic = commandTopic.Replace(MqttTopicTokens.CommandName, this.dtCommand.Name); + this.serviceGroupId = serviceGroupId; + + this.isResponseSchemaResult = dtCommand.Response?.Schema != null && dtCommand.Response.Schema.SupplementalTypes.Contains(new Dtmi(string.Format(DtdlMqttExtensionValues.ResultAdjunctTypeFormat, mqttVersion))); + DTFieldInfo? normalField = (dtCommand.Response?.Schema as DTObjectInfo)?.Fields?.FirstOrDefault(f => f.SupplementalTypes.Contains(new Dtmi(string.Format(DtdlMqttExtensionValues.NormalResultAdjunctTypeFormat, mqttVersion)))); + DTFieldInfo? errorField = (dtCommand.Response?.Schema as DTObjectInfo)?.Fields?.FirstOrDefault(f => f.SupplementalTypes.Contains(new Dtmi(string.Format(DtdlMqttExtensionValues.ErrorResultAdjunctTypeFormat, mqttVersion)))); + DTFieldInfo? infoField = (dtCommand.Response?.Schema as DTObjectInfo)?.Fields?.FirstOrDefault(f => f.SupplementalTypes.Contains(new Dtmi(string.Format(DtdlMqttExtensionValues.ErrorInfoAdjunctTypeFormat, mqttVersion)))); + DTFieldInfo? codeField = (dtCommand.Response?.Schema as DTObjectInfo)?.Fields?.FirstOrDefault(f => f.SupplementalTypes.Contains(new Dtmi(string.Format(DtdlMqttExtensionValues.ErrorCodeAdjunctTypeFormat, mqttVersion)))); + + this.isRequestTransparent = dtCommand.Request != null && dtCommand.Request.SupplementalTypes.Contains(new Dtmi(string.Format(DtdlMqttExtensionValues.TransparentAdjunctTypeFormat, mqttVersion))); + this.isResponseTransparent = !isResponseSchemaResult && dtCommand.Response != null && dtCommand.Response.SupplementalTypes.Contains(new Dtmi(string.Format(DtdlMqttExtensionValues.TransparentAdjunctTypeFormat, mqttVersion))); + this.isCommandIdempotent = dtCommand.SupplementalTypes.Contains(new Dtmi(string.Format(DtdlMqttExtensionValues.IdempotentAdjunctTypeFormat, mqttVersion))); + this.isCommandCacheable = dtCommand.SupplementalTypes.Contains(new Dtmi(string.Format(DtdlMqttExtensionValues.CacheableAdjunctTypeFormat, mqttVersion))); + + this.responseName = isResponseSchemaResult ? normalField?.Name : dtCommand.Response?.Name; + this.responseSchema = isResponseSchemaResult ? normalField?.Schema : dtCommand.Response?.Schema; + this.responseDescription = isResponseSchemaResult ? normalField?.Description : dtCommand.Response?.Description; + this.errorSchemaName = errorField != null ? new CodeName(errorField.Schema.Id).AsGiven : null; + this.infoSchemaName = infoField != null ? new CodeName(infoField.Schema.Id).AsGiven : null; + this.codeEnumeration = codeField != null ? ((DTEnumInfo)codeField.Schema).EnumValues.ToDictionary(v => v.Name, v => v.EnumValue.ToString()!) : new(); + + this.thingDescriber = thingDescriber; + } + + public string FileName { get => string.Empty; } + + public string FolderPath { get => string.Empty; } + + private static string Capitalize(string input) => input.Length == 0 ? input : char.ToUpper(input[0]) + input.Substring(1); + } +} diff --git a/codegen2/src/Dtdl2Wot/Command/t4/CommandAffordance.cs b/codegen2/src/Dtdl2Wot/Command/t4/CommandAffordance.cs new file mode 100644 index 0000000000..ad886cfb6e --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Command/t4/CommandAffordance.cs @@ -0,0 +1,446 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 17.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Dtdl2Wot +{ + using System.Collections.Generic; + using System.Linq; + using DTDLParser; + using DTDLParser.Models; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] + public partial class CommandAffordance : CommandAffordanceBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write(" \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Name)); + this.Write("\": {\r\n"); + if (this.dtCommand.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Description.First().Value)); + this.Write("\",\r\n"); + } + if (this.dtCommand.Request != null) { + if (this.usesTypes) { + this.Write(" \"input\": {\r\n"); + if (this.isRequestTransparent) { + if (this.dtCommand.Request.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Request.Description.First().Value)); + this.Write("\",\r\n"); + } else if (this.dtCommand.Request.Schema.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Request.Schema.Description.First().Value)); + this.Write("\",\r\n"); + } + this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.dtCommand.Request.Schema, 8))); + this.Write("\r\n"); + } else { + if (this.dtCommand.Request.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Request.Description.First().Value)); + this.Write("\",\r\n"); + } + this.Write(" \"type\": \"object\",\r\n"); + if (!this.dtCommand.Request.Nullable) { + this.Write(" \"required\": [ \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Request.Name)); + this.Write("\" ],\r\n"); + } + this.Write(" \"properties\": {\r\n \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Request.Name)); + this.Write("\": {\r\n"); + if (!this.dtCommand.Request.Schema.Id.AbsoluteUri.StartsWith("dtmi:dtdl:instance:Schema:") && this.dtCommand.Request.Schema.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Request.Schema.Description.First().Value)); + this.Write("\",\r\n"); + } + this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.dtCommand.Request.Schema, 12))); + this.Write("\r\n }\r\n }\r\n"); + } + this.Write(" },\r\n"); + } else { + this.Write(" \"input\": {},\r\n"); + } + } + if (this.dtCommand.Response != null) { + if (this.usesTypes) { + this.Write(" \"output\": {\r\n"); + if (this.isResponseTransparent) { + if (this.dtCommand.Response.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Response.Description.First().Value)); + this.Write("\",\r\n"); + } else if (this.dtCommand.Response.Schema.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Response.Schema.Description.First().Value)); + this.Write("\",\r\n"); + } + this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.dtCommand.Response.Schema, 8))); + this.Write("\r\n"); + } else { + if (this.dtCommand.Response.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Response.Description.First().Value)); + this.Write("\",\r\n"); + } + this.Write(" \"type\": \"object\",\r\n"); + if (!this.dtCommand.Response.Nullable) { + this.Write(" \"required\": [ \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.responseName)); + this.Write("\" ],\r\n"); + } + this.Write(" \"properties\": {\r\n \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.responseName)); + this.Write("\": {\r\n"); + if (this.responseDescription?.Any() ?? false) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.responseDescription.First().Value)); + this.Write("\",\r\n"); + } else if (!this.responseSchema.Id.AbsoluteUri.StartsWith("dtmi:dtdl:instance:Schema:") && this.responseSchema.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.responseSchema.Description.First().Value)); + this.Write("\",\r\n"); + } + this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.responseSchema, 12))); + this.Write("\r\n }\r\n }\r\n"); + } + this.Write(" },\r\n"); + } else { + this.Write(" \"output\": {},\r\n"); + } + } + if (this.isCommandIdempotent) { + this.Write(" \"idempotent\": true,\r\n"); + } + if (this.isCommandCacheable) { + this.Write(" \"safe\": true,\r\n"); + } + this.Write(" \"forms\": [\r\n {\r\n \"href\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Id)); + this.Write("\",\r\n \"contentType\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.contentType)); + this.Write("\",\r\n"); + if (this.isResponseSchemaResult) { + if (this.errorSchemaName != null) { + this.Write(" \"additionalResponses\": [\r\n {\r\n \"success\": false" + + ",\r\n \"schema\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorSchemaName)); + this.Write("\"\r\n }\r\n ],\r\n"); + } + if (this.infoSchemaName != null) { + this.Write(" \"dtv:headerInfo\": [\r\n {\r\n \"contentType\": \"appli" + + "cation/json\",\r\n \"schema\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.infoSchemaName)); + this.Write("\"\r\n }\r\n ],\r\n"); + } + if (this.codeEnumeration.Count > 0) { + this.Write(" \"dtv:headerCode\": [\r\n"); + int ix = 1; foreach (KeyValuePair kvp in this.codeEnumeration) { + this.Write(" \""); + this.Write(this.ToStringHelper.ToStringWithCulture(kvp.Key)); + this.Write("\""); + this.Write(this.ToStringHelper.ToStringWithCulture(ix < this.codeEnumeration.Count ? "," : "")); + this.Write("\r\n"); + ix++; } + this.Write(" ],\r\n"); + } + } + if (this.serviceGroupId != null) { + this.Write(" \"dtv:serviceGroupId\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.serviceGroupId)); + this.Write("\",\r\n"); + } + this.Write(" \"dtv:topic\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandTopic ?? "")); + this.Write("\",\r\n \"op\": \"invokeaction\"\r\n }\r\n ]\r\n }"); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] + public class CommandAffordanceBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Dtdl2Wot/Command/t4/CommandAffordance.tt b/codegen2/src/Dtdl2Wot/Command/t4/CommandAffordance.tt new file mode 100644 index 0000000000..8d7a0809ad --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Command/t4/CommandAffordance.tt @@ -0,0 +1,118 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="System.Collections.Generic" #> +<#@ import namespace="System.Linq" #> +<#@ import namespace="DTDLParser" #> +<#@ import namespace="DTDLParser.Models" #> + "<#=this.dtCommand.Name#>": { +<# if (this.dtCommand.Description.Any()) { #> + "description": "<#=this.dtCommand.Description.First().Value#>", +<# } #> +<# if (this.dtCommand.Request != null) { #> +<# if (this.usesTypes) { #> + "input": { +<# if (this.isRequestTransparent) { #> +<# if (this.dtCommand.Request.Description.Any()) { #> + "description": "<#=this.dtCommand.Request.Description.First().Value#>", +<# } else if (this.dtCommand.Request.Schema.Description.Any()) { #> + "description": "<#=this.dtCommand.Request.Schema.Description.First().Value#>", +<# } #> +<#=this.thingDescriber.GetTypeAndAddenda(this.dtCommand.Request.Schema, 8)#> +<# } else { #> +<# if (this.dtCommand.Request.Description.Any()) { #> + "description": "<#=this.dtCommand.Request.Description.First().Value#>", +<# } #> + "type": "object", +<# if (!this.dtCommand.Request.Nullable) { #> + "required": [ "<#=this.dtCommand.Request.Name#>" ], +<# } #> + "properties": { + "<#=this.dtCommand.Request.Name#>": { +<# if (!this.dtCommand.Request.Schema.Id.AbsoluteUri.StartsWith("dtmi:dtdl:instance:Schema:") && this.dtCommand.Request.Schema.Description.Any()) { #> + "description": "<#=this.dtCommand.Request.Schema.Description.First().Value#>", +<# } #> +<#=this.thingDescriber.GetTypeAndAddenda(this.dtCommand.Request.Schema, 12)#> + } + } +<# } #> + }, +<# } else { #> + "input": {}, +<# } #> +<# } #> +<# if (this.dtCommand.Response != null) { #> +<# if (this.usesTypes) { #> + "output": { +<# if (this.isResponseTransparent) { #> +<# if (this.dtCommand.Response.Description.Any()) { #> + "description": "<#=this.dtCommand.Response.Description.First().Value#>", +<# } else if (this.dtCommand.Response.Schema.Description.Any()) { #> + "description": "<#=this.dtCommand.Response.Schema.Description.First().Value#>", +<# } #> +<#=this.thingDescriber.GetTypeAndAddenda(this.dtCommand.Response.Schema, 8)#> +<# } else { #> +<# if (this.dtCommand.Response.Description.Any()) { #> + "description": "<#=this.dtCommand.Response.Description.First().Value#>", +<# } #> + "type": "object", +<# if (!this.dtCommand.Response.Nullable) { #> + "required": [ "<#=this.responseName#>" ], +<# } #> + "properties": { + "<#=this.responseName#>": { +<# if (this.responseDescription?.Any() ?? false) { #> + "description": "<#=this.responseDescription.First().Value#>", +<# } else if (!this.responseSchema.Id.AbsoluteUri.StartsWith("dtmi:dtdl:instance:Schema:") && this.responseSchema.Description.Any()) { #> + "description": "<#=this.responseSchema.Description.First().Value#>", +<# } #> +<#=this.thingDescriber.GetTypeAndAddenda(this.responseSchema, 12)#> + } + } +<# } #> + }, +<# } else { #> + "output": {}, +<# } #> +<# } #> +<# if (this.isCommandIdempotent) { #> + "idempotent": true, +<# } #> +<# if (this.isCommandCacheable) { #> + "safe": true, +<# } #> + "forms": [ + { + "href": "<#=this.dtCommand.Id#>", + "contentType": "<#=this.contentType#>", +<# if (this.isResponseSchemaResult) { #> +<# if (this.errorSchemaName != null) { #> + "additionalResponses": [ + { + "success": false, + "schema": "<#=this.errorSchemaName#>" + } + ], +<# } #> +<# if (this.infoSchemaName != null) { #> + "dtv:headerInfo": [ + { + "contentType": "application/json", + "schema": "<#=this.infoSchemaName#>" + } + ], +<# } #> +<# if (this.codeEnumeration.Count > 0) { #> + "dtv:headerCode": [ +<# int ix = 1; foreach (KeyValuePair kvp in this.codeEnumeration) { #> + "<#=kvp.Key#>"<#=ix < this.codeEnumeration.Count ? "," : ""#> +<# ix++; } #> + ], +<# } #> +<# } #> +<# if (this.serviceGroupId != null) { #> + "dtv:serviceGroupId": "<#=this.serviceGroupId#>", +<# } #> + "dtv:topic": "<#=this.commandTopic ?? ""#>", + "op": "invokeaction" + } + ] + } \ No newline at end of file diff --git a/codegen2/src/Dtdl2Wot/Dtdl2Wot.csproj b/codegen2/src/Dtdl2Wot/Dtdl2Wot.csproj new file mode 100644 index 0000000000..6b7626ea24 --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Dtdl2Wot.csproj @@ -0,0 +1,110 @@ + + + + Exe + net9.0 + enable + + + + + + + + + + + + + + True + True + ArrayThingSchema.tt + + + True + True + CommandAffordance.tt + + + True + True + EnumThingSchema.tt + + + True + True + InterfaceThing.tt + + + True + True + MapThingSchema.tt + + + True + True + ObjectThingSchema.tt + + + True + True + PropertyAffordance.tt + + + True + True + TelemetryAffordance.tt + + + + + + TextTemplatingFilePreprocessor + ArrayThingSchema.cs + Dtdl2Wot + + + TextTemplatingFilePreprocessor + CommandAffordance.cs + Dtdl2Wot + + + TextTemplatingFilePreprocessor + EnumThingSchema.cs + Dtdl2Wot + + + TextTemplatingFilePreprocessor + InterfaceThing.cs + Dtdl2Wot + + + TextTemplatingFilePreprocessor + MapThingSchema.cs + Dtdl2Wot + + + TextTemplatingFilePreprocessor + ObjectThingSchema.cs + Dtdl2Wot + + + TextTemplatingFilePreprocessor + PropertyAffordance.cs + Dtdl2Wot + + + TextTemplatingFilePreprocessor + TelemetryAffordance.cs + Dtdl2Wot + + + + + + Resources\conversion\%(Filename)%(Extension) + + + + diff --git a/codegen2/src/Dtdl2Wot/DtdlMqttExtensionValues.cs b/codegen2/src/Dtdl2Wot/DtdlMqttExtensionValues.cs new file mode 100644 index 0000000000..9d12fb76d6 --- /dev/null +++ b/codegen2/src/Dtdl2Wot/DtdlMqttExtensionValues.cs @@ -0,0 +1,68 @@ +namespace Dtdl2Wot +{ + using System.Text.RegularExpressions; + using DTDLParser; + + public static class DtdlMqttExtensionValues + { + public static string MqttAdjunctTypePattern = @"dtmi:dtdl:extension:mqtt:v(\d+):Mqtt"; + + public static Regex MqttAdjunctTypeRegex = new Regex(MqttAdjunctTypePattern, RegexOptions.Compiled); + + public static string RequiredAdjunctTypePattern = @"dtmi:dtdl:extension:requirement:v(\d+):Required"; + + public static Regex RequiredAdjunctTypeRegex = new Regex(RequiredAdjunctTypePattern, RegexOptions.Compiled); + + public static readonly string IdempotentAdjunctTypeFormat = "dtmi:dtdl:extension:mqtt:v{0}:Idempotent"; + + public static readonly string CacheableAdjunctTypeFormat = "dtmi:dtdl:extension:mqtt:v{0}:Cacheable"; + + public static readonly string FragmentedAdjunctTypeFormat = "dtmi:dtdl:extension:mqtt:v{0}:Fragmented"; + + public static readonly string IndirectAdjunctTypeFormat = "dtmi:dtdl:extension:mqtt:v{0}:Indirect"; + + public static readonly string TransparentAdjunctTypeFormat = "dtmi:dtdl:extension:mqtt:v{0}:Transparent"; + + public static readonly string IndexedAdjunctTypeFormat = "dtmi:dtdl:extension:mqtt:v{0}:Indexed"; + + public static readonly string ErrorAdjunctTypeFormat = "dtmi:dtdl:extension:mqtt:v{0}:Error"; + + public static readonly string ErrorMessageAdjunctTypeFormat = "dtmi:dtdl:extension:mqtt:v{0}:ErrorMessage"; + + public static readonly string ResultAdjunctTypeFormat = "dtmi:dtdl:extension:mqtt:v{0}:Result"; + + public static readonly string NormalResultAdjunctTypeFormat = "dtmi:dtdl:extension:mqtt:v{0}:NormalResult"; + + public static readonly string ErrorResultAdjunctTypeFormat = "dtmi:dtdl:extension:mqtt:v{0}:ErrorResult"; + + public static readonly string PropertyResultAdjunctTypeFormat = "dtmi:dtdl:extension:mqtt:v{0}:PropertyResult"; + + public static readonly string PropertyValueAdjunctTypeFormat = "dtmi:dtdl:extension:mqtt:v{0}:PropertyValue"; + + public static readonly string ReadErrorAdjunctTypeFormat = "dtmi:dtdl:extension:mqtt:v{0}:ReadError"; + + public static readonly string WriteErrorAdjunctTypeFormat = "dtmi:dtdl:extension:mqtt:v{0}:WriteError"; + + public static readonly string ErrorCodeAdjunctTypeFormat = "dtmi:dtdl:extension:mqtt:v{0}:ErrorCode"; + + public static readonly string ErrorInfoAdjunctTypeFormat = "dtmi:dtdl:extension:mqtt:v{0}:ErrorInfo"; + + public static readonly string TelemTopicPropertyFormat = "dtmi:dtdl:extension:mqtt:v{0}:Mqtt:telemetryTopic"; + + public static readonly string PropTopicPropertyFormat = "dtmi:dtdl:extension:mqtt:v{0}:Mqtt:propertyTopic"; + + public static readonly string CmdReqTopicPropertyFormat = "dtmi:dtdl:extension:mqtt:v{0}:Mqtt:commandTopic"; + + public static readonly string TelemServiceGroupIdPropertyFormat = "dtmi:dtdl:extension:mqtt:v{0}:Mqtt:telemServiceGroupId"; + + public static readonly string CmdServiceGroupIdPropertyFormat = "dtmi:dtdl:extension:mqtt:v{0}:Mqtt:cmdServiceGroupId"; + + public static readonly string IndexPropertyFormat = "dtmi:dtdl:extension:mqtt:v{0}:Indexed:index"; + + public static readonly string PayloadFormatPropertyFormat = "dtmi:dtdl:extension:mqtt:v{0}:Mqtt:payloadFormat"; + + public static readonly string TtlPropertyFormat = "dtmi:dtdl:extension:mqtt:v{0}:Cacheable:ttl"; + + public static string GetStandardTerm(string dtmi) => dtmi.Substring(dtmi.LastIndexOf(':') + 1); + } +} diff --git a/codegen2/src/Dtdl2Wot/Enum/code/EnumThingSchema.cs b/codegen2/src/Dtdl2Wot/Enum/code/EnumThingSchema.cs new file mode 100644 index 0000000000..987b0f41cd --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Enum/code/EnumThingSchema.cs @@ -0,0 +1,43 @@ +namespace Dtdl2Wot +{ + using System; + using System.Collections.Generic; + using System.Linq; + using DTDLParser.Models; + + public partial class EnumThingSchema : ITemplateTransform + { + private readonly string enumTitle; + private readonly DTEnumInfo dtEnum; + private readonly int indent; + private readonly string valueSchema; + + public EnumThingSchema(DTEnumInfo dtEnum, int indent) + { + this.enumTitle = new CodeName(dtEnum.Id).AsGiven; + this.dtEnum = dtEnum; + this.indent = indent; + this.valueSchema = ThingDescriber.GetPrimitiveType(dtEnum.ValueSchema.Id); + } + + public string FileName { get => string.Empty; } + + public string FolderPath { get => string.Empty; } + + public static bool CanExpressAsEnum(DTEnumInfo dtEnum) + { + switch (ThingDescriber.GetPrimitiveType(dtEnum.ValueSchema.Id)) + { + case "integer": + return dtEnum.EnumValues.All(ev => (int)ev.EnumValue >= 0) // all enum values are non-negative + && dtEnum.EnumValues.Min(ev => (int)ev.EnumValue) <= 1 // minimum enum value is 0 or 1 + && dtEnum.EnumValues.Max(ev => (int)ev.EnumValue) <= dtEnum.EnumValues.Count // maximum enum value does not exceed number of enum values + && new HashSet(dtEnum.EnumValues.Select(ev => (int)ev.EnumValue)).Count == dtEnum.EnumValues.Count; // all enum values are unique + case "string": + return dtEnum.EnumValues.All(ev => ev.Name == (string)ev.EnumValue); // all enum values have matching names and values + default: + throw new InvalidOperationException($"Invalid enum value schema {dtEnum.ValueSchema.Id}"); + } + } + } +} diff --git a/codegen2/src/Dtdl2Wot/Enum/t4/EnumThingSchema.cs b/codegen2/src/Dtdl2Wot/Enum/t4/EnumThingSchema.cs new file mode 100644 index 0000000000..b3868db97f --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Enum/t4/EnumThingSchema.cs @@ -0,0 +1,321 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 17.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Dtdl2Wot +{ + using System.Collections.Generic; + using System.Linq; + using DTDLParser.Models; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] + public partial class EnumThingSchema : EnumThingSchemaBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.PushIndent(new string(' ', this.indent)); + if (CanExpressAsEnum(this.dtEnum)) { + this.Write("\"title\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.enumTitle)); + this.Write("\",\r\n\"type\": \"string\",\r\n\"enum\": [\r\n"); + int ix1 = 1; foreach (var enumValue in this.dtEnum.EnumValues.OrderBy(ev => ev.EnumValue)) { + this.Write(" \""); + this.Write(this.ToStringHelper.ToStringWithCulture(enumValue.Name)); + this.Write("\""); + this.Write(this.ToStringHelper.ToStringWithCulture(ix1 < this.dtEnum.EnumValues.Count ? "," : "")); + this.Write("\r\n"); + ix1++; } + this.Write("]"); + } else if (this.valueSchema == "integer") { + this.Write("\"type\": \"integer\",\r\n\"minimum\": -2147483648,\r\n\"maximum\": 2147483647"); + } else { + this.Write("\"type\": \"string\""); + } this.PopIndent(); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] + public class EnumThingSchemaBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Dtdl2Wot/Enum/t4/EnumThingSchema.tt b/codegen2/src/Dtdl2Wot/Enum/t4/EnumThingSchema.tt new file mode 100644 index 0000000000..6220550fee --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Enum/t4/EnumThingSchema.tt @@ -0,0 +1,17 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="System.Collections.Generic" #> +<#@ import namespace="System.Linq" #> +<#@ import namespace="DTDLParser.Models" #> +<# this.PushIndent(new string(' ', this.indent)); #> +<# if (CanExpressAsEnum(this.dtEnum)) { #> +"title": "<#=this.enumTitle#>", +"type": "string", +"enum": [ +<# int ix1 = 1; foreach (var enumValue in this.dtEnum.EnumValues.OrderBy(ev => ev.EnumValue)) { #> + "<#=enumValue.Name#>"<#=ix1 < this.dtEnum.EnumValues.Count ? "," : ""#> +<# ix1++; } #> +]<# } else if (this.valueSchema == "integer") { #> +"type": "integer", +"minimum": -2147483648, +"maximum": 2147483647<# } else { #> +"type": "string"<# } this.PopIndent(); #> \ No newline at end of file diff --git a/codegen2/src/Dtdl2Wot/ITemplateTransform.cs b/codegen2/src/Dtdl2Wot/ITemplateTransform.cs new file mode 100644 index 0000000000..38cb277624 --- /dev/null +++ b/codegen2/src/Dtdl2Wot/ITemplateTransform.cs @@ -0,0 +1,11 @@ +namespace Dtdl2Wot +{ + public interface ITemplateTransform + { + string FileName { get; } + + string FolderPath { get; } + + string TransformText(); + } +} diff --git a/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs b/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs new file mode 100644 index 0000000000..b5ce45ed29 --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs @@ -0,0 +1,80 @@ +namespace Dtdl2Wot +{ + using System; + using System.Collections.Generic; + using System.Linq; + using DTDLParser; + using DTDLParser.Models; + + public partial class InterfaceThing : ITemplateTransform + { + private readonly DTInterfaceInfo dtInterface; + private readonly CodeName serviceName; + private readonly int mqttVersion; + private readonly string? telemetryTopic; + private readonly string? commandTopic; + private readonly string? propertyTopic; + private readonly string? telemServiceGroupId; + private readonly string? cmdServiceGroupId; + private readonly bool aggregateTelemetries; + private readonly bool aggregateProperties; + private readonly bool usesTypes; + private readonly string contentType; + private readonly Dictionary errorSchemas; + private readonly List intEnumValues; + private readonly List stringEnumValues; + private readonly ThingDescriber thingDescriber; + + public InterfaceThing(IReadOnlyDictionary modelDict, Dtmi interfaceId, int mqttVersion) + { + this.dtInterface = (DTInterfaceInfo)modelDict[interfaceId]; + this.serviceName = new CodeName(dtInterface.Id); + this.mqttVersion = mqttVersion; + + this.telemetryTopic = dtInterface.SupplementalProperties.TryGetValue(string.Format(DtdlMqttExtensionValues.TelemTopicPropertyFormat, mqttVersion), out object? telemTopicObj) ? (string)telemTopicObj : null; + this.commandTopic = dtInterface.SupplementalProperties.TryGetValue(string.Format(DtdlMqttExtensionValues.CmdReqTopicPropertyFormat, mqttVersion), out object? cmdTopicObj) ? (string)cmdTopicObj : null; + this.propertyTopic = dtInterface.SupplementalProperties.TryGetValue(string.Format(DtdlMqttExtensionValues.PropTopicPropertyFormat, mqttVersion), out object? propTopicObj) ? (string)propTopicObj : null; + + this.telemServiceGroupId = dtInterface.SupplementalProperties.TryGetValue(string.Format(DtdlMqttExtensionValues.TelemServiceGroupIdPropertyFormat, mqttVersion), out object? telemServiceGroupIdObj) ? (string)telemServiceGroupIdObj : null; + this.cmdServiceGroupId = dtInterface.SupplementalProperties.TryGetValue(string.Format(DtdlMqttExtensionValues.CmdServiceGroupIdPropertyFormat, mqttVersion), out object? cmdServiceGroupIdObj) ? (string)cmdServiceGroupIdObj : null; + + this.aggregateTelemetries = this.telemetryTopic != null && !this.telemetryTopic.Contains(MqttTopicTokens.TelemetryName); + this.aggregateProperties = this.propertyTopic != null && !this.propertyTopic.Contains(MqttTopicTokens.PropertyName); + + string payloadFormat = (string)dtInterface.SupplementalProperties[string.Format(DtdlMqttExtensionValues.PayloadFormatPropertyFormat, mqttVersion)]; + this.usesTypes = payloadFormat != PayloadFormat.Raw && payloadFormat != PayloadFormat.Custom; + this.contentType = payloadFormat switch + { + PayloadFormat.Avro => "application/avro", + PayloadFormat.Cbor => "application/cbor", + PayloadFormat.Json => "application/json", + PayloadFormat.Proto2 => "application/protobuf", + PayloadFormat.Proto3 => "application/protobuf", + PayloadFormat.Raw => "application/octet-stream", + PayloadFormat.Custom => "", + _ => throw new InvalidOperationException($"InvalidOperationException \"{payloadFormat}\" not recognized"), + }; + Dtmi errorResultType = new Dtmi(string.Format(DtdlMqttExtensionValues.ErrorResultAdjunctTypeFormat, mqttVersion)); + Dtmi readErrorType = new Dtmi(string.Format(DtdlMqttExtensionValues.ReadErrorAdjunctTypeFormat, mqttVersion)); + Dtmi writeErrorType = new Dtmi(string.Format(DtdlMqttExtensionValues.WriteErrorAdjunctTypeFormat, mqttVersion)); + Dtmi errorInfoType = new Dtmi(string.Format(DtdlMqttExtensionValues.ErrorInfoAdjunctTypeFormat, mqttVersion)); + + IEnumerable errorFields = modelDict.Values.Where(e => e.EntityKind == DTEntityKind.Field).Select(e => (DTFieldInfo)e).Where(f => f.SupplementalTypes.Contains(errorResultType) || f.SupplementalTypes.Contains(readErrorType) || f.SupplementalTypes.Contains(writeErrorType) || f.SupplementalTypes.Contains(errorInfoType)); + + this.errorSchemas = new Dictionary(); + foreach (DTFieldInfo errorField in errorFields) + { + this.errorSchemas[new CodeName(errorField.Schema.Id).AsGiven] = errorField.Schema; + } + + this.intEnumValues = modelDict.Values.Where(e => e.EntityKind == DTEntityKind.Enum).Select(e => (DTEnumInfo)e).Where(e => ThingDescriber.GetPrimitiveType(e.ValueSchema.Id) == "integer" && !EnumThingSchema.CanExpressAsEnum(e)).SelectMany(e => e.EnumValues).ToList(); + this.stringEnumValues = modelDict.Values.Where(e => e.EntityKind == DTEntityKind.Enum).Select(e => (DTEnumInfo)e).Where(e => ThingDescriber.GetPrimitiveType(e.ValueSchema.Id) == "string" && !EnumThingSchema.CanExpressAsEnum(e)).SelectMany(e => e.EnumValues).ToList(); + + this.thingDescriber = new ThingDescriber(mqttVersion); + } + + public string FileName { get => $"{this.serviceName.AsGiven}.TD.json"; } + + public string FolderPath { get => string.Empty; } + } +} diff --git a/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.cs b/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.cs new file mode 100644 index 0000000000..5c69009a3c --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.cs @@ -0,0 +1,443 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 17.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Dtdl2Wot +{ + using System.Collections.Generic; + using System.Linq; + using DTDLParser; + using DTDLParser.Models; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] + public partial class InterfaceThing : InterfaceThingBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("{\r\n \"@context\": [\r\n \"https://www.w3.org/2022/wot/td/v1.1\",\r\n { \"dtv\": \"htt" + + "p://azure.com/DigitalTwins/dtmi#\" }\r\n ],\r\n \"id\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtInterface.Id.ToString())); + this.Write("\",\r\n \"title\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.serviceName.AsGiven)); + this.Write(@""", + ""securityDefinitions"": { + ""nosec_sc"": { + ""scheme"": ""nosec"" + } + }, + ""security"": [ + ""nosec_sc"" + ], + ""links"": [ + { + ""rel"": ""service-desc"", + ""href"": ""./SchemaNames.json"", + ""type"": ""application/json"" + } + ], +"); + if (this.errorSchemas.Any() || this.intEnumValues.Any() || this.stringEnumValues.Any()) { + this.Write(" \"schemaDefinitions\": {\r\n"); + int ix1 = 1; foreach (KeyValuePair errorSchema in this.errorSchemas) { + this.Write(" \""); + this.Write(this.ToStringHelper.ToStringWithCulture(errorSchema.Key)); + this.Write("\": {\r\n"); + if (errorSchema.Value.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(errorSchema.Value.Description.First().Value)); + this.Write("\",\r\n"); + } + this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(errorSchema.Value, 6))); + this.Write("\r\n }"); + this.Write(this.ToStringHelper.ToStringWithCulture(ix1 < this.errorSchemas.Count + this.intEnumValues.Count + this.stringEnumValues.Count ? "," : "")); + this.Write("\r\n"); + ix1++; } + foreach (DTEnumValueInfo intEnumValue in this.intEnumValues) { + this.Write(" \""); + this.Write(this.ToStringHelper.ToStringWithCulture(intEnumValue.Name)); + this.Write("\": {\r\n \"type\": \"integer\",\r\n"); + if (intEnumValue.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(intEnumValue.Description.First().Value)); + this.Write("\",\r\n"); + } + this.Write(" \"const\": "); + this.Write(this.ToStringHelper.ToStringWithCulture(intEnumValue.EnumValue)); + this.Write("\r\n }"); + this.Write(this.ToStringHelper.ToStringWithCulture(ix1 < this.errorSchemas.Count + this.intEnumValues.Count + this.stringEnumValues.Count ? "," : "")); + this.Write("\r\n"); + ix1++; } + foreach (DTEnumValueInfo stringEnumValue in this.stringEnumValues) { + this.Write(" \""); + this.Write(this.ToStringHelper.ToStringWithCulture(stringEnumValue.Name)); + this.Write("\": {\r\n \"type\": \"string\",\r\n"); + if (stringEnumValue.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(stringEnumValue.Description.First().Value)); + this.Write("\",\r\n"); + } + this.Write(" \"const\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(stringEnumValue.EnumValue)); + this.Write("\"\r\n }"); + this.Write(this.ToStringHelper.ToStringWithCulture(ix1 < this.errorSchemas.Count + this.intEnumValues.Count + this.stringEnumValues.Count ? "," : "")); + this.Write("\r\n"); + ix1++; } + this.Write(" },\r\n"); + } + if (this.aggregateTelemetries || this.aggregateProperties) { + this.Write(" \"forms\": [\r\n"); + if (this.aggregateTelemetries) { + this.Write(" {\r\n \"href\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtInterface.Id)); + this.Write("\",\r\n \"contentType\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.contentType)); + this.Write("\",\r\n \"dtv:topic\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.telemetryTopic)); + this.Write("\",\r\n \"op\": \"subscribeallevents\"\r\n }"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.aggregateProperties ? "," : "")); + this.Write("\r\n"); + } + if (this.aggregateProperties) { + if (this.dtInterface.Properties.Any(p => p.Value.Writable)) { + this.Write(" {\r\n \"href\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtInterface.Id)); + this.Write("\",\r\n \"contentType\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.contentType)); + this.Write("\",\r\n"); + if (this.dtInterface.Properties.Values.Any(p => p.Writable && IsSchemaPropertyResult(p.Schema) && ((DTObjectInfo)p.Schema).Fields.Any(f => IsFieldWriteError(f)))) { + this.Write(" \"additionalResponses\": [\r\n {\r\n \"success\": false\r\n }\r" + + "\n ],\r\n"); + } + this.Write(" \"dtv:topic\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyTopic.Replace(MqttTopicTokens.PropertyAction, "write"))); + this.Write("\",\r\n \"op\": \"writemultipleproperties\"\r\n },\r\n"); + } + this.Write(" {\r\n \"href\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtInterface.Id)); + this.Write("\",\r\n \"contentType\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.contentType)); + this.Write("\",\r\n"); + if (this.dtInterface.Properties.Values.Any(p => IsSchemaPropertyResult(p.Schema) && ((DTObjectInfo)p.Schema).Fields.Any(f => IsFieldReadError(f)))) { + this.Write(" \"additionalResponses\": [\r\n {\r\n \"success\": false\r\n }\r" + + "\n ],\r\n"); + } + this.Write(" \"dtv:topic\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyTopic.Replace(MqttTopicTokens.PropertyAction, "read"))); + this.Write("\",\r\n \"op\": \"readallproperties\"\r\n }\r\n"); + } + this.Write(" ],\r\n"); + } + this.Write(" \"actions\": {\r\n"); + int ix = 1; foreach (KeyValuePair dtCommand in this.dtInterface.Commands) { + this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetCommandAffordance(dtCommand.Value, this.usesTypes, this.contentType, this.commandTopic, this.cmdServiceGroupId))); + this.Write(this.ToStringHelper.ToStringWithCulture(ix < this.dtInterface.Commands.Count ? "," : "")); + this.Write("\r\n"); + ix++; } + this.Write(" },\r\n \"properties\": {\r\n"); + ix = 1; foreach (KeyValuePair dtProperty in this.dtInterface.Properties) { + this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetPropertyAffordance(dtProperty.Value, this.usesTypes, this.contentType, this.propertyTopic))); + this.Write(this.ToStringHelper.ToStringWithCulture(ix < this.dtInterface.Properties.Count ? "," : "")); + this.Write("\r\n"); + ix++; } + this.Write(" },\r\n \"events\": {\r\n"); + ix = 1; foreach (KeyValuePair dtTelemetry in this.dtInterface.Telemetries) { + this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTelemetryAffordance(dtTelemetry.Value, this.usesTypes, this.contentType, this.telemetryTopic, this.telemServiceGroupId))); + this.Write(this.ToStringHelper.ToStringWithCulture(ix < this.dtInterface.Telemetries.Count ? "," : "")); + this.Write("\r\n"); + ix++; } + this.Write(" }\r\n}\r\n"); + return this.GenerationEnvironment.ToString(); + } + +private bool IsSchemaPropertyResult(DTSchemaInfo dtSchema) => dtSchema != null && dtSchema.SupplementalTypes.Contains(new Dtmi(string.Format(DtdlMqttExtensionValues.PropertyResultAdjunctTypeFormat, this.mqttVersion))); + +private bool IsFieldReadError(DTFieldInfo dtField) => dtField.SupplementalTypes.Contains(new Dtmi(string.Format(DtdlMqttExtensionValues.ReadErrorAdjunctTypeFormat, this.mqttVersion))); + +private bool IsFieldWriteError(DTFieldInfo dtField) => dtField.SupplementalTypes.Contains(new Dtmi(string.Format(DtdlMqttExtensionValues.WriteErrorAdjunctTypeFormat, this.mqttVersion))); + + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] + public class InterfaceThingBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt b/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt new file mode 100644 index 0000000000..5acefc3304 --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt @@ -0,0 +1,122 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="System.Collections.Generic" #> +<#@ import namespace="System.Linq" #> +<#@ import namespace="DTDLParser" #> +<#@ import namespace="DTDLParser.Models" #> +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "<#=this.dtInterface.Id.ToString()#>", + "title": "<#=this.serviceName.AsGiven#>", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "links": [ + { + "rel": "service-desc", + "href": "./SchemaNames.json", + "type": "application/json" + } + ], +<# if (this.errorSchemas.Any() || this.intEnumValues.Any() || this.stringEnumValues.Any()) { #> + "schemaDefinitions": { +<# int ix1 = 1; foreach (KeyValuePair errorSchema in this.errorSchemas) { #> + "<#=errorSchema.Key#>": { +<# if (errorSchema.Value.Description.Any()) { #> + "description": "<#=errorSchema.Value.Description.First().Value#>", +<# } #> +<#=this.thingDescriber.GetTypeAndAddenda(errorSchema.Value, 6)#> + }<#=ix1 < this.errorSchemas.Count + this.intEnumValues.Count + this.stringEnumValues.Count ? "," : ""#> +<# ix1++; } #> +<# foreach (DTEnumValueInfo intEnumValue in this.intEnumValues) { #> + "<#=intEnumValue.Name#>": { + "type": "integer", +<# if (intEnumValue.Description.Any()) { #> + "description": "<#=intEnumValue.Description.First().Value#>", +<# } #> + "const": <#=intEnumValue.EnumValue#> + }<#=ix1 < this.errorSchemas.Count + this.intEnumValues.Count + this.stringEnumValues.Count ? "," : ""#> +<# ix1++; } #> +<# foreach (DTEnumValueInfo stringEnumValue in this.stringEnumValues) { #> + "<#=stringEnumValue.Name#>": { + "type": "string", +<# if (stringEnumValue.Description.Any()) { #> + "description": "<#=stringEnumValue.Description.First().Value#>", +<# } #> + "const": "<#=stringEnumValue.EnumValue#>" + }<#=ix1 < this.errorSchemas.Count + this.intEnumValues.Count + this.stringEnumValues.Count ? "," : ""#> +<# ix1++; } #> + }, +<# } #> +<# if (this.aggregateTelemetries || this.aggregateProperties) { #> + "forms": [ +<# if (this.aggregateTelemetries) { #> + { + "href": "<#=this.dtInterface.Id#>", + "contentType": "<#=this.contentType#>", + "dtv:topic": "<#=this.telemetryTopic#>", + "op": "subscribeallevents" + }<#=this.aggregateProperties ? "," : ""#> +<# } #> +<# if (this.aggregateProperties) { #> +<# if (this.dtInterface.Properties.Any(p => p.Value.Writable)) { #> + { + "href": "<#=this.dtInterface.Id#>", + "contentType": "<#=this.contentType#>", +<# if (this.dtInterface.Properties.Values.Any(p => p.Writable && IsSchemaPropertyResult(p.Schema) && ((DTObjectInfo)p.Schema).Fields.Any(f => IsFieldWriteError(f)))) { #> + "additionalResponses": [ + { + "success": false + } + ], +<# } #> + "dtv:topic": "<#=this.propertyTopic.Replace(MqttTopicTokens.PropertyAction, "write")#>", + "op": "writemultipleproperties" + }, +<# } #> + { + "href": "<#=this.dtInterface.Id#>", + "contentType": "<#=this.contentType#>", +<# if (this.dtInterface.Properties.Values.Any(p => IsSchemaPropertyResult(p.Schema) && ((DTObjectInfo)p.Schema).Fields.Any(f => IsFieldReadError(f)))) { #> + "additionalResponses": [ + { + "success": false + } + ], +<# } #> + "dtv:topic": "<#=this.propertyTopic.Replace(MqttTopicTokens.PropertyAction, "read")#>", + "op": "readallproperties" + } +<# } #> + ], +<# } #> + "actions": { +<# int ix = 1; foreach (KeyValuePair dtCommand in this.dtInterface.Commands) { #> +<#=this.thingDescriber.GetCommandAffordance(dtCommand.Value, this.usesTypes, this.contentType, this.commandTopic, this.cmdServiceGroupId)#><#=ix < this.dtInterface.Commands.Count ? "," : ""#> +<# ix++; } #> + }, + "properties": { +<# ix = 1; foreach (KeyValuePair dtProperty in this.dtInterface.Properties) { #> +<#=this.thingDescriber.GetPropertyAffordance(dtProperty.Value, this.usesTypes, this.contentType, this.propertyTopic)#><#=ix < this.dtInterface.Properties.Count ? "," : ""#> +<# ix++; } #> + }, + "events": { +<# ix = 1; foreach (KeyValuePair dtTelemetry in this.dtInterface.Telemetries) { #> +<#=this.thingDescriber.GetTelemetryAffordance(dtTelemetry.Value, this.usesTypes, this.contentType, this.telemetryTopic, this.telemServiceGroupId)#><#=ix < this.dtInterface.Telemetries.Count ? "," : ""#> +<# ix++; } #> + } +} +<#+ +private bool IsSchemaPropertyResult(DTSchemaInfo dtSchema) => dtSchema != null && dtSchema.SupplementalTypes.Contains(new Dtmi(string.Format(DtdlMqttExtensionValues.PropertyResultAdjunctTypeFormat, this.mqttVersion))); + +private bool IsFieldReadError(DTFieldInfo dtField) => dtField.SupplementalTypes.Contains(new Dtmi(string.Format(DtdlMqttExtensionValues.ReadErrorAdjunctTypeFormat, this.mqttVersion))); + +private bool IsFieldWriteError(DTFieldInfo dtField) => dtField.SupplementalTypes.Contains(new Dtmi(string.Format(DtdlMqttExtensionValues.WriteErrorAdjunctTypeFormat, this.mqttVersion))); +#> diff --git a/codegen2/src/Dtdl2Wot/Map/code/MapThingSchema.cs b/codegen2/src/Dtdl2Wot/Map/code/MapThingSchema.cs new file mode 100644 index 0000000000..be965e4c5d --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Map/code/MapThingSchema.cs @@ -0,0 +1,22 @@ +namespace Dtdl2Wot +{ + using DTDLParser.Models; + + public partial class MapThingSchema : ITemplateTransform + { + private readonly DTMapInfo dtMap; + private readonly int indent; + private readonly ThingDescriber thingDescriber; + + public MapThingSchema(DTMapInfo dtMap, int indent, ThingDescriber thingDescriber) + { + this.dtMap = dtMap; + this.indent = indent; + this.thingDescriber = thingDescriber; + } + + public string FileName { get => string.Empty; } + + public string FolderPath { get => string.Empty; } + } +} diff --git a/codegen2/src/Dtdl2Wot/Map/t4/MapThingSchema.cs b/codegen2/src/Dtdl2Wot/Map/t4/MapThingSchema.cs new file mode 100644 index 0000000000..5893a9a471 --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Map/t4/MapThingSchema.cs @@ -0,0 +1,313 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 17.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Dtdl2Wot +{ + using System.Collections.Generic; + using System.Linq; + using DTDLParser.Models; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] + public partial class MapThingSchema : MapThingSchemaBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.PushIndent(new string(' ', this.indent)); + this.Write("\"type\": \"object\",\r\n\"dtv:additionalProperties\": {\r\n"); + if (this.dtMap.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtMap.Description.First().Value)); + this.Write("\",\r\n"); + } + this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.dtMap.MapValue.Schema, 2))); + this.Write("\r\n}"); + this.PopIndent(); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] + public class MapThingSchemaBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Dtdl2Wot/Map/t4/MapThingSchema.tt b/codegen2/src/Dtdl2Wot/Map/t4/MapThingSchema.tt new file mode 100644 index 0000000000..4e9d2c4e01 --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Map/t4/MapThingSchema.tt @@ -0,0 +1,12 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="System.Collections.Generic" #> +<#@ import namespace="System.Linq" #> +<#@ import namespace="DTDLParser.Models" #> +<# this.PushIndent(new string(' ', this.indent)); #> +"type": "object", +"dtv:additionalProperties": { +<# if (this.dtMap.Description.Any()) { #> + "description": "<#=this.dtMap.Description.First().Value#>", +<# } #> +<#=this.thingDescriber.GetTypeAndAddenda(this.dtMap.MapValue.Schema, 2)#> +}<# this.PopIndent(); #> diff --git a/codegen2/src/Dtdl2Wot/MqttTopicTokens.cs b/codegen2/src/Dtdl2Wot/MqttTopicTokens.cs new file mode 100644 index 0000000000..9fe79d8dd6 --- /dev/null +++ b/codegen2/src/Dtdl2Wot/MqttTopicTokens.cs @@ -0,0 +1,58 @@ +namespace Dtdl2Wot +{ + /// + /// Static class that defines string values of the replaceable components used in topic patterns. + /// + public static class MqttTopicTokens + { + /// + /// Token representing the ID of a service; when generated from a DTDL model, this is the ID of the DTDL Interface. + /// + public const string ModelId = "{modelId}"; + + /// + /// Token representing the name of a Command. + /// + public const string CommandName = "{commandName}"; + + /// + /// Token representing the ID of a Command executor, should be used only in Command topic patterns. + /// + public const string CommandExecutorId = "{executorId}"; + + /// + /// Token representing the MQTT Client ID of a Command invoker, should be used only in Command topic patterns. + /// + public const string CommandInvokerId = "{invokerClientId}"; + + /// + /// Token representing the name of a Telemetry. + /// + public const string TelemetryName = "{telemetryName}"; + + /// + /// Token representing the ID of a Telemetry sender, should be used only in Telemetry topic patterns. + /// + public const string TelemetrySenderId = "{senderId}"; + + /// + /// Token representing the name of a Property. + /// + public const string PropertyName = "{propertyName}"; + + /// + /// Token representing the ID of a Property maintainer, should be used only in Property topic patterns. + /// + public const string PropertyMaintainerId = "{maintainerId}"; + + /// + /// Token representing the MQTT Client ID of a Property consumer, should be used only in Property topic patterns. + /// + public const string PropertyConsumerId = "{consumerClientId}"; + + /// + /// Token representing a Property action, 'read' or 'write'. + /// + public const string PropertyAction = "{action}"; + } +} diff --git a/codegen2/src/Dtdl2Wot/Object/code/ObjectThingSchema.cs b/codegen2/src/Dtdl2Wot/Object/code/ObjectThingSchema.cs new file mode 100644 index 0000000000..7a35cb565f --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Object/code/ObjectThingSchema.cs @@ -0,0 +1,36 @@ +namespace Dtdl2Wot +{ + using System.Collections.Generic; + using System.Linq; + using DTDLParser; + using DTDLParser.Models; + + public partial class ObjectThingSchema : ITemplateTransform + { + private readonly string objectTitle; + private readonly IReadOnlyDictionary objectDescription; + private readonly List objectFields; + private readonly int indent; + private readonly int mqttVersion; + private readonly ThingDescriber thingDescriber; + private readonly Dtmi errorMessageAdjunctTypeId; + + public ObjectThingSchema(DTObjectInfo dtObject, int indent, int mqttVersion, ThingDescriber thingDescriber) + { + Dtmi errorCodeAdjunctTypeId = new Dtmi(string.Format(DtdlMqttExtensionValues.ErrorCodeAdjunctTypeFormat, mqttVersion)); + Dtmi errorInfoAdjunctTypeId = new Dtmi(string.Format(DtdlMqttExtensionValues.ErrorInfoAdjunctTypeFormat, mqttVersion)); + + this.objectTitle = new CodeName(dtObject.Id).AsGiven; + this.objectDescription = dtObject.Description; + this.objectFields = dtObject.Fields.Where(f => !f.SupplementalTypes.Contains(errorCodeAdjunctTypeId) && !f.SupplementalTypes.Contains(errorInfoAdjunctTypeId)).ToList(); + this.indent = indent; + this.mqttVersion = mqttVersion; + this.thingDescriber = thingDescriber; + this.errorMessageAdjunctTypeId = new Dtmi(string.Format(DtdlMqttExtensionValues.ErrorMessageAdjunctTypeFormat, mqttVersion)); + } + + public string FileName { get => string.Empty; } + + public string FolderPath { get => string.Empty; } + } +} diff --git a/codegen2/src/Dtdl2Wot/Object/t4/ObjectThingSchema.cs b/codegen2/src/Dtdl2Wot/Object/t4/ObjectThingSchema.cs new file mode 100644 index 0000000000..741485892f --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Object/t4/ObjectThingSchema.cs @@ -0,0 +1,343 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 17.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Dtdl2Wot +{ + using System.Collections.Generic; + using System.Linq; + using DTDLParser.Models; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] + public partial class ObjectThingSchema : ObjectThingSchemaBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.PushIndent(new string(' ', this.indent)); + this.Write("\"title\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.objectTitle)); + this.Write("\",\r\n\"type\": \"object\",\r\n"); + if (this.objectFields.Any(f => IsFieldRequired(f))) { + this.Write("\"required\": [ "); + this.Write(this.ToStringHelper.ToStringWithCulture(string.Join(", ", this.objectFields.Where(f => IsFieldRequired(f)).Select(f => $"\"{f.Name}\"")))); + this.Write(" ],\r\n"); + } + if (this.objectFields.Any(f => IsFieldMessage(f))) { + this.Write("\"dtv:errorMessage\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.objectFields.First(f => IsFieldMessage(f)).Name)); + this.Write("\",\r\n"); + } + this.Write("\"properties\": {\r\n"); + int ix2 = 1; foreach (var dtField in this.objectFields) { + this.Write(" \""); + this.Write(this.ToStringHelper.ToStringWithCulture(dtField.Name)); + this.Write("\": {\r\n"); + if (dtField.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(dtField.Description.First().Value)); + this.Write("\",\r\n"); + } else if (!dtField.Schema.Id.AbsoluteUri.StartsWith("dtmi:dtdl:instance:Schema:") && dtField.Schema.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(dtField.Schema.Description.First().Value)); + this.Write("\",\r\n"); + } + this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(dtField.Schema, 4))); + this.Write("\r\n }"); + this.Write(this.ToStringHelper.ToStringWithCulture(ix2 < this.objectFields.Count ? "," : "")); + this.Write("\r\n"); + ix2++; } + this.Write("}"); + this.PopIndent(); + return this.GenerationEnvironment.ToString(); + } + + private bool IsFieldRequired(DTFieldInfo dtField) => dtField.SupplementalTypes.Any(t => DtdlMqttExtensionValues.RequiredAdjunctTypeRegex.IsMatch(t.AbsoluteUri)); + + private bool IsFieldMessage(DTFieldInfo dtField) => dtField.SupplementalTypes.Contains(this.errorMessageAdjunctTypeId); + + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] + public class ObjectThingSchemaBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Dtdl2Wot/Object/t4/ObjectThingSchema.tt b/codegen2/src/Dtdl2Wot/Object/t4/ObjectThingSchema.tt new file mode 100644 index 0000000000..42d76e1581 --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Object/t4/ObjectThingSchema.tt @@ -0,0 +1,30 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="System.Collections.Generic" #> +<#@ import namespace="System.Linq" #> +<#@ import namespace="DTDLParser.Models" #> +<# this.PushIndent(new string(' ', this.indent)); #> +"title": "<#=this.objectTitle#>", +"type": "object", +<# if (this.objectFields.Any(f => IsFieldRequired(f))) { #> +"required": [ <#=string.Join(", ", this.objectFields.Where(f => IsFieldRequired(f)).Select(f => $"\"{f.Name}\""))#> ], +<# } #> +<# if (this.objectFields.Any(f => IsFieldMessage(f))) { #> +"dtv:errorMessage": "<#=this.objectFields.First(f => IsFieldMessage(f)).Name#>", +<# } #> +"properties": { +<# int ix2 = 1; foreach (var dtField in this.objectFields) { #> + "<#=dtField.Name#>": { +<# if (dtField.Description.Any()) { #> + "description": "<#=dtField.Description.First().Value#>", +<# } else if (!dtField.Schema.Id.AbsoluteUri.StartsWith("dtmi:dtdl:instance:Schema:") && dtField.Schema.Description.Any()) { #> + "description": "<#=dtField.Schema.Description.First().Value#>", +<# } #> +<#=this.thingDescriber.GetTypeAndAddenda(dtField.Schema, 4)#> + }<#=ix2 < this.objectFields.Count ? "," : ""#> +<# ix2++; } #> +}<# this.PopIndent(); #> +<#+ + private bool IsFieldRequired(DTFieldInfo dtField) => dtField.SupplementalTypes.Any(t => DtdlMqttExtensionValues.RequiredAdjunctTypeRegex.IsMatch(t.AbsoluteUri)); + + private bool IsFieldMessage(DTFieldInfo dtField) => dtField.SupplementalTypes.Contains(this.errorMessageAdjunctTypeId); +#> diff --git a/codegen2/src/Dtdl2Wot/PayloadFormat.cs b/codegen2/src/Dtdl2Wot/PayloadFormat.cs new file mode 100644 index 0000000000..cf7f22074d --- /dev/null +++ b/codegen2/src/Dtdl2Wot/PayloadFormat.cs @@ -0,0 +1,36 @@ +namespace Dtdl2Wot +{ + using System.Linq; + + /// + /// Static class that defines designators used to identify payload formats. + /// + public static class PayloadFormat + { + public const string Avro = "Avro/1.11.0"; + + public const string Cbor = "Cbor/rfc/8949"; + + public const string Json = "Json/ecma/404"; + + public const string Proto2 = "Protobuf/2"; + + public const string Proto3 = "Protobuf/3"; + + public const string Raw = "raw/0"; + + public const string Custom = "custom/0"; + + public static string Itemize(string separator, string mark) => + string.Join(separator, new string[] + { + Avro, + Cbor, + Json, + Proto2, + Proto3, + Raw, + Custom, + }.Select(s => $"{mark}{s}{mark}")); + } +} diff --git a/codegen2/src/Dtdl2Wot/Program.cs b/codegen2/src/Dtdl2Wot/Program.cs new file mode 100644 index 0000000000..40e3d9c5ca --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Program.cs @@ -0,0 +1,55 @@ +namespace Dtdl2Wot +{ + using System; + using System.Collections.Generic; + using System.Linq; + using System.Reflection; + using System.IO; + using DTDLParser; + using DTDLParser.Models; + + internal class Program + { + static int Main(string[] args) + { + if (args.Length < 2) + { + Console.WriteLine("Usage: Dtdl2Wot "); + Console.WriteLine("Converts a DTDL model file to a WoT Thing Description."); + return 1; + } + + string inputFilePath = args[0]; + string outputFolderPath = args[1]; + + string modelText = File.ReadAllText(inputFilePath); + + DtdlParseLocator parseLocator = (int parseIndex, int parseLine, out string sourceName, out int sourceLine) => + { + sourceName = inputFilePath; + sourceLine = parseLine; + return true; + }; + + ParsingOptions parsingOptions = new(); + parsingOptions.ExtensionLimitContexts = new List { new Dtmi("dtmi:dtdl:limits:onvif"), new Dtmi("dtmi:dtdl:limits:aio") }; + + var modelParser = new ModelParser(parsingOptions); + + IReadOnlyDictionary model = modelParser.Parse(modelText, parseLocator); + + DTInterfaceInfo dtInterface = (DTInterfaceInfo)model.Values.FirstOrDefault(e => e.EntityKind == DTEntityKind.Interface && e.SupplementalTypes.Any(t => DtdlMqttExtensionValues.MqttAdjunctTypeRegex.IsMatch(t.AbsoluteUri)))!; + Dtmi mqttTypeId = dtInterface.SupplementalTypes.First(t => DtdlMqttExtensionValues.MqttAdjunctTypeRegex.IsMatch(t.AbsoluteUri)); + int mqttVersion = int.Parse(DtdlMqttExtensionValues.MqttAdjunctTypeRegex.Match(mqttTypeId.AbsoluteUri).Groups[1].Captures[0].Value); + + ThingGenerator thingGenerator = new ThingGenerator(model, dtInterface.Id, mqttVersion); + + DirectoryInfo outDir = new DirectoryInfo(outputFolderPath); + + string schemaNamesText = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("Dtdl2Wot.Resources.conversion.SchemaNames.json")!).ReadToEnd(); + File.WriteAllText(Path.Combine(outDir.FullName, "SchemaNames.json"), schemaNamesText); + + return thingGenerator.GenerateThing(outDir) ? 0 : 1; + } + } +} diff --git a/codegen2/src/Dtdl2Wot/Property/code/PropertyAffordance.cs b/codegen2/src/Dtdl2Wot/Property/code/PropertyAffordance.cs new file mode 100644 index 0000000000..753cccd1c2 --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Property/code/PropertyAffordance.cs @@ -0,0 +1,46 @@ +namespace Dtdl2Wot +{ + using System.Linq; + using DTDLParser; + using DTDLParser.Models; + + public partial class PropertyAffordance : ITemplateTransform + { + private readonly DTPropertyInfo dtProperty; + private readonly bool usesTypes; + private readonly string contentType; + private readonly bool separate; + private readonly string propertyTopic; + private readonly bool isSchemaPropertyResult; + private readonly string? valueName; + private readonly DTSchemaInfo? valueSchema; + private readonly string? readErrorSchemaName; + private readonly string? writeErrorSchemaName; + private readonly ThingDescriber thingDescriber; + + public PropertyAffordance(DTPropertyInfo dtProperty, int mqttVersion, bool usesTypes, string contentType, string propertyTopic, ThingDescriber thingDescriber) + { + this.dtProperty = dtProperty; + this.usesTypes = usesTypes; + this.contentType = contentType; + this.separate = propertyTopic.Contains(MqttTopicTokens.PropertyName); + this.propertyTopic = propertyTopic.Replace(MqttTopicTokens.PropertyName, this.dtProperty.Name); + + this.isSchemaPropertyResult = dtProperty.Schema.SupplementalTypes.Contains(new Dtmi(string.Format(DtdlMqttExtensionValues.PropertyResultAdjunctTypeFormat, mqttVersion))); + DTFieldInfo? valueField = (dtProperty.Schema as DTObjectInfo)?.Fields?.FirstOrDefault(f => f.SupplementalTypes.Contains(new Dtmi(string.Format(DtdlMqttExtensionValues.PropertyValueAdjunctTypeFormat, mqttVersion)))); + DTFieldInfo? readErrorField = (dtProperty.Schema as DTObjectInfo)?.Fields?.FirstOrDefault(f => f.SupplementalTypes.Contains(new Dtmi(string.Format(DtdlMqttExtensionValues.ReadErrorAdjunctTypeFormat, mqttVersion)))); + DTFieldInfo? writeErrorField = (dtProperty.Schema as DTObjectInfo)?.Fields?.FirstOrDefault(f => f.SupplementalTypes.Contains(new Dtmi(string.Format(DtdlMqttExtensionValues.WriteErrorAdjunctTypeFormat, mqttVersion)))); + + this.valueName = isSchemaPropertyResult ? valueField?.Name : dtProperty.Name; + this.valueSchema = isSchemaPropertyResult ? valueField?.Schema : dtProperty.Schema; + this.readErrorSchemaName = readErrorField != null ? new CodeName(readErrorField.Schema.Id).AsGiven : null; + this.writeErrorSchemaName = writeErrorField != null ? new CodeName(writeErrorField.Schema.Id).AsGiven : null; + + this.thingDescriber = thingDescriber; + } + + public string FileName { get => string.Empty; } + + public string FolderPath { get => string.Empty; } + } +} diff --git a/codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.cs b/codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.cs new file mode 100644 index 0000000000..1decb60b46 --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.cs @@ -0,0 +1,355 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 17.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Dtdl2Wot +{ + using System.Collections.Generic; + using System.Linq; + using DTDLParser; + using DTDLParser.Models; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] + public partial class PropertyAffordance : PropertyAffordanceBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write(" \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtProperty.Name)); + this.Write("\": {\r\n"); + if (this.dtProperty.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtProperty.Description.First().Value)); + this.Write("\",\r\n"); + } + if (this.usesTypes) { + this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.valueSchema, 6))); + this.Write(",\r\n \"readOnly\": "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtProperty.Writable ? "false" : "true")); + this.Write(",\r\n"); + } + this.Write(" \"forms\": [\r\n"); + if (this.dtProperty.Writable) { + this.Write(" {\r\n \"href\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtProperty.Id)); + this.Write("\",\r\n \"contentType\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.contentType)); + this.Write("\",\r\n"); + if (this.isSchemaPropertyResult && this.writeErrorSchemaName != null) { + this.Write(" \"additionalResponses\": [\r\n {\r\n \"success\": false" + + ",\r\n \"schema\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeErrorSchemaName)); + this.Write("\"\r\n }\r\n ],\r\n"); + } + if (this.separate) { + this.Write(" \"dtv:topic\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyTopic.Replace(MqttTopicTokens.PropertyAction, "write"))); + this.Write("\",\r\n"); + } + this.Write(" \"op\": \"writeproperty\"\r\n },\r\n"); + } + this.Write(" {\r\n \"href\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtProperty.Id)); + this.Write("\",\r\n \"contentType\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.contentType)); + this.Write("\",\r\n"); + if (this.isSchemaPropertyResult && this.readErrorSchemaName != null) { + this.Write(" \"additionalResponses\": [\r\n {\r\n \"success\": false" + + ",\r\n \"schema\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readErrorSchemaName)); + this.Write("\"\r\n }\r\n ],\r\n"); + } + if (this.separate) { + this.Write(" \"dtv:topic\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyTopic.Replace(MqttTopicTokens.PropertyAction, "read"))); + this.Write("\",\r\n"); + } + this.Write(" \"op\": \"readproperty\"\r\n }\r\n ]\r\n }"); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] + public class PropertyAffordanceBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.tt b/codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.tt new file mode 100644 index 0000000000..1c45c39020 --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.tt @@ -0,0 +1,50 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="System.Collections.Generic" #> +<#@ import namespace="System.Linq" #> +<#@ import namespace="DTDLParser" #> +<#@ import namespace="DTDLParser.Models" #> + "<#=this.dtProperty.Name#>": { +<# if (this.dtProperty.Description.Any()) { #> + "description": "<#=this.dtProperty.Description.First().Value#>", +<# } #> +<# if (this.usesTypes) { #> +<#=this.thingDescriber.GetTypeAndAddenda(this.valueSchema, 6)#>, + "readOnly": <#=this.dtProperty.Writable ? "false" : "true"#>, +<# } #> + "forms": [ +<# if (this.dtProperty.Writable) { #> + { + "href": "<#=this.dtProperty.Id#>", + "contentType": "<#=this.contentType#>", +<# if (this.isSchemaPropertyResult && this.writeErrorSchemaName != null) { #> + "additionalResponses": [ + { + "success": false, + "schema": "<#=this.writeErrorSchemaName#>" + } + ], +<# } #> +<# if (this.separate) { #> + "dtv:topic": "<#=this.propertyTopic.Replace(MqttTopicTokens.PropertyAction, "write")#>", +<# } #> + "op": "writeproperty" + }, +<# } #> + { + "href": "<#=this.dtProperty.Id#>", + "contentType": "<#=this.contentType#>", +<# if (this.isSchemaPropertyResult && this.readErrorSchemaName != null) { #> + "additionalResponses": [ + { + "success": false, + "schema": "<#=this.readErrorSchemaName#>" + } + ], +<# } #> +<# if (this.separate) { #> + "dtv:topic": "<#=this.propertyTopic.Replace(MqttTopicTokens.PropertyAction, "read")#>", +<# } #> + "op": "readproperty" + } + ] + } \ No newline at end of file diff --git a/codegen2/src/Dtdl2Wot/RecursionException.cs b/codegen2/src/Dtdl2Wot/RecursionException.cs new file mode 100644 index 0000000000..99699b28c1 --- /dev/null +++ b/codegen2/src/Dtdl2Wot/RecursionException.cs @@ -0,0 +1,15 @@ +namespace Dtdl2Wot +{ + using System; + + public class RecursionException : Exception + { + public CodeName SchemaName { get; } + + public RecursionException(CodeName schemaName) + : base($"Schema {schemaName.AsGiven} refers to itself") + { + SchemaName = schemaName; + } + } +} diff --git a/codegen2/src/Dtdl2Wot/Telemetry/code/TelemetryAffordance.cs b/codegen2/src/Dtdl2Wot/Telemetry/code/TelemetryAffordance.cs new file mode 100644 index 0000000000..bb5f3da174 --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Telemetry/code/TelemetryAffordance.cs @@ -0,0 +1,31 @@ +namespace Dtdl2Wot +{ + using DTDLParser.Models; + + public partial class TelemetryAffordance : ITemplateTransform + { + private readonly DTTelemetryInfo dtTelemetry; + private readonly bool usesTypes; + private readonly string contentType; + private readonly bool separate; + private readonly string telemetryTopic; + private readonly string? serviceGroupId; + private readonly ThingDescriber thingDescriber; + + public TelemetryAffordance(DTTelemetryInfo dtTelemetry, bool usesTypes, string contentType, string telemetryTopic, string? serviceGroupId, ThingDescriber thingDescriber) + { + this.dtTelemetry = dtTelemetry; + this.usesTypes = usesTypes; + this.contentType = contentType; + this.separate = telemetryTopic.Contains(MqttTopicTokens.TelemetryName); + this.telemetryTopic = telemetryTopic.Replace(MqttTopicTokens.TelemetryName, this.dtTelemetry.Name); + this.serviceGroupId = serviceGroupId; + + this.thingDescriber = thingDescriber; + } + + public string FileName { get => string.Empty; } + + public string FolderPath { get => string.Empty; } + } +} diff --git a/codegen2/src/Dtdl2Wot/Telemetry/t4/TelemetryAffordance.cs b/codegen2/src/Dtdl2Wot/Telemetry/t4/TelemetryAffordance.cs new file mode 100644 index 0000000000..b4bf711bc8 --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Telemetry/t4/TelemetryAffordance.cs @@ -0,0 +1,335 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 17.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Dtdl2Wot +{ + using System.Collections.Generic; + using System.Linq; + using DTDLParser; + using DTDLParser.Models; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] + public partial class TelemetryAffordance : TelemetryAffordanceBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write(" \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtTelemetry.Name)); + this.Write("\": {\r\n"); + if (this.dtTelemetry.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtTelemetry.Description.First().Value)); + this.Write("\",\r\n"); + } + if (this.usesTypes) { + this.Write(" \"data\": {\r\n"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.dtTelemetry.Schema, 8))); + this.Write("\r\n },\r\n"); + } else { + this.Write(" \"data\": {},\r\n"); + } + this.Write(" \"forms\": [\r\n {\r\n \"href\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtTelemetry.Id)); + this.Write("\",\r\n \"contentType\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.contentType)); + this.Write("\",\r\n"); + if (this.serviceGroupId != null) { + this.Write(" \"dtv:serviceGroupId\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.serviceGroupId)); + this.Write("\",\r\n"); + } + if (this.separate) { + this.Write(" \"dtv:topic\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.telemetryTopic)); + this.Write("\",\r\n"); + } + this.Write(" \"op\": \"subscribeevent\"\r\n }\r\n ]\r\n }"); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] + public class TelemetryAffordanceBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Dtdl2Wot/Telemetry/t4/TelemetryAffordance.tt b/codegen2/src/Dtdl2Wot/Telemetry/t4/TelemetryAffordance.tt new file mode 100644 index 0000000000..a43c36545b --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Telemetry/t4/TelemetryAffordance.tt @@ -0,0 +1,30 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="System.Collections.Generic" #> +<#@ import namespace="System.Linq" #> +<#@ import namespace="DTDLParser" #> +<#@ import namespace="DTDLParser.Models" #> + "<#=this.dtTelemetry.Name#>": { +<# if (this.dtTelemetry.Description.Any()) { #> + "description": "<#=this.dtTelemetry.Description.First().Value#>", +<# } #> +<# if (this.usesTypes) { #> + "data": { +<#=this.thingDescriber.GetTypeAndAddenda(this.dtTelemetry.Schema, 8)#> + }, +<# } else { #> + "data": {}, +<# } #> + "forms": [ + { + "href": "<#=this.dtTelemetry.Id#>", + "contentType": "<#=this.contentType#>", +<# if (this.serviceGroupId != null) { #> + "dtv:serviceGroupId": "<#=this.serviceGroupId#>", +<# } #> +<# if (this.separate) { #> + "dtv:topic": "<#=this.telemetryTopic#>", +<# } #> + "op": "subscribeevent" + } + ] + } \ No newline at end of file diff --git a/codegen2/src/Dtdl2Wot/ThingDescriber.cs b/codegen2/src/Dtdl2Wot/ThingDescriber.cs new file mode 100644 index 0000000000..d06d1f7e12 --- /dev/null +++ b/codegen2/src/Dtdl2Wot/ThingDescriber.cs @@ -0,0 +1,132 @@ +namespace Dtdl2Wot +{ + using System; + using System.Collections.Generic; + using DTDLParser; + using DTDLParser.Models; + + public class ThingDescriber + { + private readonly int mqttVersion; + private HashSet ancestralSchemaIds; + + public ThingDescriber(int mqttVersion) + { + this.mqttVersion = mqttVersion; + this.ancestralSchemaIds = new HashSet(); + } + + public string GetTypeAndAddenda(DTSchemaInfo dtSchema, int indent) + { + if (dtSchema.EntityKind == DTEntityKind.Object) + { + var templateTransform = new ObjectThingSchema((DTObjectInfo)dtSchema, indent, this.mqttVersion, this); + return this.GetTransformedText(templateTransform, dtSchema.Id); + } + + if (dtSchema.EntityKind == DTEntityKind.Enum) + { + var templateTransform = new EnumThingSchema((DTEnumInfo)dtSchema, indent); + return this.GetTransformedText(templateTransform, dtSchema.Id); + } + + if (dtSchema.EntityKind == DTEntityKind.Array) + { + var templateTransform = new ArrayThingSchema((DTArrayInfo)dtSchema, indent, this); + return this.GetTransformedText(templateTransform, dtSchema.Id); + } + + if (dtSchema.EntityKind == DTEntityKind.Map) + { + var templateTransform = new MapThingSchema((DTMapInfo)dtSchema, indent, this); + return this.GetTransformedText(templateTransform, dtSchema.Id); + } + + string it = new string(' ', indent); + string nl = $"{Environment.NewLine}{it}"; + + return dtSchema.Id.AbsoluteUri switch + { + "dtmi:dtdl:instance:Schema:boolean;2" => $"{it}\"type\": \"boolean\"", + "dtmi:dtdl:instance:Schema:double;2" => $"{it}\"type\": \"number\",{nl}\"minimum\": -1.80e+308,{nl}\"maximum\": 1.80e+308", + "dtmi:dtdl:instance:Schema:float;2" => $"{it}\"type\": \"number\",{nl}\"minimum\": -3.40e+38,{nl}\"maximum\": 3.40e+38", + "dtmi:dtdl:instance:Schema:integer;2" => $"{it}\"type\": \"integer\",{nl}\"minimum\": -2147483648,{nl}\"maximum\": 2147483647", + "dtmi:dtdl:instance:Schema:long;2" => $"{it}\"type\": \"integer\",{nl}\"minimum\": -9223372036854775808,{nl}\"maximum\": 9223372036854775807", + "dtmi:dtdl:instance:Schema:byte;4" => $"{it}\"type\": \"integer\",{nl}\"minimum\": -128,{nl}\"maximum\": 127", + "dtmi:dtdl:instance:Schema:short;4" => $"{it}\"type\": \"integer\",{nl}\"minimum\": -32768,{nl}\"maximum\": 32767", + "dtmi:dtdl:instance:Schema:unsignedInteger;4" => $"{it}\"type\": \"integer\",{nl}\"minimum\": 0,{nl}\"maximum\": 4294967295", + "dtmi:dtdl:instance:Schema:unsignedLong;4" => $"{it}\"type\": \"integer\",{nl}\"minimum\": 0,{nl}\"maximum\": 18446744073709551615", + "dtmi:dtdl:instance:Schema:unsignedByte;4" => $"{it}\"type\": \"integer\",{nl}\"minimum\": 0,{nl}\"maximum\": 255", + "dtmi:dtdl:instance:Schema:unsignedShort;4" => $"{it}\"type\": \"integer\",{nl}\"minimum\": 0,{nl}\"maximum\": 65535", + "dtmi:dtdl:instance:Schema:date;2" => $"{it}\"type\": \"string\",{nl}\"format\": \"date\"", + "dtmi:dtdl:instance:Schema:dateTime;2" => $"{it}\"type\": \"string\",{nl}\"format\": \"date-time\"", + "dtmi:dtdl:instance:Schema:time;2" => $"{it}\"type\": \"string\",{nl}\"format\": \"time\"", + "dtmi:dtdl:instance:Schema:duration;2" => $"{it}\"type\": \"string\",{nl}\"pattern\": " + @"""^P(?!$)(?:(?:(?:(?:\\d+Y)|(?:\\d+\\.\\d+Y$))?(?:(?:\\d+M)|(?:\\d+\\.\\d+M$))?)|(?:(?:(?:\\d+W)|(?:\\d+\\.\\d+W$))?))(?:(?:\\d+D)|(?:\\d+\\.\\d+D$))?(?:T(?!$)(?:(?:\\d+H)|(?:\\d+\\.\\d+H$))?(?:(?:\\d+M)|(?:\\d+\\.\\d+M$))?(?:\\d+(?:\\.\\d+)?S)?)?$""", + "dtmi:dtdl:instance:Schema:string;2" => $"{it}\"type\": \"string\"", + "dtmi:dtdl:instance:Schema:uuid;4" => $"{it}\"type\": \"string\",{nl}\"format\": \"uuid\"", + "dtmi:dtdl:instance:Schema:bytes;4" => $"{it}\"type\": \"string\",{nl}\"contentEncoding\": \"base64\"", + "dtmi:dtdl:instance:Schema:decimal;4" => $"{it}\"type\": \"string\",{nl}\"pattern\": " + @"""^(?:\\+|-)?(?:[1-9][0-9]*|0)(?:\\.[0-9]*)?$""", + _ => string.Empty, + }; + } + + public string GetCommandAffordance(DTCommandInfo dtCommand, bool usesTypes, string contentType, string commandTopic, string serviceGroupId) + { + var templateTransform = new CommandAffordance(dtCommand, this.mqttVersion, usesTypes, contentType, commandTopic, serviceGroupId, this); + return templateTransform.TransformText(); + } + + public string GetPropertyAffordance(DTPropertyInfo dtProperty, bool usesTypes, string contentType, string propertyTopic) + { + var templateTransform = new PropertyAffordance(dtProperty, this.mqttVersion, usesTypes, contentType, propertyTopic, this); + return templateTransform.TransformText(); + } + + public string GetTelemetryAffordance(DTTelemetryInfo dtTelemetry, bool usesTypes, string contentType, string telemetryTopic, string serviceGroupId) + { + var templateTransform = new TelemetryAffordance(dtTelemetry, usesTypes, contentType, telemetryTopic, serviceGroupId, this); + return templateTransform.TransformText(); + } + + public static string GetPrimitiveType(Dtmi primitiveSchemaId) + { + return primitiveSchemaId.AbsoluteUri switch + { + "dtmi:dtdl:instance:Schema:boolean;2" => "boolean", + "dtmi:dtdl:instance:Schema:double;2" => "number", + "dtmi:dtdl:instance:Schema:float;2" => "number", + "dtmi:dtdl:instance:Schema:integer;2" => "integer", + "dtmi:dtdl:instance:Schema:long;2" => "integer", + "dtmi:dtdl:instance:Schema:byte;4" => "integer", + "dtmi:dtdl:instance:Schema:short;4" => "integer", + "dtmi:dtdl:instance:Schema:unsignedInteger;4" => "integer", + "dtmi:dtdl:instance:Schema:unsignedLong;4" => "integer", + "dtmi:dtdl:instance:Schema:unsignedByte;4" => "integer", + "dtmi:dtdl:instance:Schema:unsignedShort;4" => "integer", + "dtmi:dtdl:instance:Schema:date;2" => "string", + "dtmi:dtdl:instance:Schema:dateTime;2" => "string", + "dtmi:dtdl:instance:Schema:time;2" => "string", + "dtmi:dtdl:instance:Schema:duration;2" => "string", + "dtmi:dtdl:instance:Schema:string;2" => "string", + "dtmi:dtdl:instance:Schema:uuid;4" => "string", + "dtmi:dtdl:instance:Schema:bytes;4" => "string", + "dtmi:dtdl:instance:Schema:decimal;4" => "string", + _ => "null", + }; + } + + private string GetTransformedText(ITemplateTransform templateTransform, Dtmi schemaId) + { + if (this.ancestralSchemaIds.Contains(schemaId)) + { + throw new RecursionException(new CodeName(schemaId)); + } + + this.ancestralSchemaIds.Add(schemaId); + string text = templateTransform.TransformText(); + this.ancestralSchemaIds.Remove(schemaId); + + return text; + } + } +} diff --git a/codegen2/src/Dtdl2Wot/ThingGenerator.cs b/codegen2/src/Dtdl2Wot/ThingGenerator.cs new file mode 100644 index 0000000000..90185426b8 --- /dev/null +++ b/codegen2/src/Dtdl2Wot/ThingGenerator.cs @@ -0,0 +1,52 @@ +namespace Dtdl2Wot +{ + using System; + using System.Collections.Generic; + using System.IO; + using DTDLParser; + using DTDLParser.Models; + + public class ThingGenerator + { + private readonly IReadOnlyDictionary modelDict; + private readonly Dtmi interfaceId; + private readonly int mqttVersion; + + public ThingGenerator(IReadOnlyDictionary modelDict, Dtmi interfaceId, int mqttVersion) + { + this.modelDict = modelDict; + this.interfaceId = interfaceId; + this.mqttVersion = mqttVersion; + } + + public bool GenerateThing(DirectoryInfo outDir) + { + DTInterfaceInfo dtInterface = (DTInterfaceInfo)modelDict[interfaceId]; + + ITemplateTransform interfaceThingTransform = new InterfaceThing(modelDict, interfaceId, this.mqttVersion); + + string interfaceThingText; + try + { + interfaceThingText = interfaceThingTransform.TransformText(); + } + catch (RecursionException rex) + { + Console.WriteLine($"Unable to generate Thing Description {interfaceThingTransform.FileName} because {rex.SchemaName.AsDtmi} has a self-referential definition"); + return false; + } + + if (!outDir.Exists) + { + outDir.Create(); + } + + string filePath = Path.Combine(outDir.FullName, interfaceThingTransform.FileName); + File.WriteAllText(filePath, interfaceThingText); + + Console.WriteLine($" generated {filePath}"); + + return true; + } + } +} diff --git a/dotnet/samples/Protocol/CloudEvents/ValueExtractor.cs b/dotnet/samples/Protocol/CloudEvents/ValueExtractor.cs index 33167c315c..6a615a0af9 100644 --- a/dotnet/samples/Protocol/CloudEvents/ValueExtractor.cs +++ b/dotnet/samples/Protocol/CloudEvents/ValueExtractor.cs @@ -10,8 +10,8 @@ namespace CloudEvents internal static class ValueExtractor { #pragma warning disable IDE0030 // Null check can be simplified - public static T Value(this T obj) - where T : class => obj; + public static T Value(this T? obj) + where T : class => obj!; public static T Value(this T? val) where T : struct => val.HasValue ? val.Value : default(T); diff --git a/dotnet/samples/Protocol/ReadCloudEvents/ValueExtractor.cs b/dotnet/samples/Protocol/ReadCloudEvents/ValueExtractor.cs index dde2348061..b0dbcee5b3 100644 --- a/dotnet/samples/Protocol/ReadCloudEvents/ValueExtractor.cs +++ b/dotnet/samples/Protocol/ReadCloudEvents/ValueExtractor.cs @@ -10,8 +10,8 @@ namespace ReadCloudEvents internal static class ValueExtractor { #pragma warning disable IDE0030 // Null check can be simplified - public static T Value(this T obj) - where T : class => obj; + public static T Value(this T? obj) + where T : class => obj!; public static T Value(this T? val) where T : struct => val.HasValue ? val.Value : default(T); From b658de58d3e50eac1a3759a2d56a16c39d2ee9a0 Mon Sep 17 00:00:00 2001 From: Auto Gen Date: Mon, 15 Dec 2025 12:30:49 -0800 Subject: [PATCH 20/52] support nested constant definitions --- .../ThingValidator.cs | 112 +++++++++++++----- .../ConstantsSpec.cs | 7 ++ .../EnvoyGenerator.cs | 35 ++++-- .../EnvoyTransformFactory.cs | 6 +- .../TypedConstant.cs | 2 +- .../dotnet/Constants/code/DotNetConstants.cs | 8 +- .../dotnet/Constants/t4/DotNetConstants.tt | 16 ++- .../rust/Constants/code/RustConstants.cs | 6 +- .../rust/Constants/t4/RustConstants.tt | 13 +- .../src/Dtdl2Wot/Enum/code/EnumThingSchema.cs | 3 +- .../Dtdl2Wot/Interface/code/InterfaceThing.cs | 6 +- .../Dtdl2Wot/Interface/t4/InterfaceThing.cs | 56 +++++---- .../Dtdl2Wot/Interface/t4/InterfaceThing.tt | 40 ++++--- 13 files changed, 204 insertions(+), 106 deletions(-) create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ConstantsSpec.cs diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs index 6c1a429cc5..f520cc8ae6 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs @@ -1304,54 +1304,108 @@ private bool TryValidateObjectDataSchema(ValueTracker dataSchema, DataSche bool hasError = false; if (dataSchema.Value.Properties?.Entries != null) { - foreach (KeyValuePair> property in dataSchema.Value.Properties.Entries) + if (dataSchema.Value.Const != null) { - if (!TryValidateDataSchema(property.Value, null)) + if (dataSchemaKind != DataSchemaKind.SchemaDefinition) + { + errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property is permitted only when the object definition is in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.Const.TokenIndex); + return false; + } + else if ((dataSchema.Value.Const.Value.Value as bool?) != true) { + errorReporter.ReportError($"When used within an object definition, the '{TDDataSchema.ConstName}' property must have a Boolean value of true, indicating that the '{TDDataSchema.PropertiesName}' elements are constant definitions.", dataSchema.Value.Const.TokenIndex, dataSchema.Value.Type!.TokenIndex); hasError = true; } - } - if (dataSchema.Value.Title != null && !TitleRegex.IsMatch(dataSchema.Value.Title.Value.Value)) - { - errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a 'service-desc' linked schema naming file", dataSchema.Value.Title.TokenIndex); - } + foreach (KeyValuePair> property in dataSchema.Value.Properties.Entries) + { + if (property.Value.Value.Const == null) + { + errorReporter.ReportError($"Data schema property '{property.Key}' value must have '{TDDataSchema.ConstName}' property when the parent schema defines a constant object.", property.Value.TokenIndex, dataSchema.Value.Const.TokenIndex); + hasError = true; + } + else if (property.Value.Value.Type!.Value.Value == TDValues.TypeObject) + { + errorReporter.ReportError($"Data schema property '{property.Key}' value is not permitted to define a nested constant object; value must define a constant with a primitive type ('{TDValues.TypeString}', '{TDValues.TypeNumber}', '{TDValues.TypeInteger}', or '{TDValues.TypeBoolean}').", property.Value.TokenIndex); + } + else if (!TryValidateDataSchema(property.Value, null, DataSchemaKind.SchemaDefinition)) + { + hasError = true; + } + } - if (dataSchema.Value.Required?.Elements != null) + if (dataSchema.Value.Title != null && !TitleRegex.IsMatch(dataSchema.Value.Title.Value.Value)) + { + errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a 'service-desc' linked schema naming file", dataSchema.Value.Title.TokenIndex); + } + + foreach (KeyValuePair propertyName in dataSchema.Value.PropertyNames) + { + if (propertyApprover?.Invoke(propertyName.Key) != true && propertyName.Key != TDDataSchema.TypeName && propertyName.Key != TDDataSchema.TitleName && propertyName.Key != TDDataSchema.DescriptionName && propertyName.Key != TDDataSchema.PropertiesName && propertyName.Key != TDDataSchema.ConstName) + { + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) + { + errorReporter.ReportWarning($"Data schema has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); + } + else + { + errorReporter.ReportError($"Data schema defines a constant object, which does not support '{propertyName.Key}' property.", propertyName.Value); + hasError = true; + } + } + } + } + else { - foreach (ValueTracker requiredProperty in dataSchema.Value.Required.Elements) + foreach (KeyValuePair> property in dataSchema.Value.Properties.Entries) { - if (!dataSchema.Value.Properties.Entries.ContainsKey(requiredProperty.Value.Value)) + if (!TryValidateDataSchema(property.Value, null)) { - errorReporter.ReportError($"Data schema '{TDDataSchema.RequiredName}' property names non-existent property '{requiredProperty.Value.Value}'.", requiredProperty.TokenIndex, dataSchema.Value.Properties.TokenIndex); hasError = true; } } - } - if (dataSchema.Value.ErrorMessage != null) - { - if (dataSchemaKind != DataSchemaKind.SchemaDefinition) + if (dataSchema.Value.Title != null && !TitleRegex.IsMatch(dataSchema.Value.Title.Value.Value)) { - errorReporter.ReportError($"The '{TDDataSchema.ErrorMessageName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.ErrorMessage.TokenIndex); - hasError = true; + errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a 'service-desc' linked schema naming file", dataSchema.Value.Title.TokenIndex); } - } - foreach (KeyValuePair propertyName in dataSchema.Value.PropertyNames) - { - if (propertyApprover?.Invoke(propertyName.Key) != true && propertyName.Key != TDDataSchema.TypeName && propertyName.Key != TDDataSchema.TitleName && propertyName.Key != TDDataSchema.DescriptionName && propertyName.Key != TDDataSchema.PropertiesName && propertyName.Key != TDDataSchema.RequiredName && propertyName.Key != TDDataSchema.ErrorMessageName) + if (dataSchema.Value.Required?.Elements != null) { - if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) + foreach (ValueTracker requiredProperty in dataSchema.Value.Required.Elements) { - errorReporter.ReportWarning($"Data schema has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); + if (!dataSchema.Value.Properties.Entries.ContainsKey(requiredProperty.Value.Value)) + { + errorReporter.ReportError($"Data schema '{TDDataSchema.RequiredName}' property names non-existent property '{requiredProperty.Value.Value}'.", requiredProperty.TokenIndex, dataSchema.Value.Properties.TokenIndex); + hasError = true; + } } - else + } + + if (dataSchema.Value.ErrorMessage != null) + { + if (dataSchemaKind != DataSchemaKind.SchemaDefinition) { - errorReporter.ReportError($"Data schema defines a structured object, which does not support '{propertyName.Key}' property.", propertyName.Value); + errorReporter.ReportError($"The '{TDDataSchema.ErrorMessageName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.ErrorMessage.TokenIndex); hasError = true; } } + + foreach (KeyValuePair propertyName in dataSchema.Value.PropertyNames) + { + if (propertyApprover?.Invoke(propertyName.Key) != true && propertyName.Key != TDDataSchema.TypeName && propertyName.Key != TDDataSchema.TitleName && propertyName.Key != TDDataSchema.DescriptionName && propertyName.Key != TDDataSchema.PropertiesName && propertyName.Key != TDDataSchema.RequiredName && propertyName.Key != TDDataSchema.ErrorMessageName) + { + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) + { + errorReporter.ReportWarning($"Data schema has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); + } + else + { + errorReporter.ReportError($"Data schema defines a structured object, which does not support '{propertyName.Key}' property.", propertyName.Value); + hasError = true; + } + } + } } } else @@ -1421,7 +1475,7 @@ private bool TryValidateStringDataSchema(ValueTracker dataSchema, DataSche { if (dataSchema.Value.Const != null && dataSchemaKind != DataSchemaKind.SchemaDefinition) { - errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.Const.TokenIndex); + errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element or nested within a constant object definition.", dataSchema.Value.Const.TokenIndex); return false; } @@ -1570,7 +1624,7 @@ private bool TryValidateNumberDataSchema(ValueTracker dataSchema, DataSche if (dataSchema.Value.Const?.Value.Value != null && dataSchemaKind != DataSchemaKind.SchemaDefinition) { - errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.Const.TokenIndex); + errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element or nested within a constant object definition.", dataSchema.Value.Const.TokenIndex); return false; } @@ -1633,7 +1687,7 @@ private bool TryValidateIntegerDataSchema(ValueTracker dataSchema, DataSch if (dataSchema.Value.Const?.Value.Value != null && dataSchemaKind != DataSchemaKind.SchemaDefinition) { - errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.Const.TokenIndex); + errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element or nested within a constant object definition.", dataSchema.Value.Const.TokenIndex); return false; } @@ -1710,7 +1764,7 @@ private bool TryValidateBooleanDataSchema(ValueTracker dataSchema, DataSch { if (dataSchema.Value.Const != null && dataSchemaKind != DataSchemaKind.SchemaDefinition) { - errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.Const.TokenIndex); + errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element or nested within a constant object definition.", dataSchema.Value.Const.TokenIndex); return false; } diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ConstantsSpec.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ConstantsSpec.cs new file mode 100644 index 0000000000..1f1dcf6ccf --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ConstantsSpec.cs @@ -0,0 +1,7 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Collections.Generic; + using Azure.Iot.Operations.CodeGeneration; + + public record ConstantsSpec(string? Description, Dictionary Constants); +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs index b9cd0e4317..fc865f9c81 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs @@ -28,7 +28,7 @@ public static List GenerateEnvoys( Dictionary errorSpecs = new(); Dictionary aggErrorSpecs = new(); HashSet typesToSerialize = new(); - Dictionary> schemaConstants = new(); + Dictionary schemaConstants = new(); foreach (ParsedThing parsedThing in parsedThings) { @@ -71,16 +71,29 @@ public static List GenerateEnvoys( return generatedEnvoys; } - private static void CollectNamedConstants(TDThing tdThing, SchemaNamer schemaNamer, Dictionary> schemaConstants) + private static void CollectNamedConstants(TDThing tdThing, SchemaNamer schemaNamer, Dictionary schemaConstants) { - IEnumerable>>? constDefs = tdThing.SchemaDefinitions?.Entries?.Where(d => d.Value.Value.Const?.Value != null); + IEnumerable>>? constDefs = tdThing.SchemaDefinitions?.Entries?.Where(d => d.Value.Value.Const?.Value != null && d.Value.Value.Type?.Value.Value != TDValues.TypeObject); + AddNamedConstants(schemaNamer.ConstantsSchema, "Global constants.", constDefs, schemaNamer, schemaConstants); + foreach (KeyValuePair> topLevelDef in tdThing.SchemaDefinitions?.Entries ?? new()) + { + if (topLevelDef.Value.Value.Type?.Value.Value == TDValues.TypeObject && (bool?)topLevelDef.Value.Value.Const?.Value.Value == true) + { + constDefs = topLevelDef.Value.Value.Properties?.Entries?.Where(d => d.Value.Value.Const?.Value != null); + string schemaName = schemaNamer.ApplyBackupSchemaName(topLevelDef.Value.Value.Title?.Value.Value, topLevelDef.Key); + AddNamedConstants(schemaName, topLevelDef.Value.Value.Description?.Value.Value, constDefs!, schemaNamer, schemaConstants); + } + } + } + + private static void AddNamedConstants(string schemaName, string? description, IEnumerable>>? constDefs, SchemaNamer schemaNamer, Dictionary schemaConstants) + { if (constDefs?.Any() ?? false) { - string schemaName = schemaNamer.ConstantsSchema; - if (!schemaConstants.TryGetValue(schemaName, out Dictionary? namedConstants)) + if (!schemaConstants.TryGetValue(schemaName, out ConstantsSpec? namedConstants)) { - namedConstants = new(); + namedConstants = new ConstantsSpec(description, new()); schemaConstants[schemaName] = namedConstants; } @@ -88,8 +101,8 @@ private static void CollectNamedConstants(TDThing tdThing, SchemaNamer schemaNam { if (constDef.Value.Value.Type?.Value.Value == TDValues.TypeString || constDef.Value.Value.Type?.Value.Value == TDValues.TypeNumber || constDef.Value.Value.Type?.Value.Value == TDValues.TypeInteger || constDef.Value.Value.Type?.Value.Value == TDValues.TypeBoolean) { - string constName = schemaNamer.ChooseTitleOrName(constDef.Value.Value.Title?.Value.Value, constDef.Key); - namedConstants[constName] = new TypedConstant(new CodeName(constName), constDef.Value.Value.Type.Value.Value, constDef.Value.Value.Const!.Value!.Value, constDef.Value.Value.Description?.Value.Value); + CodeName constName = new CodeName(schemaNamer.ChooseTitleOrName(constDef.Value.Value.Title?.Value.Value, constDef.Key)); + namedConstants.Constants[constName] = new TypedConstant(constDef.Value.Value.Type.Value.Value, constDef.Value.Value.Const!.Value!.Value, constDef.Value.Value.Description?.Value.Value); } } } @@ -103,11 +116,11 @@ private static void GenerateServiceEnvoys(SchemaNamer schemaNamer, CodeName serv } } - private static void GenerateConstantEnvoys(Dictionary> schemaConstants, EnvoyTransformFactory envoyFactory, Dictionary transforms) + private static void GenerateConstantEnvoys(Dictionary schemaConstants, EnvoyTransformFactory envoyFactory, Dictionary transforms) { - foreach (KeyValuePair> schemaConstant in schemaConstants) + foreach (KeyValuePair schemaConstant in schemaConstants) { - foreach (IEnvoyTemplateTransform transform in envoyFactory.GetConstantTransforms(new CodeName(schemaConstant.Key), schemaConstant.Value.Values.ToList())) + foreach (IEnvoyTemplateTransform transform in envoyFactory.GetConstantTransforms(new CodeName(schemaConstant.Key), schemaConstant.Value)) { transforms[transform.FileName] = transform; } diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyTransformFactory.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyTransformFactory.cs index 610f23ea7c..cf750763bb 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyTransformFactory.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyTransformFactory.cs @@ -37,15 +37,15 @@ internal EnvoyTransformFactory( this.defaultImpl = defaultImpl; } - internal IEnumerable GetConstantTransforms(CodeName schemaName, List constants) + internal IEnumerable GetConstantTransforms(CodeName schemaName, ConstantsSpec constantSpec) { switch (targetLanguage) { case TargetLanguage.CSharp: - yield return new DotNetConstants(projectName, schemaName, genNamespace, constants); + yield return new DotNetConstants(projectName, schemaName, genNamespace, constantSpec); break; case TargetLanguage.Rust: - yield return new RustConstants(schemaName, genNamespace, constants, srcSubdir); + yield return new RustConstants(schemaName, genNamespace, constantSpec, srcSubdir); break; default: throw new NotSupportedException($"Target language {targetLanguage} is not supported."); diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/TypedConstant.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/TypedConstant.cs index a255a6e981..8005ffece2 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/TypedConstant.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/TypedConstant.cs @@ -2,5 +2,5 @@ { using Azure.Iot.Operations.CodeGeneration; - public record TypedConstant(CodeName Name, string Type, object Value, string? Description); + public record TypedConstant(string Type, object Value, string? Description); } diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Constants/code/DotNetConstants.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Constants/code/DotNetConstants.cs index 71cd7b9c64..0ae4aa47d1 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Constants/code/DotNetConstants.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Constants/code/DotNetConstants.cs @@ -10,16 +10,16 @@ public partial class DotNetConstants : IEnvoyTemplateTransform private readonly string projectName; private readonly CodeName schemaName; private readonly CodeName genNamespace; - private readonly List constants; + private readonly ConstantsSpec constantSpec; private readonly bool anyDescriptions; - public DotNetConstants(string projectName, CodeName schemaName, CodeName genNamespace, List constants) + public DotNetConstants(string projectName, CodeName schemaName, CodeName genNamespace, ConstantsSpec constantSpec) { this.projectName = projectName; this.schemaName = schemaName; this.genNamespace = genNamespace; - this.constants = constants; - this.anyDescriptions = constants.Any(c => c.Description != null); + this.constantSpec = constantSpec; + this.anyDescriptions = constantSpec.Constants.Any(c => c.Value.Description != null); } public string FileName { get => $"{this.schemaName.GetFileName(TargetLanguage.CSharp)}.g.cs"; } diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Constants/t4/DotNetConstants.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Constants/t4/DotNetConstants.tt index 8ca501fa18..c947642fce 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Constants/t4/DotNetConstants.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Constants/t4/DotNetConstants.tt @@ -1,4 +1,5 @@ <#@ template language="C#" linePragmas="false" #> +<#@ import namespace="System.Collections.Generic" #> <#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> /* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ @@ -6,15 +7,20 @@ namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage.CSharp)#> { +<# if (this.constantSpec.Description != null) { #> + /// + /// <#=this.constantSpec.Description#> + /// +<# } #> [System.CodeDom.Compiler.GeneratedCode("Azure.Iot.Operations.ProtocolCompilerLib", "<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>")] public static class <#=this.schemaName.GetTypeName(TargetLanguage.CSharp)#> { -<# int ix = 1; foreach (TypedConstant constant in this.constants) { #> -<# if (constant.Description != null) { #> - /// <#=constant.Description#> +<# int ix = 1; foreach (KeyValuePair constant in this.constantSpec.Constants) { #> +<# if (constant.Value.Description != null) { #> + /// <#=constant.Value.Description#> <# } #> - public const <#=GetDotNetType(constant.Type)#> <#=constant.Name.GetConstantName(TargetLanguage.CSharp)#> = <#=GetDotNetValue(constant.Value)#>; -<# if (this.anyDescriptions && ix < this.constants.Count) { #> + public const <#=GetDotNetType(constant.Value.Type)#> <#=constant.Key.GetConstantName(TargetLanguage.CSharp)#> = <#=GetDotNetValue(constant.Value.Value)#>; +<# if (this.anyDescriptions && ix < this.constantSpec.Constants.Count) { #> <# } #> <# ix++; } #> diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Constants/code/RustConstants.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Constants/code/RustConstants.cs index 63be283afc..69c9f5d1e8 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Constants/code/RustConstants.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Constants/code/RustConstants.cs @@ -9,14 +9,14 @@ public partial class RustConstants : IEnvoyTemplateTransform { private readonly CodeName schemaName; private readonly CodeName genNamespace; - private readonly List constants; + private readonly ConstantsSpec constantSpec; private readonly string srcSubdir; - public RustConstants(CodeName schemaName, CodeName genNamespace, List constants, string srcSubdir) + public RustConstants(CodeName schemaName, CodeName genNamespace, ConstantsSpec constantSpec, string srcSubdir) { this.schemaName = schemaName; this.genNamespace = genNamespace; - this.constants = constants; + this.constantSpec = constantSpec; this.srcSubdir = srcSubdir; } diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Constants/t4/RustConstants.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Constants/t4/RustConstants.tt index 9b5890661d..2d7cc32b66 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Constants/t4/RustConstants.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Constants/t4/RustConstants.tt @@ -1,10 +1,15 @@ <#@ template language="C#" linePragmas="false" #> +<#@ import namespace="System.Collections.Generic" #> <#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> /* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ -<# foreach (TypedConstant constant in this.constants) { #> +<# if (this.constantSpec.Description != null) { #> -<# if (constant.Description != null) { #> -/// <#=constant.Description#> +// <#=this.constantSpec.Description#> <# } #> -pub const <#=constant.Name.GetConstantName(TargetLanguage.Rust)#>: <#=GetRustType(constant.Type)#> = <#=GetRustValue(constant.Value)#>; +<# foreach (KeyValuePair constant in this.constantSpec.Constants) { #> + +<# if (constant.Value.Description != null) { #> +/// <#=constant.Value.Description#> +<# } #> +pub const <#=constant.Key.GetConstantName(TargetLanguage.Rust)#>: <#=GetRustType(constant.Value.Type)#> = <#=GetRustValue(constant.Value.Value)#>; <# } #> diff --git a/codegen2/src/Dtdl2Wot/Enum/code/EnumThingSchema.cs b/codegen2/src/Dtdl2Wot/Enum/code/EnumThingSchema.cs index 987b0f41cd..83754d0d38 100644 --- a/codegen2/src/Dtdl2Wot/Enum/code/EnumThingSchema.cs +++ b/codegen2/src/Dtdl2Wot/Enum/code/EnumThingSchema.cs @@ -32,7 +32,8 @@ public static bool CanExpressAsEnum(DTEnumInfo dtEnum) return dtEnum.EnumValues.All(ev => (int)ev.EnumValue >= 0) // all enum values are non-negative && dtEnum.EnumValues.Min(ev => (int)ev.EnumValue) <= 1 // minimum enum value is 0 or 1 && dtEnum.EnumValues.Max(ev => (int)ev.EnumValue) <= dtEnum.EnumValues.Count // maximum enum value does not exceed number of enum values - && new HashSet(dtEnum.EnumValues.Select(ev => (int)ev.EnumValue)).Count == dtEnum.EnumValues.Count; // all enum values are unique + && new HashSet(dtEnum.EnumValues.Select(ev => (int)ev.EnumValue)).Count == dtEnum.EnumValues.Count // all enum values are unique + && !dtEnum.EnumValues.Any(ev => ev.Name.Contains(ev.EnumValue.ToString()!)); // no enum value name contains its value case "string": return dtEnum.EnumValues.All(ev => ev.Name == (string)ev.EnumValue); // all enum values have matching names and values default: diff --git a/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs b/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs index b5ce45ed29..16e3084aba 100644 --- a/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs +++ b/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs @@ -21,8 +21,7 @@ public partial class InterfaceThing : ITemplateTransform private readonly bool usesTypes; private readonly string contentType; private readonly Dictionary errorSchemas; - private readonly List intEnumValues; - private readonly List stringEnumValues; + private readonly Dictionary namespacedEnums; private readonly ThingDescriber thingDescriber; public InterfaceThing(IReadOnlyDictionary modelDict, Dtmi interfaceId, int mqttVersion) @@ -67,8 +66,7 @@ public InterfaceThing(IReadOnlyDictionary modelDict, Dtmi in this.errorSchemas[new CodeName(errorField.Schema.Id).AsGiven] = errorField.Schema; } - this.intEnumValues = modelDict.Values.Where(e => e.EntityKind == DTEntityKind.Enum).Select(e => (DTEnumInfo)e).Where(e => ThingDescriber.GetPrimitiveType(e.ValueSchema.Id) == "integer" && !EnumThingSchema.CanExpressAsEnum(e)).SelectMany(e => e.EnumValues).ToList(); - this.stringEnumValues = modelDict.Values.Where(e => e.EntityKind == DTEntityKind.Enum).Select(e => (DTEnumInfo)e).Where(e => ThingDescriber.GetPrimitiveType(e.ValueSchema.Id) == "string" && !EnumThingSchema.CanExpressAsEnum(e)).SelectMany(e => e.EnumValues).ToList(); + this.namespacedEnums = modelDict.Values.Where(e => e.EntityKind == DTEntityKind.Enum).Select(e => (DTEnumInfo)e).Where(e => !EnumThingSchema.CanExpressAsEnum(e)).ToDictionary(e => new CodeName(e.Id).AsGiven, e => e); this.thingDescriber = new ThingDescriber(mqttVersion); } diff --git a/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.cs b/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.cs index 5c69009a3c..61c8880831 100644 --- a/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.cs +++ b/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.cs @@ -48,7 +48,7 @@ public virtual string TransformText() } ], "); - if (this.errorSchemas.Any() || this.intEnumValues.Any() || this.stringEnumValues.Any()) { + if (this.errorSchemas.Any() || this.namespacedEnums.Any()) { this.Write(" \"schemaDefinitions\": {\r\n"); int ix1 = 1; foreach (KeyValuePair errorSchema in this.errorSchemas) { this.Write(" \""); @@ -61,37 +61,45 @@ public virtual string TransformText() } this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(errorSchema.Value, 6))); this.Write("\r\n }"); - this.Write(this.ToStringHelper.ToStringWithCulture(ix1 < this.errorSchemas.Count + this.intEnumValues.Count + this.stringEnumValues.Count ? "," : "")); + this.Write(this.ToStringHelper.ToStringWithCulture(ix1 < this.errorSchemas.Count + this.namespacedEnums.Count ? "," : "")); this.Write("\r\n"); ix1++; } - foreach (DTEnumValueInfo intEnumValue in this.intEnumValues) { + foreach (KeyValuePair namespacedEnum in this.namespacedEnums) { this.Write(" \""); - this.Write(this.ToStringHelper.ToStringWithCulture(intEnumValue.Name)); - this.Write("\": {\r\n \"type\": \"integer\",\r\n"); - if (intEnumValue.Description.Any()) { + this.Write(this.ToStringHelper.ToStringWithCulture(namespacedEnum.Key)); + this.Write("\": {\r\n \"type\": \"object\",\r\n \"const\": true,\r\n"); + if (namespacedEnum.Value.Description.Any()) { this.Write(" \"description\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(intEnumValue.Description.First().Value)); + this.Write(this.ToStringHelper.ToStringWithCulture(namespacedEnum.Value.Description.First().Value)); this.Write("\",\r\n"); } - this.Write(" \"const\": "); - this.Write(this.ToStringHelper.ToStringWithCulture(intEnumValue.EnumValue)); - this.Write("\r\n }"); - this.Write(this.ToStringHelper.ToStringWithCulture(ix1 < this.errorSchemas.Count + this.intEnumValues.Count + this.stringEnumValues.Count ? "," : "")); - this.Write("\r\n"); - ix1++; } - foreach (DTEnumValueInfo stringEnumValue in this.stringEnumValues) { - this.Write(" \""); - this.Write(this.ToStringHelper.ToStringWithCulture(stringEnumValue.Name)); - this.Write("\": {\r\n \"type\": \"string\",\r\n"); - if (stringEnumValue.Description.Any()) { - this.Write(" \"description\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(stringEnumValue.Description.First().Value)); + this.Write(" \"properties\": {\r\n"); + int ix2 = 1; foreach (DTEnumValueInfo enumValue in namespacedEnum.Value.EnumValues) { + this.Write(" \""); + this.Write(this.ToStringHelper.ToStringWithCulture(enumValue.Name)); + this.Write("\": {\r\n \"type\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(ThingDescriber.GetPrimitiveType(namespacedEnum.Value.ValueSchema.Id))); this.Write("\",\r\n"); + if (enumValue.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(enumValue.Description.First().Value)); + this.Write("\",\r\n"); + } + if (ThingDescriber.GetPrimitiveType(namespacedEnum.Value.ValueSchema.Id) == "integer") { + this.Write(" \"const\": "); + this.Write(this.ToStringHelper.ToStringWithCulture(enumValue.EnumValue)); + this.Write("\r\n"); + } else { + this.Write(" \"const\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(enumValue.EnumValue)); + this.Write("\"\r\n"); } - this.Write(" \"const\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(stringEnumValue.EnumValue)); - this.Write("\"\r\n }"); - this.Write(this.ToStringHelper.ToStringWithCulture(ix1 < this.errorSchemas.Count + this.intEnumValues.Count + this.stringEnumValues.Count ? "," : "")); + this.Write(" }"); + this.Write(this.ToStringHelper.ToStringWithCulture(ix2 < namespacedEnum.Value.EnumValues.Count ? "," : "")); + this.Write("\r\n"); + ix2++; } + this.Write(" }\r\n }"); + this.Write(this.ToStringHelper.ToStringWithCulture(ix1 < this.errorSchemas.Count + this.namespacedEnums.Count ? "," : "")); this.Write("\r\n"); ix1++; } this.Write(" },\r\n"); diff --git a/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt b/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt index 5acefc3304..7d08862b85 100644 --- a/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt +++ b/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt @@ -25,7 +25,7 @@ "type": "application/json" } ], -<# if (this.errorSchemas.Any() || this.intEnumValues.Any() || this.stringEnumValues.Any()) { #> +<# if (this.errorSchemas.Any() || this.namespacedEnums.Any()) { #> "schemaDefinitions": { <# int ix1 = 1; foreach (KeyValuePair errorSchema in this.errorSchemas) { #> "<#=errorSchema.Key#>": { @@ -33,25 +33,31 @@ "description": "<#=errorSchema.Value.Description.First().Value#>", <# } #> <#=this.thingDescriber.GetTypeAndAddenda(errorSchema.Value, 6)#> - }<#=ix1 < this.errorSchemas.Count + this.intEnumValues.Count + this.stringEnumValues.Count ? "," : ""#> + }<#=ix1 < this.errorSchemas.Count + this.namespacedEnums.Count ? "," : ""#> <# ix1++; } #> -<# foreach (DTEnumValueInfo intEnumValue in this.intEnumValues) { #> - "<#=intEnumValue.Name#>": { - "type": "integer", -<# if (intEnumValue.Description.Any()) { #> - "description": "<#=intEnumValue.Description.First().Value#>", +<# foreach (KeyValuePair namespacedEnum in this.namespacedEnums) { #> + "<#=namespacedEnum.Key#>": { + "type": "object", + "const": true, +<# if (namespacedEnum.Value.Description.Any()) { #> + "description": "<#=namespacedEnum.Value.Description.First().Value#>", <# } #> - "const": <#=intEnumValue.EnumValue#> - }<#=ix1 < this.errorSchemas.Count + this.intEnumValues.Count + this.stringEnumValues.Count ? "," : ""#> -<# ix1++; } #> -<# foreach (DTEnumValueInfo stringEnumValue in this.stringEnumValues) { #> - "<#=stringEnumValue.Name#>": { - "type": "string", -<# if (stringEnumValue.Description.Any()) { #> - "description": "<#=stringEnumValue.Description.First().Value#>", + "properties": { +<# int ix2 = 1; foreach (DTEnumValueInfo enumValue in namespacedEnum.Value.EnumValues) { #> + "<#=enumValue.Name#>": { + "type": "<#=ThingDescriber.GetPrimitiveType(namespacedEnum.Value.ValueSchema.Id)#>", +<# if (enumValue.Description.Any()) { #> + "description": "<#=enumValue.Description.First().Value#>", +<# } #> +<# if (ThingDescriber.GetPrimitiveType(namespacedEnum.Value.ValueSchema.Id) == "integer") { #> + "const": <#=enumValue.EnumValue#> +<# } else { #> + "const": "<#=enumValue.EnumValue#>" <# } #> - "const": "<#=stringEnumValue.EnumValue#>" - }<#=ix1 < this.errorSchemas.Count + this.intEnumValues.Count + this.stringEnumValues.Count ? "," : ""#> + }<#=ix2 < namespacedEnum.Value.EnumValues.Count ? "," : ""#> +<# ix2++; } #> + } + }<#=ix1 < this.errorSchemas.Count + this.namespacedEnums.Count ? "," : ""#> <# ix1++; } #> }, <# } #> From e9a093c32f9ea71f3d1cb7c85243b8bc1f995d3b Mon Sep 17 00:00:00 2001 From: Auto Gen Date: Wed, 17 Dec 2025 08:55:37 -0800 Subject: [PATCH 21/52] add support for raw/custom serialization --- codegen2/.gitignore | 1 + codegen2/eval/SchemaNames.json | 4 +- codegen2/eval/aio/conv.sh | 8 + codegen2/eval/aio/gen.sh | 32 ++ codegen2/eval/conv.sh | 21 ++ codegen2/eval/dg0.sh | 37 +++ codegen2/eval/g2.sh | 9 + codegen2/eval/gen0.sh | 57 ++++ codegen2/eval/wot/ExternalSchemas.TD.json | 72 +++- codegen2/eval/wot/TelemetryAndCommand.TD.json | 104 ++++++ .../TelemetryComplexSchemas.SchemaNames.json | 4 +- ...TelemetryPrimitiveSchemas.SchemaNames.json | 4 +- codegen2/eval/wot/ThingOne.SchemaNames.json | 4 +- codegen2/eval/wot/ThingTwo.SchemaNames.json | 4 +- codegen2/res/conversion/SchemaNames.json | 11 +- .../CustomTypeName.cs | 2 - .../FormatSupport.cs | 6 + .../RawTypeName.cs | 53 +++ .../SchemaNamer.cs | 2 +- .../SerializationFormat.cs | 2 + .../TDValues.cs | 2 + .../ThingSupport.cs | 20 +- .../ThingValidator.cs | 230 +++++++++---- .../ActionEnvoyGenerator.cs | 4 +- .../ActionSpec.cs | 8 +- .../EnvoyGenerator.cs | 21 +- .../EnvoyGeneratorSupport.cs | 24 ++ .../EnvoyTransformFactory.cs | 37 ++- .../EventEnvoyGenerator.cs | 10 +- .../EventSpec.cs | 8 +- .../PropertyEnvoyGenerator.cs | 34 +- .../PropertySpec.cs | 4 +- .../dotnet/Service/t4/DotNetService.tt | 2 +- .../rust/Actions/code/RustCommandExecutor.cs | 4 +- .../rust/Actions/code/RustCommandInvoker.cs | 4 +- .../rust/Events/code/RustTelemetryReceiver.cs | 4 +- .../rust/Events/code/RustTelemetrySender.cs | 4 +- .../rust/Project/code/RustCargoToml.cs | 2 + .../CommandHandler.cs | 11 +- .../ActionSchemaGenerator.cs | 4 +- .../Dtdl2Wot/Command/t4/CommandAffordance.cs | 4 +- .../Dtdl2Wot/Command/t4/CommandAffordance.tt | 8 +- codegen2/src/Dtdl2Wot/Dtdl2Wot.csproj | 10 + .../Dtdl2Wot/Interface/code/InterfaceThing.cs | 3 - .../Map/code/PlaceholderThingSchema.cs | 22 ++ .../Dtdl2Wot/Map/t4/PlaceholderThingSchema.cs | 307 ++++++++++++++++++ .../Dtdl2Wot/Map/t4/PlaceholderThingSchema.tt | 7 + codegen2/src/Dtdl2Wot/PayloadFormat.cs | 9 - .../Property/code/PropertyAffordance.cs | 4 + .../Property/t4/PropertyAffordance.cs | 2 +- .../Property/t4/PropertyAffordance.tt | 2 +- .../Telemetry/t4/TelemetryAffordance.cs | 2 +- .../Telemetry/t4/TelemetryAffordance.tt | 4 +- codegen2/src/Dtdl2Wot/ThingDescriber.cs | 16 +- 54 files changed, 1083 insertions(+), 191 deletions(-) create mode 100644 codegen2/.gitignore create mode 100644 codegen2/eval/aio/conv.sh create mode 100644 codegen2/eval/aio/gen.sh create mode 100644 codegen2/eval/conv.sh create mode 100644 codegen2/eval/dg0.sh create mode 100644 codegen2/eval/g2.sh create mode 100644 codegen2/eval/gen0.sh create mode 100644 codegen2/eval/wot/TelemetryAndCommand.TD.json create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/RawTypeName.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGeneratorSupport.cs create mode 100644 codegen2/src/Dtdl2Wot/Map/code/PlaceholderThingSchema.cs create mode 100644 codegen2/src/Dtdl2Wot/Map/t4/PlaceholderThingSchema.cs create mode 100644 codegen2/src/Dtdl2Wot/Map/t4/PlaceholderThingSchema.tt diff --git a/codegen2/.gitignore b/codegen2/.gitignore new file mode 100644 index 0000000000..fb2906ce76 --- /dev/null +++ b/codegen2/.gitignore @@ -0,0 +1 @@ +!res diff --git a/codegen2/eval/SchemaNames.json b/codegen2/eval/SchemaNames.json index fcdd6ba74d..0157789b7a 100644 --- a/codegen2/eval/SchemaNames.json +++ b/codegen2/eval/SchemaNames.json @@ -22,8 +22,8 @@ "capitalize": true }, "eventValueSchema": { - "in": [ "eventSchema" ], - "out": "Event{eventSchema}Value", + "in": [ "eventName" ], + "out": "Event{eventName}Value", "capitalize": true }, "eventSenderBinder": { diff --git a/codegen2/eval/aio/conv.sh b/codegen2/eval/aio/conv.sh new file mode 100644 index 0000000000..eaec63684b --- /dev/null +++ b/codegen2/eval/aio/conv.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +conv=../../src/Dtdl2Wot/bin/Debug/net9.0/Dtdl2Wot.exe + +$conv ./eng/dtdl/adr-base-service.json ./eng/dtdl +$conv ./eng/dtdl/device-discovery-service.json ./eng/dtdl +$conv ./eng/dtdl/SchemaRegistry-1.json ./eng/dtdl +$conv ./eng/dtdl/statestore.json ./eng/dtdl diff --git a/codegen2/eval/aio/gen.sh b/codegen2/eval/aio/gen.sh new file mode 100644 index 0000000000..acbbd3897c --- /dev/null +++ b/codegen2/eval/aio/gen.sh @@ -0,0 +1,32 @@ +#!/bin/sh + +genFromDtdl=../../../codegen/src/Azure.Iot.Operations.ProtocolCompiler/bin/Debug/net9.0/Azure.Iot.Operations.ProtocolCompiler +genFromWot=../../src/Azure.Iot.Operations.ProtocolCompiler/bin/Debug/net9.0/Azure.Iot.Operations.ProtocolCompiler + +[[ -d ./eng/dtdl/FromDtdl/AssetAndDeviceRegistry ]] && rm -r ./eng/dtdl/FromDtdl/AssetAndDeviceRegistry +$genFromDtdl --modelFile ./eng/dtdl/adr-base-service.json --outDir ./eng/dtdl/FromDtdl/AssetAndDeviceRegistry --lang csharp --sdkPath ../../../dotnet/src/Azure.Iot.Operations.Protocol +$genFromDtdl --modelFile ./eng/dtdl/device-discovery-service.json --outDir ./eng/dtdl/FromDtdl/AssetAndDeviceRegistry --lang csharp --sdkPath ../../../dotnet/src/Azure.Iot.Operations.Protocol +$genFromDtdl --modelFile ./eng/dtdl/adr-base-service.json --outDir ./eng/dtdl/FromDtdl/AssetAndDeviceRegistry/adr_base_gen --lang rust --sdkPath ../../../rust +$genFromDtdl --modelFile ./eng/dtdl/device-discovery-service.json --outDir ./eng/dtdl/FromDtdl/AssetAndDeviceRegistry/device_discovery_gen --lang rust --sdkPath ../../../rust + +[[ -d ./eng/dtdl/FromWot/AssetAndDeviceRegistry ]] && rm -r ./eng/dtdl/FromWot/AssetAndDeviceRegistry +$genFromWot --thingFiles ./eng/dtdl/AdrBaseService.TD.json --outDir ./eng/dtdl/FromWot/AssetAndDeviceRegistry --lang csharp --namespace AdrBaseService --workingDir obj/akri/AdrBaseService --sdkPath ../../../dotnet/src/Azure.Iot.Operations.Protocol +$genFromWot --thingFiles ./eng/dtdl/DeviceDiscoveryService.TD.json --outDir ./eng/dtdl/FromWot/AssetAndDeviceRegistry --lang csharp --namespace DeviceDiscoveryService --workingDir obj/akri/DeviceDiscoveryService --sdkPath ../../../dotnet/src/Azure.Iot.Operations.Protocol +$genFromWot --thingFiles ./eng/dtdl/AdrBaseService.TD.json --outDir ./eng/dtdl/FromWot/AssetAndDeviceRegistry/adr_base_gen --srcSubdir src --lang rust --namespace AdrBaseService --workingDir target/akri/AdrBaseService --sdkPath ../../../rust +$genFromWot --thingFiles ./eng/dtdl/DeviceDiscoveryService.TD.json --outDir ./eng/dtdl/FromWot/AssetAndDeviceRegistry/device_discovery_gen --srcSubdir src --lang rust --namespace DeviceDiscoveryService --workingDir target/akri/DeviceDiscoveryService --sdkPath ../../../rust + +[[ -d ./eng/dtdl/FromDtdl/SchemaRegistry ]] && rm -r ./eng/dtdl/FromDtdl/SchemaRegistry +$genFromDtdl --modelFile ./eng/dtdl/SchemaRegistry-1.json --outDir ./eng/dtdl/FromDtdl/SchemaRegistry --lang csharp --sdkPath ../../../dotnet/src/Azure.Iot.Operations.Protocol +$genFromDtdl --modelFile ./eng/dtdl/SchemaRegistry-1.json --outDir ./eng/dtdl/FromDtdl/SchemaRegistry/schemaregistry_gen --lang rust --sdkPath ../../../rust + +[[ -d ./eng/dtdl/FromWot/SchemaRegistry ]] && rm -r ./eng/dtdl/FromWot/SchemaRegistry +$genFromWot --thingFiles ./eng/dtdl/SchemaRegistry.TD.json --outDir ./eng/dtdl/FromWot/SchemaRegistry --lang csharp --namespace SchemaRegistry --workingDir obj/akri/SchemaRegistry --sdkPath ../../../dotnet/src/Azure.Iot.Operations.Protocol +$genFromWot --thingFiles ./eng/dtdl/SchemaRegistry.TD.json --outDir ./eng/dtdl/FromWot/SchemaRegistry/schemaregistry_gen --srcSubdir src --lang rust --namespace SchemaRegistry --workingDir target/akri/SchemaRegistry --sdkPath ../../../rust + +[[ -d ./eng/dtdl/FromDtdl/StateStore ]] && rm -r ./eng/dtdl/FromDtdl/StateStore +$genFromDtdl --modelFile ./eng/dtdl/statestore.json --outDir ./eng/dtdl/FromDtdl/StateStore --lang csharp --sdkPath ../../../dotnet/src/Azure.Iot.Operations.Protocol +$genFromDtdl --modelFile ./eng/dtdl/statestore.json --outDir ./eng/dtdl/FromDtdl/StateStore/state_store_gen --lang rust --sdkPath ../../../rust + +[[ -d ./eng/dtdl/FromWot/StateStore ]] && rm -r ./eng/dtdl/FromWot/StateStore +$genFromWot --thingFiles ./eng/dtdl/StateStore.TD.json --outDir ./eng/dtdl/FromWot/StateStore --lang csharp --namespace StateStore --workingDir obj/akri/StateStore --sdkPath ../../../dotnet/src/Azure.Iot.Operations.Protocol +$genFromWot --thingFiles ./eng/dtdl/StateStore.TD.json --outDir ./eng/dtdl/FromWot/StateStore/state_store_gen --srcSubdir src --lang rust --namespace StateStore --workingDir obj/akri/StateStore --sdkPath ../../../dotnet/src/Azure.Iot.Operations.Protocol diff --git a/codegen2/eval/conv.sh b/codegen2/eval/conv.sh new file mode 100644 index 0000000000..1920053598 --- /dev/null +++ b/codegen2/eval/conv.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +conv=../src/Dtdl2Wot/bin/Debug/net9.0/Dtdl2Wot.exe + +$conv ./dtdl/test/CommandComplexSchemas.json ./conv + +$conv ./dtdl/test/CommandRaw.json ./conv + +$conv ./dtdl/test/CommandVariants.json ./conv + +$conv ./dtdl/test/PropertySeparate.json ./conv + +$conv ./dtdl/test/PropertyTogether.json ./conv + +$conv ./dtdl/test/TelemetryAndCommand.json ./conv + +$conv ./dtdl/test/TelemetryComplexSchemas.json ./conv + +$conv ./dtdl/test/TelemetryPrimitiveSchemas.json ./conv + +$conv ./dtdl/test/TelemetryRawSeparate.json ./conv diff --git a/codegen2/eval/dg0.sh b/codegen2/eval/dg0.sh new file mode 100644 index 0000000000..fa12a26ab0 --- /dev/null +++ b/codegen2/eval/dg0.sh @@ -0,0 +1,37 @@ +#!/bin/sh + +odd ../../codegen/test/samples/dotnet/CommandComplexSchemasSample dotnet/CommandComplexSchemasSample & + +# odd ../../codegen/test/samples/rust/CommandComplexSchemasSample/command_complex_schemas_gen/src rust/command_complex_schemas_gen/src & + +# odd ../../codegen/test/samples/dotnet/CommandRawSample dotnet/CommandRawSample & + +# odd ../../codegen/test/samples/rust/CommandRawSample/command_raw_gen/src rust/command_raw_gen/src & + +# odd ../../codegen/test/samples/dotnet/CommandVariantsSample dotnet/CommandVariantsSample & + +# odd ../../codegen/test/samples/rust/CommandVariantsSample/command_variants_gen/src rust/command_variants_gen/src & + +odd ../../codegen/test/samples/dotnet/PropertySeparateSample dotnet/PropertySeparateSample & + +# odd ../../codegen/test/samples/rust/PropertySeparateSample/property_separate_gen/src rust/property_separate_gen/src & + +odd ../../codegen/test/samples/dotnet/PropertyTogetherSample dotnet/PropertyTogetherSample & + +# odd ../../codegen/test/samples/rust/PropertyTogetherSample/property_together_gen/src rust/property_together_gen/src & + +odd ../../codegen/test/samples/dotnet/TelemetryAndCommandSample dotnet/TelemetryAndCommandSample & + +# odd ../../codegen/test/samples/rust/TelemetryAndCommandSample/telemetry_and_command_gen/src rust/telemetry_and_command_gen/src & + +odd ../../codegen/test/samples/dotnet/TelemetryComplexSchemasSample dotnet/TelemetryComplexSchemasSample & + +# odd ../../codegen/test/samples/rust/TelemetryComplexSchemasSample/telemetry_complex_schemas_gen/src rust/telemetry_complex_schemas_gen/src & + +odd ../../codegen/test/samples/dotnet/TelemetryPrimitiveSchemasSample dotnet/TelemetryPrimitiveSchemasSample & + +# odd ../../codegen/test/samples/rust/TelemetryPrimitiveSchemasSample/telemetry_primitive_schemas_gen/src rust/telemetry_primitive_schemas_gen/src & + +# odd ../../codegen/test/samples/dotnet/TelemetryRawSeparateSample dotnet/TelemetryRawSeparateSample & + +# odd ../../codegen/test/samples/rust/TelemetryRawSeparateSample/telemetry_raw_separate_gen/src rust/telemetry_raw_separate_gen/src & diff --git a/codegen2/eval/g2.sh b/codegen2/eval/g2.sh new file mode 100644 index 0000000000..729facbaa9 --- /dev/null +++ b/codegen2/eval/g2.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +gen=../src/Azure.Iot.Operations.ProtocolCompiler/bin/Debug/net9.0/Azure.Iot.Operations.ProtocolCompiler.exe + +[[ -d dotnet/ExternalSchemasSample ]] && rm -r dotnet/ExternalSchemasSample +$gen --thingFiles wot/ExternalSchemas.TD.json --schemas wot/ExternalSchemas/*.json --outDir dotnet/ExternalSchemasSample --lang csharp --namespace ExternalSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol + +[[ -d rust/external_schemas_gen ]] && rm -r rust/external_schemas_gen +$gen --thingFiles wot/ExternalSchemas.TD.json --schemas wot/ExternalSchemas/*.json --outDir rust/external_schemas_gen --lang rust --namespace ExternalSchemas --sdkPath ../../rust --srcSubdir src diff --git a/codegen2/eval/gen0.sh b/codegen2/eval/gen0.sh new file mode 100644 index 0000000000..e6409d19f2 --- /dev/null +++ b/codegen2/eval/gen0.sh @@ -0,0 +1,57 @@ +#!/bin/sh + +gen=../src/Azure.Iot.Operations.ProtocolCompiler/bin/Debug/net9.0/Azure.Iot.Operations.ProtocolCompiler.exe + +[[ -d dotnet/CommandComplexSchemasSample ]] && rm -r dotnet/CommandComplexSchemasSample +$gen --thingFiles conv/CommandComplexSchemas.TD.json --outDir dotnet/CommandComplexSchemasSample --lang csharp --namespace CommandComplexSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol + +[[ -d rust/command_complex_schemas_gen ]] && rm -r rust/command_complex_schemas_gen +$gen --thingFiles conv/CommandComplexSchemas.TD.json --outDir rust/command_complex_schemas_gen --lang rust --namespace CommandComplexSchemas --sdkPath ../../rust --srcSubdir src + +[[ -d dotnet/CommandRawSample ]] && rm -r dotnet/CommandRawSample +$gen --thingFiles conv/CommandRaw.TD.json --outDir dotnet/CommandRawSample --lang csharp --namespace CommandRaw --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol + +[[ -d rust/command_raw_gen ]] && rm -r rust/command_raw_gen +$gen --thingFiles conv/CommandRaw.TD.json --outDir rust/command_raw_gen --lang rust --namespace CommandRaw --sdkPath ../../rust --srcSubdir src + +[[ -d dotnet/CommandVariantsSample ]] && rm -r dotnet/CommandVariantsSample +$gen --thingFiles conv/CommandVariants.TD.json --outDir dotnet/CommandVariantsSample --lang csharp --namespace CommandVariants --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol --defaultImpl + +[[ -d rust/command_variants_gen ]] && rm -r rust/command_variants_gen +$gen --thingFiles conv/CommandVariants.TD.json --outDir rust/command_variants_gen --lang rust --namespace CommandVariants --sdkPath ../../rust --srcSubdir src + +[[ -d dotnet/PropertySeparateSample ]] && rm -r dotnet/PropertySeparateSample +$gen --thingFiles conv/PropertySeparate.TD.json --outDir dotnet/PropertySeparateSample --lang csharp --namespace PropertySeparate --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol + +[[ -d rust/property_separate_gen ]] && rm -r rust/property_separate_gen +$gen --thingFiles conv/PropertySeparate.TD.json --outDir rust/property_separate_gen --lang rust --namespace PropertySeparate --sdkPath ../../rust --srcSubdir src + +[[ -d dotnet/PropertyTogetherSample ]] && rm -r dotnet/PropertyTogetherSample +$gen --thingFiles conv/PropertyTogether.TD.json --outDir dotnet/PropertyTogetherSample --lang csharp --namespace PropertyTogether --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol + +[[ -d rust/property_together_gen ]] && rm -r rust/property_together_gen +$gen --thingFiles conv/PropertyTogether.TD.json --outDir rust/property_together_gen --lang rust --namespace PropertyTogether --sdkPath ../../rust --srcSubdir src + +[[ -d dotnet/TelemetryAndCommandSample ]] && rm -r dotnet/TelemetryAndCommandSample +$gen --thingFiles conv/TelemetryAndCommand.TD.json --outDir dotnet/TelemetryAndCommandSample --lang csharp --namespace TelemetryAndCommand --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol + +[[ -d rust/telemetry_and_command_gen ]] && rm -r rust/telemetry_and_command_gen +$gen --thingFiles conv/TelemetryAndCommand.TD.json --outDir rust/telemetry_and_command_gen --lang rust --namespace TelemetryAndCommand --sdkPath ../../rust --srcSubdir src + +[[ -d dotnet/TelemetryComplexSchemasSample ]] && rm -r dotnet/TelemetryComplexSchemasSample +$gen --thingFiles conv/TelemetryComplexSchemas.TD.json --outDir dotnet/TelemetryComplexSchemasSample --lang csharp --namespace TelemetryComplexSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol + +[[ -d rust/telemetry_complex_schemas_gen ]] && rm -r rust/telemetry_complex_schemas_gen +$gen --thingFiles conv/TelemetryComplexSchemas.TD.json --outDir rust/telemetry_complex_schemas_gen --lang rust --namespace TelemetryComplexSchemas --sdkPath ../../rust --srcSubdir src + +[[ -d dotnet/TelemetryPrimitiveSchemasSample ]] && rm -r dotnet/TelemetryPrimitiveSchemasSample +$gen --thingFiles conv/TelemetryPrimitiveSchemas.TD.json --outDir dotnet/TelemetryPrimitiveSchemasSample --lang csharp --namespace TelemetryPrimitiveSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol + +[[ -d rust/telemetry_primitive_schemas_gen ]] && rm -r rust/telemetry_primitive_schemas_gen +$gen --thingFiles conv/TelemetryPrimitiveSchemas.TD.json --outDir rust/telemetry_primitive_schemas_gen --lang rust --namespace TelemetryPrimitiveSchemas --sdkPath ../../rust --srcSubdir src + +[[ -d dotnet/TelemetryRawSeparateSample ]] && rm -r dotnet/TelemetryRawSeparateSample +$gen --thingFiles conv/TelemetryRawSeparate.TD.json --outDir dotnet/TelemetryRawSeparateSample --lang csharp --namespace TelemetryRawSeparate --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol + +[[ -d rust/telemetry_raw_separate_gen ]] && rm -r rust/telemetry_raw_separate_gen +$gen --thingFiles conv/TelemetryRawSeparate.TD.json --outDir rust/telemetry_raw_separate_gen --lang rust --namespace TelemetryRawSeparate --sdkPath ../../rust --srcSubdir src diff --git a/codegen2/eval/wot/ExternalSchemas.TD.json b/codegen2/eval/wot/ExternalSchemas.TD.json index 5cbb5e5b56..de6edbb08c 100644 --- a/codegen2/eval/wot/ExternalSchemas.TD.json +++ b/codegen2/eval/wot/ExternalSchemas.TD.json @@ -13,6 +13,58 @@ "security": [ "nosec_sc" ], + "schemaDefinitions": { + "Foo": { + "description": "The requested property read/write could not be completed.", + "type": "object", + "properties": { + "explanation": { + "description": "The requested property read/write could not be completed.", + "type": "array", + "items": { + "type": "string" + } + }, + "details": { + "type": "string" + } + } + }, + "Bar": { + "type": "array", + "items": { + "type": "string" + } + }, + "Baz": { + "type": "string", + "const": "Hello" + } + }, + "forms": [ + { + "href": "dtmi:test:PropertyTogether;1", + "contentType": "application/json", + "dtv:topic": "test/PropertyTogether/read", + "additionalResponses": [ + { + "success": false + } + ], + "op": [ "readallproperties" ] + }, + { + "href": "dtmi:test:PropertyTogether;1", + "contentType": "application/json", + "dtv:topic": "test/PropertyTogether/read", + "additionalResponses": [ + { + "success": false + } + ], + "op": [ "writemultipleproperties" ] + } + ], "actions": { "DoSomething": { "input": { @@ -39,14 +91,26 @@ { "href": "dtmi:jsonTest:ExternalSchemas:_contents:__Aleph;1", "contentType": "application/json", - "dtv:topic": "test/ExternalSchemas/Aleph/write", - "op": "writeproperty" + "dtv:topic": "sample/{modelId}/property/Alpha", + "additionalResponses": [ + { + "success": false, + "schema": "Foo" + } + ], + "op": [ "readproperty" ] }, { "href": "dtmi:jsonTest:ExternalSchemas:_contents:__Aleph;1", "contentType": "application/json", - "dtv:topic": "test/ExternalSchemas/Aleph/read", - "op": "readproperty" + "dtv:topic": "sample/{modelId}/property/Alpha", + "additionalResponses": [ + { + "success": false, + "schema": "Foo" + } + ], + "op": [ "writeproperty" ] } ] } diff --git a/codegen2/eval/wot/TelemetryAndCommand.TD.json b/codegen2/eval/wot/TelemetryAndCommand.TD.json new file mode 100644 index 0000000000..1a4d828bd5 --- /dev/null +++ b/codegen2/eval/wot/TelemetryAndCommand.TD.json @@ -0,0 +1,104 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:jsonTest:TelemetryAndCommand;1", + "title": "TelemetryAndCommand", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:jsonTest:TelemetryAndCommand;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/{senderId}/telemetry", + "op": "subscribeallevents" + } + ], + "actions": { + "setColor": { + "input": { + "type": "object", + "required": [ "newColor" ], + "properties": { + "newColor": { + "type": "string" + } + } + }, + "output": { + "type": "object", + "required": [ "oldColor" ], + "properties": { + "oldColor": { + "type": "string" + } + } + }, + "forms": [ + { + "href": "dtmi:jsonTest:TelemetryAndCommand:_contents:__setColor;1", + "contentType": "application/json", + "dtv:serviceGroupId": "MyCommandGroup", + "dtv:topic": "sample/{modelId}/command/setColor", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + "distance": { + "descriptions": { + "en": "The total distance from the origin." + }, + "data": { + "title": "Example", + "type": "object", + "properties": { + "latitude": { + "type": "number", + "minimum": -1.80e+308, + "maximum": 1.80e+308 + }, + "longitude": { + "type": "number", + "minimum": -1.80e+308, + "maximum": 1.80e+308 + } + } + }, + "forms": [ + { + "href": "dtmi:jsonTest:TelemetryAndCommand:_contents:__distance;1", + "contentType": "application/json", + "dtv:serviceGroupId": "MyTelemetryGroup", + "op": "subscribeevent" + } + ] + }, + "color": { + "descriptions": { + "en": "The color currently being applied." + }, + "data": { + "dtv:ref": "Example1.json" + }, + "forms": [ + { + "href": "dtmi:jsonTest:TelemetryAndCommand:_contents:__color;1", + "contentType": "application/json", + "dtv:serviceGroupId": "MyTelemetryGroup", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/eval/wot/TelemetryComplexSchemas.SchemaNames.json b/codegen2/eval/wot/TelemetryComplexSchemas.SchemaNames.json index a950212a83..71d9faab95 100644 --- a/codegen2/eval/wot/TelemetryComplexSchemas.SchemaNames.json +++ b/codegen2/eval/wot/TelemetryComplexSchemas.SchemaNames.json @@ -2,8 +2,8 @@ "aggregateEventName": "Telemetry", "aggregateEventSchema": "TelemetryCollection", "eventValueSchema": { - "in": [ "eventSchema" ], - "out": "{eventSchema}Schema", + "in": [ "eventName" ], + "out": "{eventName}Schema", "capitalize": true }, "eventSenderBinder": { diff --git a/codegen2/eval/wot/TelemetryPrimitiveSchemas.SchemaNames.json b/codegen2/eval/wot/TelemetryPrimitiveSchemas.SchemaNames.json index b7299af40c..3e93e188b3 100644 --- a/codegen2/eval/wot/TelemetryPrimitiveSchemas.SchemaNames.json +++ b/codegen2/eval/wot/TelemetryPrimitiveSchemas.SchemaNames.json @@ -5,8 +5,8 @@ "capitalize": true }, "eventValueSchema": { - "in": [ "eventSchema" ], - "out": "{eventSchema}Schema", + "in": [ "eventName" ], + "out": "{eventName}Schema", "capitalize": true }, "eventSenderBinder": { diff --git a/codegen2/eval/wot/ThingOne.SchemaNames.json b/codegen2/eval/wot/ThingOne.SchemaNames.json index 3cc856b6eb..2222caab41 100644 --- a/codegen2/eval/wot/ThingOne.SchemaNames.json +++ b/codegen2/eval/wot/ThingOne.SchemaNames.json @@ -7,8 +7,8 @@ "capitalize": true }, "eventValueSchema": { - "in": [ "eventSchema" ], - "out": "EventOne{eventSchema}Value", + "in": [ "eventName" ], + "out": "EventOne{eventName}Value", "capitalize": true } } diff --git a/codegen2/eval/wot/ThingTwo.SchemaNames.json b/codegen2/eval/wot/ThingTwo.SchemaNames.json index 90e9a01e8c..01bf2d9b3d 100644 --- a/codegen2/eval/wot/ThingTwo.SchemaNames.json +++ b/codegen2/eval/wot/ThingTwo.SchemaNames.json @@ -7,8 +7,8 @@ "capitalize": true }, "eventValueSchema": { - "in": [ "eventSchema" ], - "out": "EventTwo{eventSchema}Value", + "in": [ "eventName" ], + "out": "EventTwo{eventName}Value", "capitalize": true } } diff --git a/codegen2/res/conversion/SchemaNames.json b/codegen2/res/conversion/SchemaNames.json index 3e5af9a599..19c8363589 100644 --- a/codegen2/res/conversion/SchemaNames.json +++ b/codegen2/res/conversion/SchemaNames.json @@ -1,24 +1,27 @@ { "aggregateEventName": "Telemetry", "aggregateEventSchema": "TelemetryCollection", + "aggregatePropName": "Property", + "aggregateReadRespValueField": "Properties", + "aggregateRespErrorField": "Errors", "eventSchema": { "in": [ "eventName" ], "out": "{eventName}Telemetry", "capitalize": true }, "eventValueSchema": { - "in": [ "eventSchema" ], - "out": "{eventSchema}Schema", + "in": [ "eventName" ], + "out": "{eventName}Schema", "capitalize": true }, "eventSenderBinder": { "in": [ "eventSchema" ], - "out": "{eventSchema}TelemetrySender", + "out": "{eventSchema}Sender", "capitalize": true }, "eventReceiverBinder": { "in": [ "eventSchema" ], - "out": "{eventSchema}TelemetryReceiver", + "out": "{eventSchema}Receiver", "capitalize": true }, "actionInSchema": { diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/CustomTypeName.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/CustomTypeName.cs index efd8b9345c..09405f19cc 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/CustomTypeName.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/CustomTypeName.cs @@ -4,8 +4,6 @@ namespace Azure.Iot.Operations.CodeGeneration public class CustomTypeName : ITypeName { - public const string Designator = "[CUSTOM]"; - public static CustomTypeName Instance = new(); public string GetTypeName(TargetLanguage language, string? suffix1 = null, string? suffix2 = null, string? suffix3 = null, string? suffix4 = null, bool local = false) diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/FormatSupport.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/FormatSupport.cs index a79be2c9ce..27c8045fce 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/FormatSupport.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/FormatSupport.cs @@ -7,6 +7,8 @@ public static string GetSerializerSubNamespace(this SerializationFormat format) return format switch { SerializationFormat.Json => "JSON", + SerializationFormat.Raw => "raw", + SerializationFormat.Custom => "custom", _ => string.Empty, }; } @@ -16,6 +18,8 @@ public static string GetSerializerClassName(this SerializationFormat format) return format switch { SerializationFormat.Json => "Utf8JsonSerializer", + SerializationFormat.Raw => "PassthroughSerializer", + SerializationFormat.Custom => "ExternalSerializer", _ => string.Empty, }; } @@ -25,6 +29,8 @@ public static EmptyTypeName GetEmptyTypeName(this SerializationFormat format) return format switch { SerializationFormat.Json => EmptyTypeName.JsonInstance, + SerializationFormat.Raw => EmptyTypeName.RawInstance, + SerializationFormat.Custom => EmptyTypeName.CustomInstance, _ => EmptyTypeName.JsonInstance, }; } diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/RawTypeName.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/RawTypeName.cs new file mode 100644 index 0000000000..3184b307cc --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/RawTypeName.cs @@ -0,0 +1,53 @@ +namespace Azure.Iot.Operations.CodeGeneration +{ + using System; + + public class RawTypeName : ITypeName + { + public static RawTypeName Instance = new(); + + public string GetTypeName(TargetLanguage language, string? suffix1 = null, string? suffix2 = null, string? suffix3 = null, string? suffix4 = null, bool local = false) + { + if (suffix1 != null) + { + return "RawBytes" + GetCapitalized(suffix1) + GetCapitalized(suffix2) + GetCapitalized(suffix3) + GetCapitalized(suffix4); + } + else + { + return language switch + { + TargetLanguage.CSharp => "byte[]", + TargetLanguage.Rust => "Vec", + _ => throw new InvalidOperationException($"There is no {language} representation for {typeof(RawTypeName)}"), + }; + } + } + + public string GetFileName(TargetLanguage language, string? suffix1 = null, string? suffix2 = null, string? suffix3 = null) + { + if (suffix1 != null) + { + return language switch + { + TargetLanguage.CSharp => "RawBytes" + GetCapitalized(suffix1) + GetCapitalized(suffix2) + GetCapitalized(suffix3), + TargetLanguage.Rust => "raw_bytes" + GetSnakeSuffix(suffix1) + GetSnakeSuffix(suffix2) + GetSnakeSuffix(suffix3), + _ => throw new InvalidOperationException($"There is no {language} representation for {typeof(RawTypeName)}"), + }; + } + else + { + throw new InvalidOperationException($"{typeof(RawTypeName)} should not be used for a file name without a suffix"); + } + } + + private static string GetCapitalized(string? suffix) + { + return suffix == null ? string.Empty : char.ToUpperInvariant(suffix[0]) + suffix.Substring(1); + } + + private static string GetSnakeSuffix(string? suffix) + { + return suffix == null ? string.Empty : $"_{suffix}"; + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNamer.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNamer.cs index f0e23e5906..90ccaecade 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNamer.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/SchemaNamer.cs @@ -50,7 +50,7 @@ public SchemaNamer(string? schemaNameInfoText = null) public string GetEventSchema(string eventName) => Expand(null, this.schemaNameInfo?.EventSchema, $"{Cap(eventName)}Event", eventName); - public string GetEventValueSchema(string eventSchema) => Expand(null, this.schemaNameInfo?.EventValueSchema, $"{Cap(eventSchema)}Value", eventSchema); + public string GetEventValueSchema(string eventName) => Expand(null, this.schemaNameInfo?.EventValueSchema, $"{Cap(eventName)}Value", eventName); public string GetEventSenderBinder(string eventSchema) => Expand(null, this.schemaNameInfo?.EventSenderBinder, $"{Cap(eventSchema)}Sender", eventSchema); diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/SerializationFormat.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/SerializationFormat.cs index 222a41c8bd..8fef4b4c6e 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/SerializationFormat.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/SerializationFormat.cs @@ -4,5 +4,7 @@ public enum SerializationFormat { None, Json, + Raw, + Custom, } } diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/TDValues.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/TDValues.cs index 28330d6e7d..643c54ad7d 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/TDValues.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/TDValues.cs @@ -7,6 +7,8 @@ public static class TDValues public const string RelationSchemaNaming = "service-desc"; public const string ContentTypeJson = "application/json"; + public const string ContentTypeRaw = "application/octet-stream"; + public const string ContentTypeCustom = ""; public const string OpInvokeAction = "invokeaction"; public const string OpReadProp = "readproperty"; diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingSupport.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingSupport.cs index 6bcb74dd1e..7699cca9b9 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingSupport.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingSupport.cs @@ -54,15 +54,25 @@ public static SerializationFormat ContentTypeToFormat(ErrorReporter errorReporte return SerializationFormat.None; } - switch (contentType.Value.Value) + SerializationFormat format = ContentTypeToFormat(contentType.Value.Value); + + if (format == SerializationFormat.None) { - case TDValues.ContentTypeJson: - return SerializationFormat.Json; + errorReporter.ReportError($"Unsupported content type '{contentType.Value.Value}'.", contentType.TokenIndex); } - errorReporter.ReportError($"Unsupported content type '{contentType.Value.Value}'.", contentType.TokenIndex); + return format; + } - return SerializationFormat.None; + public static SerializationFormat ContentTypeToFormat(string contentType) + { + return contentType switch + { + TDValues.ContentTypeJson => SerializationFormat.Json, + TDValues.ContentTypeRaw => SerializationFormat.Raw, + TDValues.ContentTypeCustom => SerializationFormat.Custom, + _ => SerializationFormat.None, + }; } private static void AddFormatsFromForms(ErrorReporter errorReporter, IEnumerable>? forms, HashSet formats) diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs index f520cc8ae6..3239b75f80 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs @@ -30,7 +30,7 @@ public ThingValidator(ErrorReporter errorReporter) this.errorReporter = errorReporter; } - public bool TryValidateThng(TDThing thing) + public bool TryValidateThng(TDThing thing, HashSet serializationFormats) { bool hasError = false; @@ -59,22 +59,22 @@ public bool TryValidateThng(TDThing thing) hasError = true; } - if (!TryValidateRootForms(thing.Forms, thing.SchemaDefinitions)) + if (!TryValidateRootForms(thing.Forms, thing.SchemaDefinitions, serializationFormats)) { hasError = true; } - if (!TryValidateActions(thing.Actions, thing.SchemaDefinitions)) + if (!TryValidateActions(thing.Actions, thing.SchemaDefinitions, serializationFormats)) { hasError = true; } - if (!TryValidateProperties(thing.Properties, thing.SchemaDefinitions)) + if (!TryValidateProperties(thing.Properties, thing.SchemaDefinitions, serializationFormats)) { hasError = true; } - if (!TryValidateEvents(thing.Events, thing.SchemaDefinitions)) + if (!TryValidateEvents(thing.Events, thing.SchemaDefinitions, serializationFormats)) { hasError = true; } @@ -171,18 +171,23 @@ private void CheckSchemaDefinitionsCoverage(MapTracker? schemaDefi } } - private bool TryValidateRootForms(ArrayTracker? forms, MapTracker? schemaDefinitions) + private bool TryValidateRootForms(ArrayTracker? forms, MapTracker? schemaDefinitions, HashSet serializationFormats) { if (forms?.Elements == null) { return true; } - if (!TryValidateForms(forms, FormsKind.Root, schemaDefinitions)) + if (!TryValidateForms(forms, FormsKind.Root, schemaDefinitions, out ValueTracker? contentType)) { return false; } + if (contentType != null) + { + serializationFormats.Add(ThingSupport.ContentTypeToFormat(contentType.Value.Value)); + } + List> aggregateOps = forms.Elements.SelectMany(form => form.Value.Op?.Elements ?? new()).ToList(); ValueTracker? writeMultiOp = aggregateOps.FirstOrDefault(op => op.Value.Value == TDValues.OpWriteMultProps); ValueTracker? readAllOp = aggregateOps.FirstOrDefault(op => op.Value.Value == TDValues.OpReadAllProps); @@ -564,7 +569,7 @@ private bool TryValidateSchemaDefinitions(MapTracker? schemaDefini return !hasError; } - private bool TryValidateActions(MapTracker? actions, MapTracker? schemaDefinitions) + private bool TryValidateActions(MapTracker? actions, MapTracker? schemaDefinitions, HashSet serializationFormats) { if (actions?.Entries == null) { @@ -575,35 +580,40 @@ private bool TryValidateActions(MapTracker? actions, MapTracker> action in actions.Entries) { - if (!TryValidateAction(action.Key, action.Value, schemaDefinitions)) + if (!TryValidateAction(action.Key, action.Value, schemaDefinitions, out ValueTracker? contentType)) { hasError = true; } + else if (contentType != null) + { + serializationFormats.Add(ThingSupport.ContentTypeToFormat(contentType.Value.Value)); + } } return !hasError; } - private bool TryValidateAction(string name, ValueTracker action, MapTracker? schemaDefinitions) + private bool TryValidateAction(string name, ValueTracker action, MapTracker? schemaDefinitions, out ValueTracker? contentType) { - bool hasError = false; - - if (action.Value.Input != null && !TryValidateActionDataSchema(action.Value.Input, TDAction.InputName)) + if (action.Value.Forms == null) { - hasError = true; + errorReporter.ReportError($"Action '{name}' element is missing required '{TDAction.FormsName}' property.", action.TokenIndex); + contentType = null; + return false; } - - if (action.Value.Output != null && !TryValidateActionDataSchema(action.Value.Output, TDAction.OutputName)) + else if (!TryValidateForms(action.Value.Forms, FormsKind.Action, schemaDefinitions, out contentType)) { - hasError = true; + return false; } - if (action.Value.Forms == null) + bool hasError = false; + + if (action.Value.Input != null && !TryValidateActionDataSchema(action.Value.Input, TDAction.InputName, contentType)) { - errorReporter.ReportError($"Action '{name}' element is missing required '{TDAction.FormsName}' property.", action.TokenIndex); hasError = true; } - else if (!TryValidateForms(action.Value.Forms, FormsKind.Action, schemaDefinitions)) + + if (action.Value.Output != null && !TryValidateActionDataSchema(action.Value.Output, TDAction.OutputName, contentType)) { hasError = true; } @@ -627,21 +637,22 @@ private bool TryValidateAction(string name, ValueTracker action, MapTr return !hasError; } - private bool TryValidateActionDataSchema(ValueTracker dataSchema, string propertyName) + private bool TryValidateActionDataSchema(ValueTracker dataSchema, string propertyName, ValueTracker? contentType) where T : TDDataSchema, IDeserializable { bool isStructuredObject = dataSchema.Value.Type?.Value.Value == TDValues.TypeObject && dataSchema.Value.Properties != null; + bool isNull = dataSchema.Value.Type?.Value.Value == TDValues.TypeNull; bool isReference = dataSchema.Value.Ref != null; - if (!isStructuredObject && !isReference) + if (!isStructuredObject && !isNull && !isReference) { - errorReporter.ReportError($"'{TDThing.ActionsName}' element '{propertyName}' property must have a schema of (or a reference to) a structured object type.", dataSchema.TokenIndex); + errorReporter.ReportError($"'{TDThing.ActionsName}' element '{propertyName}' property must have a schema of (or a reference to) a structured object type, or no schema at all via a '{TDDataSchema.TypeName}' value of '{TDValues.TypeNull}'.", dataSchema.TokenIndex); return false; } - return TryValidateDataSchema(dataSchema, null, DataSchemaKind.Affordance); + return TryValidateDataSchema(dataSchema, null, DataSchemaKind.Action, contentType); } - private bool TryValidateProperties(MapTracker? properties, MapTracker? schemaDefinitions) + private bool TryValidateProperties(MapTracker? properties, MapTracker? schemaDefinitions, HashSet serializationFormats) { if (properties?.Entries == null) { @@ -652,40 +663,43 @@ private bool TryValidateProperties(MapTracker? properties, MapTracke foreach (KeyValuePair> property in properties.Entries) { - if (!TryValidateProperty(property.Key, property.Value, schemaDefinitions)) + if (!TryValidateProperty(property.Key, property.Value, schemaDefinitions, out ValueTracker? contentType)) { hasError = true; } + else if (contentType != null) + { + serializationFormats.Add(ThingSupport.ContentTypeToFormat(contentType.Value.Value)); + } } return !hasError; } - private bool TryValidateProperty(string name, ValueTracker property, MapTracker? schemaDefinitions) + private bool TryValidateProperty(string name, ValueTracker property, MapTracker? schemaDefinitions, out ValueTracker? contentType) { - bool hasError = false; - - if (!TryValidateDataSchema(property, (propName) => propName == TDProperty.ReadOnlyName || propName == TDProperty.PlaceholderName || propName == TDProperty.FormsName, DataSchemaKind.Affordance)) - { - hasError = true; - } - if (property.Value.Forms == null) { errorReporter.ReportError($"Property '{name}' element is missing required '{TDProperty.FormsName}' property.", property.TokenIndex); - hasError = true; + contentType = null; + return false; } - else if (!TryValidatePropertyForms(name, property.Value.Forms, schemaDefinitions, property.Value.ReadOnly)) + else if (!TryValidatePropertyForms(name, property.Value.Forms, schemaDefinitions, property.Value.ReadOnly, out contentType)) { - hasError = true; + return false; } - return !hasError; + if (!TryValidateDataSchema(property, (propName) => propName == TDProperty.ReadOnlyName || propName == TDProperty.PlaceholderName || propName == TDProperty.FormsName, DataSchemaKind.Property, contentType)) + { + return false; + } + + return true; } - private bool TryValidatePropertyForms(string name, ArrayTracker forms, MapTracker? schemaDefinitions, ValueTracker? readOnly) + private bool TryValidatePropertyForms(string name, ArrayTracker forms, MapTracker? schemaDefinitions, ValueTracker? readOnly, out ValueTracker? contentType) { - if (!TryValidateForms(forms, FormsKind.Property, schemaDefinitions)) + if (!TryValidateForms(forms, FormsKind.Property, schemaDefinitions, out contentType)) { return false; } @@ -735,7 +749,7 @@ private bool TryValidatePropertyForms(string name, ArrayTracker forms, M return !hasError; } - private bool TryValidateEvents(MapTracker? evts, MapTracker? schemaDefinitions) + private bool TryValidateEvents(MapTracker? evts, MapTracker? schemaDefinitions, HashSet serializationFormats) { if (evts?.Entries == null) { @@ -746,30 +760,35 @@ private bool TryValidateEvents(MapTracker? evts, MapTracker> evt in evts.Entries) { - if (!TryValidateEvent(evt.Key, evt.Value, schemaDefinitions)) + if (!TryValidateEvent(evt.Key, evt.Value, schemaDefinitions, out ValueTracker? contentType)) { hasError = true; } + else if (contentType != null) + { + serializationFormats.Add(ThingSupport.ContentTypeToFormat(contentType.Value.Value)); + } } return !hasError; } - private bool TryValidateEvent(string name, ValueTracker evt, MapTracker? schemaDefinitions) + private bool TryValidateEvent(string name, ValueTracker evt, MapTracker? schemaDefinitions, out ValueTracker? contentType) { - bool hasError = false; - - if (evt.Value.Data != null && !TryValidateDataSchema(evt.Value.Data, null, DataSchemaKind.Affordance)) - { - hasError = true; - } - if (evt.Value.Forms == null) { errorReporter.ReportError($"Event '{name}' element is missing required '{TDEvent.FormsName}' property.", evt.TokenIndex); - hasError = true; + contentType = null; + return false; } - else if (!TryValidateForms(evt.Value.Forms, FormsKind.Event, schemaDefinitions)) + else if (!TryValidateForms(evt.Value.Forms, FormsKind.Event, schemaDefinitions, out contentType)) + { + return false; + } + + bool hasError = false; + + if (evt.Value.Data != null && !TryValidateDataSchema(evt.Value.Data, null, DataSchemaKind.Event, contentType)) { hasError = true; } @@ -793,8 +812,10 @@ private bool TryValidateEvent(string name, ValueTracker evt, MapTracker return !hasError; } - private bool TryValidateForms(ArrayTracker forms, FormsKind formsKind, MapTracker? schemaDefinitions) + private bool TryValidateForms(ArrayTracker forms, FormsKind formsKind, MapTracker? schemaDefinitions, out ValueTracker? contentType) { + contentType = null; + if (forms.Elements!.Count == 0) { errorReporter.ReportError($"Property '{TDEvent.FormsName}' array value contains no elements; at least one form is required.", forms.TokenIndex); @@ -805,10 +826,25 @@ private bool TryValidateForms(ArrayTracker forms, FormsKind formsKind, M foreach (ValueTracker form in forms.Elements) { - if (!TryValidateForm(form, formsKind, schemaDefinitions)) + if (!TryValidateForm(form, formsKind, schemaDefinitions, out ValueTracker? formContentType)) { hasError = true; } + else if (formContentType != null) + { + if (contentType != null) + { + if (formContentType.Value.Value != contentType.Value.Value) + { + errorReporter.ReportError($"'{TDThing.FormsName}' array contains forms with different '{TDForm.ContentTypeName}' property values '{contentType.Value.Value}' and '{formContentType.Value.Value}'.", contentType.TokenIndex, formContentType.TokenIndex); + hasError = true; + } + } + else + { + contentType = formContentType; + } + } } if (hasError) @@ -834,7 +870,7 @@ private bool TryValidateForms(ArrayTracker forms, FormsKind formsKind, M return !hasError; } - private bool TryValidateForm(ValueTracker form, FormsKind formsKind, MapTracker? schemaDefinitions) + private bool TryValidateForm(ValueTracker form, FormsKind formsKind, MapTracker? schemaDefinitions, out ValueTracker? contentType) { bool hasError = false; @@ -888,15 +924,22 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map if (form.Value.ContentType != null) { - if (string.IsNullOrWhiteSpace(form.Value.ContentType.Value.Value)) + if (formsKind == FormsKind.Action || formsKind == FormsKind.Event) { - errorReporter.ReportError($"Form '{TDForm.ContentTypeName}' property has empty value.", form.Value.ContentType.TokenIndex); - hasError = true; + if (form.Value.ContentType.Value.Value != TDValues.ContentTypeJson && form.Value.ContentType.Value.Value != TDValues.ContentTypeRaw && form.Value.ContentType.Value.Value != TDValues.ContentTypeCustom) + { + errorReporter.ReportError($"Form '{TDForm.ContentTypeName}' property has unsupported value '{form.Value.ContentType.Value.Value}'; for '{TDThing.ActionsName}' and '{TDThing.EventsName}' forms, supported values are '{TDValues.ContentTypeJson}', '{TDValues.ContentTypeRaw}', and '{TDValues.ContentTypeCustom}' (empty string).", form.Value.ContentType.TokenIndex); + hasError = true; + } } - else if (form.Value.ContentType.Value.Value != TDValues.ContentTypeJson) + else { - errorReporter.ReportError($"Form '{TDForm.ContentTypeName}' property has unsupported value '{form.Value.ContentType.Value.Value}'; only '{TDValues.ContentTypeJson}' is supported.", form.Value.ContentType.TokenIndex); - hasError = true; + if (form.Value.ContentType.Value.Value != TDValues.ContentTypeJson) + { + string adjective = form.Value.ContentType.Value.Value == TDValues.ContentTypeRaw || form.Value.ContentType.Value.Value == TDValues.ContentTypeCustom ? "disallowed" : "unsupported"; + errorReporter.ReportError($"Form '{TDForm.ContentTypeName}' property has {adjective} value '{form.Value.ContentType.Value.Value}'; for '{TDThing.PropertiesName}' and root-level forms, only '{TDValues.ContentTypeJson}' is supported.", form.Value.ContentType.TokenIndex); + hasError = true; + } } } @@ -921,6 +964,7 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map if (hasError) { + contentType = null; return false; } @@ -1068,6 +1112,7 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map } } + contentType = form.Value.ContentType; return !hasError; } @@ -1187,10 +1232,10 @@ private bool TryValidateSchemaReference(ValueTracker schemaRe return !hasError; } - private bool TryValidateDataSchema(ValueTracker dataSchema, Func? propertyApprover, DataSchemaKind dataSchemaKind = DataSchemaKind.Undistinguished) + private bool TryValidateDataSchema(ValueTracker dataSchema, Func? propertyApprover, DataSchemaKind dataSchemaKind = DataSchemaKind.Undistinguished, ValueTracker? contentType = null) where T : TDDataSchema, IDeserializable { - if (dataSchema.Value.Ref != null && dataSchemaKind != DataSchemaKind.Affordance) + if (dataSchema.Value.Ref != null && dataSchemaKind != DataSchemaKind.Action && dataSchemaKind != DataSchemaKind.Property && dataSchemaKind != DataSchemaKind.Event) { errorReporter.ReportError($"The '{TDDataSchema.RefName}' property is permitted only in the first level of an affordance schema definition ('{TDThing.PropertiesName}', '{TDThing.EventsName}'/'{TDEvent.DataName}', '{TDThing.ActionsName}'/'{TDAction.InputName}', and '{TDThing.ActionsName}'/'{TDAction.OutputName}').", dataSchema.Value.Ref.TokenIndex); return false; @@ -1208,9 +1253,30 @@ private bool TryValidateDataSchema(ValueTracker dataSchema, Func(ValueTracker dataSchema, Func(ValueTracker dataSchema, DataSch return !hasError; } + private bool TryValidateNullDataSchema(ValueTracker dataSchema, DataSchemaKind dataSchemaKind, Func? propertyApprover) + where T : TDDataSchema, IDeserializable + { + if (dataSchemaKind != DataSchemaKind.Action && dataSchemaKind != DataSchemaKind.Event) + { + errorReporter.ReportError($"A '{TDDataSchema.TypeName}' property value of '{TDValues.TypeNull}' is permitted only in the '{TDAction.InputName}' or '{TDAction.OutputName}' property value of an '{TDThing.ActionsName}' element or in the '{TDEvent.DataName}' property value of an '{TDThing.EventsName}' element.", dataSchema.Value.Type!.TokenIndex); + return false; + } + + bool hasError = false; + + foreach (KeyValuePair propertyName in dataSchema.Value.PropertyNames) + { + if (propertyApprover?.Invoke(propertyName.Key) != true && propertyName.Key != TDDataSchema.TypeName && propertyName.Key != TDDataSchema.TitleName && propertyName.Key != TDDataSchema.DescriptionName) + { + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) + { + errorReporter.ReportWarning($"Data schema has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); + } + else + { + errorReporter.ReportError($"Data schema defines a null type, which does not support '{propertyName.Key}' property.", propertyName.Value); + hasError = true; + } + } + } + + return !hasError; + } + private enum DataSchemaKind { Undistinguished, - Affordance, + Action, + Property, + Event, SchemaDefinition, } diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs index 36e0551639..6aafee8444 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs @@ -8,7 +8,7 @@ internal static class ActionEnvoyGenerator { - internal static List GenerateActionEnvoys(ErrorReporter errorReporter, TDThing tdThing, SchemaNamer schemaNamer, CodeName serviceName, EnvoyTransformFactory envoyFactory, Dictionary transforms, Dictionary errorSpecs, HashSet typesToSerialize) + internal static List GenerateActionEnvoys(ErrorReporter errorReporter, TDThing tdThing, SchemaNamer schemaNamer, CodeName serviceName, EnvoyTransformFactory envoyFactory, Dictionary transforms, Dictionary errorSpecs, Dictionary> formattedTypesToSerialize) { List actionSpecs = new(); @@ -25,6 +25,8 @@ internal static List GenerateActionEnvoys(ErrorReporter errorReporte if (actionForm?.TopicPattern != null && actionForm.Format != SerializationFormat.None) { + HashSet typesToSerialize = formattedTypesToSerialize[actionForm.Format]; + string? inputSchemaType = action.Input != null ? schemaNamer.GetActionInSchema(action.Input?.Value, actionKvp.Key) : null; string? outArgsType = action.Output != null ? schemaNamer.GetActionOutSchema(action.Output?.Value, actionKvp.Key) : null; string? outputSchemaType = actionForm.ErrorRespSchema != null ? schemaNamer.GetActionRespSchema(actionKvp.Key) : outArgsType; diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionSpec.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionSpec.cs index 8afb250dd3..3d64136a47 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionSpec.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionSpec.cs @@ -13,7 +13,7 @@ public record ActionSpec( EmptyTypeName SerializerEmptyType, List NormalResultNames, List NormalRequiredNames, - CodeName? NormalResultSchema, + ITypeName? NormalResultSchema, CodeName? ErrorResultName, CodeName? ErrorResultSchema, CodeName? ErrorCodeName, @@ -43,12 +43,12 @@ public ActionSpec( new CodeName(actionName), new CodeName(schemaNamer.GetActionInvokerBinder(actionName)), new CodeName(schemaNamer.GetActionExecutorBinder(actionName)), - inputSchemaType != null ? new CodeName(inputSchemaType) : null, - outputSchemaType != null ? new CodeName(outputSchemaType) : null, + EnvoyGeneratorSupport.GetTypeName(inputSchemaType, format), + EnvoyGeneratorSupport.GetTypeName(outputSchemaType, format), format.GetEmptyTypeName(), normalResultNames.ConvertAll(name => new CodeName(name)), normalRequiredNames.ConvertAll(name => new CodeName(name.Value.Value)), - normalResultSchema != null ? new CodeName(normalResultSchema) : null, + EnvoyGeneratorSupport.GetTypeName(normalResultSchema, format), errorResultName != null ? new CodeName(errorResultName) : null, errorResultSchema != null ? new CodeName(errorResultSchema) : null, headerCodeName != null ? new CodeName(headerCodeName) : null, diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs index fc865f9c81..627dbbb89e 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs @@ -27,8 +27,8 @@ public static List GenerateEnvoys( Dictionary transforms = new(); Dictionary errorSpecs = new(); Dictionary aggErrorSpecs = new(); - HashSet typesToSerialize = new(); Dictionary schemaConstants = new(); + Dictionary> formattedTypesToSerialize = serializationFormats.ToDictionary(f => f, f => new HashSet()); foreach (ParsedThing parsedThing in parsedThings) { @@ -39,9 +39,9 @@ public static List GenerateEnvoys( CodeName serviceName = new CodeName(parsedThing.Thing.Title.Value.Value); - List actionSpecs = ActionEnvoyGenerator.GenerateActionEnvoys(parsedThing.ErrorReporter, parsedThing.Thing, parsedThing.SchemaNamer, serviceName, envoyFactory, transforms, errorSpecs, typesToSerialize); - List eventSpecs = EventEnvoyGenerator.GenerateEventEnvoys(parsedThing.ErrorReporter, parsedThing.Thing, parsedThing.SchemaNamer, serviceName, envoyFactory, transforms, typesToSerialize); - List propSpecs = PropertyEnvoyGenerator.GeneratePropertyEnvoys(parsedThing.ErrorReporter, parsedThing.Thing, parsedThing.SchemaNamer, serviceName, envoyFactory, transforms, errorSpecs, aggErrorSpecs, typesToSerialize); + List actionSpecs = ActionEnvoyGenerator.GenerateActionEnvoys(parsedThing.ErrorReporter, parsedThing.Thing, parsedThing.SchemaNamer, serviceName, envoyFactory, transforms, errorSpecs, formattedTypesToSerialize); + List eventSpecs = EventEnvoyGenerator.GenerateEventEnvoys(parsedThing.ErrorReporter, parsedThing.Thing, parsedThing.SchemaNamer, serviceName, envoyFactory, transforms, formattedTypesToSerialize); + List propSpecs = PropertyEnvoyGenerator.GeneratePropertyEnvoys(parsedThing.ErrorReporter, parsedThing.Thing, parsedThing.SchemaNamer, serviceName, envoyFactory, transforms, errorSpecs, aggErrorSpecs, formattedTypesToSerialize); GenerateServiceEnvoys(parsedThing.SchemaNamer, serviceName, actionSpecs, propSpecs, eventSpecs, envoyFactory, transforms); CollectNamedConstants(parsedThing.Thing, parsedThing.SchemaNamer, schemaConstants); } @@ -49,7 +49,7 @@ public static List GenerateEnvoys( GenerateConstantEnvoys(schemaConstants, envoyFactory, transforms); GenerateErrorEnvoys(errorSpecs, envoyFactory, transforms); GenerateAggregateErrorEnvoys(aggErrorSpecs, envoyFactory, transforms); - GenerateSerializationEnvoys(typesToSerialize, envoyFactory, transforms); + GenerateSerializationEnvoys(formattedTypesToSerialize, envoyFactory, transforms); List generatedEnvoys = new(); @@ -149,13 +149,16 @@ private static void GenerateAggregateErrorEnvoys(Dictionary typesToSerialize, EnvoyTransformFactory envoyFactory, Dictionary transforms) + private static void GenerateSerializationEnvoys(Dictionary> formattedTypesToSerialize, EnvoyTransformFactory envoyFactory, Dictionary transforms) { - foreach (string typeToSerialize in typesToSerialize) + foreach (KeyValuePair> formatTypes in formattedTypesToSerialize) { - foreach (IEnvoyTemplateTransform transform in envoyFactory.GetSerializationTransforms(typeToSerialize)) + foreach (string typeToSerialize in formatTypes.Value) { - transforms[transform.FileName] = transform; + foreach (IEnvoyTemplateTransform transform in envoyFactory.GetSerializationTransforms(typeToSerialize, formatTypes.Key)) + { + transforms[transform.FileName] = transform; + } } } } diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGeneratorSupport.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGeneratorSupport.cs new file mode 100644 index 0000000000..949ec6b6ef --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGeneratorSupport.cs @@ -0,0 +1,24 @@ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Diagnostics.CodeAnalysis; + using Azure.Iot.Operations.CodeGeneration; + + internal static class EnvoyGeneratorSupport + { + [return: NotNullIfNotNull(nameof(schemaType))] + internal static ITypeName? GetTypeName(string? schemaType, SerializationFormat format) + { + if (schemaType == null) + { + return null; + } + + return format switch + { + SerializationFormat.Raw => RawTypeName.Instance, + SerializationFormat.Custom => CustomTypeName.Instance, + _ => new CodeName(schemaType), + }; + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyTransformFactory.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyTransformFactory.cs index cf750763bb..a5b7f0a818 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyTransformFactory.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyTransformFactory.cs @@ -78,12 +78,12 @@ internal IEnumerable GetActionTransforms( string serializerClassName = format.GetSerializerClassName(); EmptyTypeName serializerEmptyType = format.GetEmptyTypeName(); - ITypeName? inputSchema = inputSchemaType != null ? new CodeName(inputSchemaType) : null; - ITypeName? outputSchema = outputSchemaType != null ? new CodeName(outputSchemaType) : null; + ITypeName? inputSchema = EnvoyGeneratorSupport.GetTypeName(inputSchemaType, format); + ITypeName? outputSchema = EnvoyGeneratorSupport.GetTypeName(outputSchemaType, format); List normalFields = normalResultFields.Select(f => new CodeName(f)).ToList(); List requiredFields = normalRequiredFields.Select(f => new CodeName(f.Value.Value)).ToList(); - CodeName? normalSchema = normalResultSchema != null ? new CodeName(normalResultSchema) : null; + ITypeName? normalSchema = EnvoyGeneratorSupport.GetTypeName(normalResultSchema, format); CodeName? errorName = errorResultName != null ? new CodeName(errorResultName) : null; CodeName? errorSchema = errorResultSchema != null ? new CodeName(errorResultSchema) : null; @@ -235,7 +235,7 @@ internal IEnumerable GetPropertyTransforms( { yield return new DotNetPropertyMaintainer( propertyName, - schemaNamer.GetPropMaintainerBinder(propertyName), + schemaNamer.GetPropMaintainerBinder(propSchema), schemaNamer.ReadResponderBinder, schemaNamer.WriteResponderBinder, schemaNamer.GetPropReadActName(propertyName), @@ -259,7 +259,7 @@ internal IEnumerable GetPropertyTransforms( { yield return new DotNetPropertyConsumer( propertyName, - schemaNamer.GetPropConsumerBinder(propertyName), + schemaNamer.GetPropConsumerBinder(propSchema), schemaNamer.ReadRequesterBinder, schemaNamer.WriteRequesterBinder, schemaNamer.GetPropReadActName(propertyName), @@ -286,7 +286,7 @@ internal IEnumerable GetPropertyTransforms( yield return new RustPropertyMaintainer( propertyName, new CodeName(propSchema), - schemaNamer.GetPropMaintainerBinder(propertyName), + schemaNamer.GetPropMaintainerBinder(propSchema), schemaNamer.GetPropReadActName(propertyName), schemaNamer.GetPropWriteActName(propertyName), genNamespace, @@ -312,7 +312,7 @@ internal IEnumerable GetPropertyTransforms( yield return new RustPropertyConsumer( propertyName, new CodeName(propSchema), - schemaNamer.GetPropConsumerBinder(propertyName), + schemaNamer.GetPropConsumerBinder(propSchema), schemaNamer.GetPropReadActName(propertyName), schemaNamer.GetPropWriteActName(propertyName), genNamespace, @@ -359,24 +359,24 @@ internal IEnumerable GetEventTransforms( case TargetLanguage.CSharp: if (generateServer) { - yield return new DotNetTelemetrySender(eventName, schemaNamer.GetEventSenderBinder(eventName), projectName, genNamespace, modelId, serviceName, serializerClassName, serializerEmptyType, new CodeName(schemaType), topicPattern); + yield return new DotNetTelemetrySender(eventName, schemaNamer.GetEventSenderBinder(schemaType), projectName, genNamespace, modelId, serviceName, serializerClassName, serializerEmptyType, EnvoyGeneratorSupport.GetTypeName(schemaType, format), topicPattern); } if (generateClient) { - yield return new DotNetTelemetryReceiver(eventName, schemaNamer.GetEventReceiverBinder(eventName), projectName, genNamespace, modelId, serviceName, serializerClassName, serializerEmptyType, new CodeName(schemaType), serviceGroupId, topicPattern); + yield return new DotNetTelemetryReceiver(eventName, schemaNamer.GetEventReceiverBinder(schemaType), projectName, genNamespace, modelId, serviceName, serializerClassName, serializerEmptyType, EnvoyGeneratorSupport.GetTypeName(schemaType, format), serviceGroupId, topicPattern); } break; case TargetLanguage.Rust: if (generateServer) { - yield return new RustTelemetrySender(eventName, schemaNamer.GetEventSenderBinder(eventName), genNamespace, modelId, new CodeName(schemaType), topicPattern, srcSubdir); + yield return new RustTelemetrySender(eventName, schemaNamer.GetEventSenderBinder(schemaType), genNamespace, modelId, EnvoyGeneratorSupport.GetTypeName(schemaType, format), topicPattern, schemaType, srcSubdir); } if (generateClient) { - yield return new RustTelemetryReceiver(eventName, schemaNamer.GetEventReceiverBinder(eventName), genNamespace, modelId, new CodeName(schemaType), serviceGroupId, topicPattern, srcSubdir); + yield return new RustTelemetryReceiver(eventName, schemaNamer.GetEventReceiverBinder(schemaType), genNamespace, modelId, EnvoyGeneratorSupport.GetTypeName(schemaType, format), serviceGroupId, topicPattern, schemaType, srcSubdir); } break; @@ -439,18 +439,21 @@ internal IEnumerable GetAggregateErrorTransforms(Aggreg } } - internal IEnumerable GetSerializationTransforms(string serializableType) + internal IEnumerable GetSerializationTransforms(string serializableType, SerializationFormat format) { switch (targetLanguage) { case TargetLanguage.CSharp: break; case TargetLanguage.Rust: - yield return new RustSerialization( - genNamespace, - SerializationFormat.Json, - new CodeName(serializableType), - srcSubdir); + if (format != SerializationFormat.Raw && format != SerializationFormat.Custom) + { + yield return new RustSerialization( + genNamespace, + format, + new CodeName(serializableType), + srcSubdir); + } break; default: throw new NotSupportedException($"Target language {targetLanguage} is not supported."); diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EventEnvoyGenerator.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EventEnvoyGenerator.cs index 0bde87169f..2a2be3b83f 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EventEnvoyGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EventEnvoyGenerator.cs @@ -8,7 +8,7 @@ internal static class EventEnvoyGenerator { - internal static List GenerateEventEnvoys(ErrorReporter errorReporter, TDThing tdThing, SchemaNamer schemaNamer, CodeName serviceName, EnvoyTransformFactory envoyFactory, Dictionary transforms, HashSet typesToSerialize) + internal static List GenerateEventEnvoys(ErrorReporter errorReporter, TDThing tdThing, SchemaNamer schemaNamer, CodeName serviceName, EnvoyTransformFactory envoyFactory, Dictionary transforms, Dictionary> formattedTypesToSerialize) { List eventSpecs = new(); @@ -21,8 +21,8 @@ internal static List GenerateEventEnvoys(ErrorReporter errorReporter, if (subEventForm != null && subEventForm.Format != SerializationFormat.None && subEventForm.TopicPattern != null) { string schemaType = schemaNamer.GetEventSchema(eventKvp.Key); - typesToSerialize.Add(schemaType); - eventSpecs.Add(new EventSpec(schemaNamer, eventKvp.Key, schemaType)); + formattedTypesToSerialize[subEventForm.Format].Add(schemaType); + eventSpecs.Add(new EventSpec(schemaNamer, eventKvp.Key, schemaType, subEventForm.Format)); foreach (IEnvoyTemplateTransform transform in envoyFactory.GetEventTransforms(schemaNamer, tdThing.Id!.Value!.Value, serviceName, eventKvp.Key, schemaType, subEventForm.Format, subEventForm.ServiceGroupId, subEventForm.TopicPattern)) { transforms[transform.FileName] = transform; @@ -33,8 +33,8 @@ internal static List GenerateEventEnvoys(ErrorReporter errorReporter, FormInfo? subAllEventsForm = FormInfo.CreateFromForm(errorReporter, tdThing.Forms?.Elements?.FirstOrDefault(f => f.Value.Op?.Elements?.Any(e => e.Value.Value == TDValues.OpSubAllEvents) ?? false)?.Value, tdThing.SchemaDefinitions?.Entries); if (subAllEventsForm != null && subAllEventsForm.Format != SerializationFormat.None && subAllEventsForm.TopicPattern != null) { - typesToSerialize.Add(schemaNamer.AggregateEventSchema); - eventSpecs.Add(new EventSpec(schemaNamer, schemaNamer.AggregateEventName, schemaNamer.AggregateEventSchema)); + formattedTypesToSerialize[subAllEventsForm.Format].Add(schemaNamer.AggregateEventSchema); + eventSpecs.Add(new EventSpec(schemaNamer, schemaNamer.AggregateEventName, schemaNamer.AggregateEventSchema, subAllEventsForm.Format)); foreach (IEnvoyTemplateTransform transform in envoyFactory.GetEventTransforms(schemaNamer, tdThing.Id!.Value!.Value, serviceName, schemaNamer.AggregateEventName, schemaNamer.AggregateEventSchema, subAllEventsForm.Format, subAllEventsForm.ServiceGroupId, subAllEventsForm.TopicPattern)) { transforms[transform.FileName] = transform; diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EventSpec.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EventSpec.cs index 0d2edaa369..3c0babd651 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EventSpec.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EventSpec.cs @@ -4,12 +4,12 @@ public record EventSpec(CodeName Name, CodeName Sender, CodeName Receiver, ITypeName Schema) { - public EventSpec(SchemaNamer schemaNamer, string eventName, string schemaType) + public EventSpec(SchemaNamer schemaNamer, string eventName, string schemaType, SerializationFormat format) : this( new CodeName(eventName), - new CodeName(schemaNamer.GetEventSenderBinder(eventName)), - new CodeName(schemaNamer.GetEventReceiverBinder(eventName)), - new CodeName(schemaType)) + new CodeName(schemaNamer.GetEventSenderBinder(schemaType)), + new CodeName(schemaNamer.GetEventReceiverBinder(schemaType)), + EnvoyGeneratorSupport.GetTypeName(schemaType, format)) { } } diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/PropertyEnvoyGenerator.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/PropertyEnvoyGenerator.cs index 4ede35a54a..7d33678320 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/PropertyEnvoyGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/PropertyEnvoyGenerator.cs @@ -8,7 +8,7 @@ internal static class PropertyEnvoyGenerator { - internal static List GeneratePropertyEnvoys(ErrorReporter errorReporter, TDThing tdThing, SchemaNamer schemaNamer, CodeName serviceName, EnvoyTransformFactory envoyFactory, Dictionary transforms, Dictionary errorSpecs, Dictionary aggErrorSpecs, HashSet typesToSerialize) + internal static List GeneratePropertyEnvoys(ErrorReporter errorReporter, TDThing tdThing, SchemaNamer schemaNamer, CodeName serviceName, EnvoyTransformFactory envoyFactory, Dictionary transforms, Dictionary errorSpecs, Dictionary aggErrorSpecs, Dictionary> formattedTypesToSerialize) { List propertySpecs = new(); Dictionary readInnerErrors = new(); @@ -30,12 +30,12 @@ internal static List GeneratePropertyEnvoys(ErrorReporter errorRep string propSchema = schemaNamer.GetPropSchema(propKvp.Key); string? readRespSchema = null; - string? readErrorSchema = GetAndRecordError(propKvp.Key, readPropForm, schemaNamer, errorSpecs, typesToSerialize, readInnerErrors); + string? readErrorSchema = GetAndRecordError(propKvp.Key, readPropForm, schemaNamer, errorSpecs, formattedTypesToSerialize, readInnerErrors); if (readPropForm?.TopicPattern != null && readPropForm.Format != SerializationFormat.None) { readRespSchema = readPropForm.ErrorRespSchema != null ? schemaNamer.GetPropReadRespSchema(propKvp.Key) : propSchema; - typesToSerialize.Add(readRespSchema); - typesToSerialize.Add(propSchema); + formattedTypesToSerialize[readPropForm.Format].Add(readRespSchema); + formattedTypesToSerialize[readPropForm.Format].Add(propSchema); } string? writeReqSchema = null; @@ -46,16 +46,16 @@ internal static List GeneratePropertyEnvoys(ErrorReporter errorRep if (writePropForm?.TopicPattern != null && writePropForm.Format != SerializationFormat.None) { writeReqSchema = (property.Placeholder?.Value.Value ?? false) ? schemaNamer.GetWritablePropSchema(propKvp.Key) : propSchema; - typesToSerialize.Add(writeReqSchema); + formattedTypesToSerialize[writePropForm.Format].Add(writeReqSchema); if (writePropForm.HasErrorResponse) { writeRespSchema = schemaNamer.GetPropWriteRespSchema(propKvp.Key); - typesToSerialize.Add(writeRespSchema); + formattedTypesToSerialize[writePropForm.Format].Add(writeRespSchema); } } - writeErrorSchema = GetAndRecordError(propKvp.Key, writePropForm, schemaNamer, errorSpecs, typesToSerialize, writeInnerErrors); + writeErrorSchema = GetAndRecordError(propKvp.Key, writePropForm, schemaNamer, errorSpecs, formattedTypesToSerialize, writeInnerErrors); } if (readRespSchema != null || writeReqSchema != null) @@ -123,12 +123,12 @@ internal static List GeneratePropertyEnvoys(ErrorReporter errorRep { readAllRespSchema = readAllPropsForm.HasErrorResponse ? schemaNamer.AggregatePropReadRespSchema : schemaNamer.AggregatePropSchema; - typesToSerialize.Add(readAllRespSchema); + formattedTypesToSerialize[readAllPropsForm.Format].Add(readAllRespSchema); if (readAllPropsForm.HasErrorResponse) { - typesToSerialize.Add(schemaNamer.AggregatePropSchema); - typesToSerialize.Add(schemaNamer.AggregatePropReadErrSchema); + formattedTypesToSerialize[readAllPropsForm.Format].Add(schemaNamer.AggregatePropSchema); + formattedTypesToSerialize[readAllPropsForm.Format].Add(schemaNamer.AggregatePropReadErrSchema); aggErrorSpecs[schemaNamer.AggregatePropReadErrSchema] = new AggregateErrorSpec(schemaNamer.AggregatePropReadErrSchema, readInnerErrors); } } @@ -139,13 +139,13 @@ internal static List GeneratePropertyEnvoys(ErrorReporter errorRep if (writeMultPropsForm?.TopicPattern != null && writeMultPropsForm.Format != SerializationFormat.None) { writeMultiReqSchema = schemaNamer.AggregatePropWriteSchema; - typesToSerialize.Add(writeMultiReqSchema); + formattedTypesToSerialize[writeMultPropsForm.Format].Add(writeMultiReqSchema); if (writeMultPropsForm.HasErrorResponse) { writeMultiRespSchema = schemaNamer.AggregatePropWriteRespSchema; - typesToSerialize.Add(writeMultiRespSchema); - typesToSerialize.Add(schemaNamer.AggregatePropWriteErrSchema); + formattedTypesToSerialize[writeMultPropsForm.Format].Add(writeMultiRespSchema); + formattedTypesToSerialize[writeMultPropsForm.Format].Add(schemaNamer.AggregatePropWriteErrSchema); aggErrorSpecs[schemaNamer.AggregatePropWriteErrSchema] = new AggregateErrorSpec(schemaNamer.AggregatePropWriteErrSchema, writeInnerErrors); } } @@ -213,7 +213,7 @@ internal static List GeneratePropertyEnvoys(ErrorReporter errorRep return propertySpecs; } - private static string? GetAndRecordError(string propName, FormInfo? form, SchemaNamer schemaNamer, Dictionary errorSpecs, HashSet typesToSerialize, Dictionary innerErrors) + private static string? GetAndRecordError(string propName, FormInfo? form, SchemaNamer schemaNamer, Dictionary errorSpecs, Dictionary> formattedTypesToSerialize, Dictionary innerErrors) { if (form?.ErrorRespSchema == null) { @@ -221,7 +221,11 @@ internal static List GeneratePropertyEnvoys(ErrorReporter errorRep } string errSchemaName = schemaNamer.ChooseTitleOrName(form.ErrorRespSchema.Value.Title?.Value.Value, form.ErrorRespName)!; - typesToSerialize.Add(errSchemaName); + if (form.ErrorRespFormat != SerializationFormat.None) + { + formattedTypesToSerialize[form.ErrorRespFormat].Add(errSchemaName); + } + errorSpecs[errSchemaName] = new ErrorSpec( errSchemaName, form.ErrorRespSchema.Value.Description?.Value.Value ?? "The action could not be completed", diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/PropertySpec.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/PropertySpec.cs index 0f3da95930..268f1f837c 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/PropertySpec.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/PropertySpec.cs @@ -40,8 +40,8 @@ public PropertySpec( bool isAggregate) : this( new CodeName(propertyName), - new CodeName(schemaNamer.GetPropConsumerBinder(propertyName)), - new CodeName(schemaNamer.GetPropMaintainerBinder(propertyName)), + new CodeName(schemaNamer.GetPropConsumerBinder(propSchema)), + new CodeName(schemaNamer.GetPropMaintainerBinder(propSchema)), new CodeName(propSchema), readFormat.GetEmptyTypeName(), writeFormat.GetEmptyTypeName(), diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Service/t4/DotNetService.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Service/t4/DotNetService.tt index 85ba373449..086349d942 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Service/t4/DotNetService.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Service/t4/DotNetService.tt @@ -724,7 +724,7 @@ namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage. private bool IsLast(EventSpec telemEnvoyInfo) => telemEnvoyInfo.Name.AsGiven == this.eventSpec.Last().Name.AsGiven; - private string TelemMethodName(EventSpec telemEnvoyInfo, string prefix, string suffix = null) => (new CodeName()).GetMethodName(TargetLanguage.CSharp, "telemetry", suffix, prefix: prefix); + private string TelemMethodName(EventSpec telemEnvoyInfo, string prefix, string suffix = null) => ((telemEnvoyInfo.Schema is RawTypeName || telemEnvoyInfo.Schema is CustomTypeName) ? telemEnvoyInfo.Name : new CodeName()).GetMethodName(TargetLanguage.CSharp, "telemetry", suffix, prefix: prefix); private string GetInfoName(CodeName infoName) => infoName?.GetVariableName(TargetLanguage.CSharp) ?? "errorPayload"; diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandExecutor.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandExecutor.cs index c20012f845..45aecc2e10 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandExecutor.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandExecutor.cs @@ -15,7 +15,7 @@ public partial class RustCommandExecutor : IEnvoyTemplateTransform private readonly ITypeName? respSchema; private readonly List normalResultFields; private readonly List normalRequiredFields; - private readonly CodeName? normalResultSchema; + private readonly ITypeName? normalResultSchema; private readonly CodeName? errorResultName; private readonly CodeName? errorResultSchema; private readonly bool isIdempotent; @@ -33,7 +33,7 @@ public RustCommandExecutor( ITypeName? respSchema, List normalResultFields, List normalRequiredFields, - CodeName? normalResultSchema, + ITypeName? normalResultSchema, CodeName? errorResultName, CodeName? errorResultSchema, bool isIdempotent, diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandInvoker.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandInvoker.cs index 81df49d410..7b7e1070e1 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandInvoker.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandInvoker.cs @@ -15,7 +15,7 @@ public partial class RustCommandInvoker : IEnvoyTemplateTransform private readonly ITypeName? respSchema; private readonly List normalResultFields; private readonly List normalRequiredFields; - private readonly CodeName? normalResultSchema; + private readonly ITypeName? normalResultSchema; private readonly CodeName? errorResultName; private readonly CodeName? errorResultSchema; private readonly string topicPattern; @@ -32,7 +32,7 @@ public RustCommandInvoker( ITypeName? respSchema, List normalResultFields, List normalRequiredFields, - CodeName? normalResultSchema, + ITypeName? normalResultSchema, CodeName? errorResultName, CodeName? errorResultSchema, string topicPattern, diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/code/RustTelemetryReceiver.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/code/RustTelemetryReceiver.cs index b0a42c6c69..534cb99140 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/code/RustTelemetryReceiver.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/code/RustTelemetryReceiver.cs @@ -15,14 +15,14 @@ public partial class RustTelemetryReceiver : IEnvoyTemplateTransform private readonly string topicPattern; private readonly string srcSubdir; - public RustTelemetryReceiver(string telemetryName, string componentName, CodeName genNamespace, string modelId, ITypeName schemaType, string? serviceGroupId, string topicPattern, string srcSubdir) + public RustTelemetryReceiver(string telemetryName, string componentName, CodeName genNamespace, string modelId, ITypeName schemaType, string? serviceGroupId, string topicPattern, string messageStub, string srcSubdir) { this.telemetryName = new CodeName(telemetryName); this.componentName = new CodeName(componentName); this.genNamespace = genNamespace; this.modelId = modelId; this.schemaType = schemaType; - this.messageName = new CodeName(this.telemetryName, "message"); + this.messageName = new CodeName(messageStub, "message"); this.serviceGroupId = serviceGroupId; this.topicPattern = topicPattern; this.srcSubdir = srcSubdir; diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/code/RustTelemetrySender.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/code/RustTelemetrySender.cs index 5184f66ec4..efb61e217c 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/code/RustTelemetrySender.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/code/RustTelemetrySender.cs @@ -14,7 +14,7 @@ public partial class RustTelemetrySender : IEnvoyTemplateTransform private readonly CodeName messageName; private readonly string srcSubdir; - public RustTelemetrySender(string telemetryName, string componentName, CodeName genNamespace, string modelId, ITypeName schemaType, string topicPattern, string srcSubdir) + public RustTelemetrySender(string telemetryName, string componentName, CodeName genNamespace, string modelId, ITypeName schemaType, string topicPattern, string messageStub, string srcSubdir) { this.telemetryName = new CodeName(telemetryName); this.componentName = new CodeName(componentName); @@ -22,7 +22,7 @@ public RustTelemetrySender(string telemetryName, string componentName, CodeName this.modelId = modelId; this.schemaType = schemaType; this.topicPattern = topicPattern; - this.messageName = new CodeName(this.telemetryName, "message"); + this.messageName = new CodeName(messageStub, "message"); this.srcSubdir = srcSubdir; } diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/code/RustCargoToml.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/code/RustCargoToml.cs index 539051e047..066d17d428 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/code/RustCargoToml.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/code/RustCargoToml.cs @@ -9,6 +9,8 @@ public partial class RustCargoToml : IEnvoyTemplateTransform internal static readonly Dictionary> serializerPackageVersions = new() { { SerializationFormat.Json, new List<(string, string)> { ("serde_json", "1.0.105") } }, + { SerializationFormat.Raw, new List<(string, string)> { } }, + { SerializationFormat.Custom, new List<(string, string)> { } }, }; private readonly bool generateProject; diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs index c43b028290..838f2d0d26 100644 --- a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs @@ -46,7 +46,7 @@ public static int GenerateCode(OptionContainer options) ErrorLog errorLog = new(options.WorkingDir.FullName); - List parsedThings = ParseThings(options.ThingFiles, errorLog); + List parsedThings = ParseThings(options.ThingFiles, errorLog, out HashSet serializationFormats); if (errorLog.HasErrors) { @@ -107,9 +107,11 @@ public static int GenerateCode(OptionContainer options) string? sdkPath = options.SdkPath != null ? Path.GetRelativePath(options.OutputDir.FullName, options.SdkPath) : null; + serializationFormats.UnionWith(generatedSchemas.Keys); + List generatedEnvoys = EnvoyGenerator.GenerateEnvoys( parsedThings, - generatedSchemas.Keys.ToList(), + serializationFormats.ToList(), targetLanguage, options.GenNamespace, projectName, @@ -172,9 +174,10 @@ private static void RunCargo(string args, bool display) } } - private static List ParseThings(FileInfo[] thingFiles, ErrorLog errorLog) + private static List ParseThings(FileInfo[] thingFiles, ErrorLog errorLog, out HashSet serializationFormats) { List parsedThings = new(); + serializationFormats = new HashSet(); foreach (FileInfo thingFile in thingFiles) { @@ -192,7 +195,7 @@ private static List ParseThings(FileInfo[] thingFiles, ErrorLog err int thingCount = 0; foreach (TDThing thing in things) { - if (thingValidator.TryValidateThng(thing)) + if (thingValidator.TryValidateThng(thing, serializationFormats)) { ValueTracker? schemaNamesFilename = thing.Links?.Elements?.FirstOrDefault(l => l.Value.Rel?.Value.Value == TDValues.RelationSchemaNaming)?.Value.Href; if (TryGetSchemaNamer(errorReporter, thingFile.DirectoryName!, schemaNamesFilename, out SchemaNamer? schemaNamer)) diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs index 9822aaca26..2463dc0f4b 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs @@ -54,7 +54,7 @@ private static void ProcessAction( schemaSpecs[inputSchemaName] = new AliasSpec(null, InputOutputType, inputRef.Value.Value, actionForm.Format, inputSchemaName, dirName, TokenIndex: -1); errorReporter.RegisterTypedReferenceFromThing(inputRef.TokenIndex, InputOutputType, inputRef.Value.Value); } - else if (tdAction.Input?.Value != null) + else if (tdAction.Input?.Value != null && tdAction.Input.Value.Type?.Value.Value != TDValues.TypeNull) { string inputSchemaName = schemaNamer.GetActionInSchema(tdAction.Input.Value, actionName); ObjectSpec inputObjectSpec = ObjectSpec.CreateFromDataSchema(errorReporter, schemaNamer, tdAction.Input, actionForm.Format, inputSchemaName, tdAction.Input.Value.Description?.Value.Value ?? $"Input arguments for action '{actionName}'"); @@ -69,7 +69,7 @@ private static void ProcessAction( schemaSpecs[outputSchemaName] = new AliasSpec(null, InputOutputType, outputRef.Value.Value, actionForm.Format, outputSchemaName, dirName, TokenIndex: -1); errorReporter.RegisterTypedReferenceFromThing(outputRef.TokenIndex, InputOutputType, outputRef.Value.Value); } - else if (tdAction.Output?.Value != null) + else if (tdAction.Output?.Value != null && tdAction.Output.Value.Type?.Value.Value != TDValues.TypeNull) { string outputSchemaName = schemaNamer.GetActionOutSchema(tdAction.Output.Value, actionName); ObjectSpec outputObjectSpec = ObjectSpec.CreateFromDataSchema(errorReporter, schemaNamer, tdAction.Output, actionForm.Format, outputSchemaName, tdAction.Output.Value.Description?.Value.Value ?? $"Output arguments for action '{actionName}'"); diff --git a/codegen2/src/Dtdl2Wot/Command/t4/CommandAffordance.cs b/codegen2/src/Dtdl2Wot/Command/t4/CommandAffordance.cs index ad886cfb6e..eb9cf3877a 100644 --- a/codegen2/src/Dtdl2Wot/Command/t4/CommandAffordance.cs +++ b/codegen2/src/Dtdl2Wot/Command/t4/CommandAffordance.cs @@ -74,7 +74,7 @@ public virtual string TransformText() } this.Write(" },\r\n"); } else { - this.Write(" \"input\": {},\r\n"); + this.Write(" \"input\": {\r\n \"type\": \"null\"\r\n },\r\n"); } } if (this.dtCommand.Response != null) { @@ -121,7 +121,7 @@ public virtual string TransformText() } this.Write(" },\r\n"); } else { - this.Write(" \"output\": {},\r\n"); + this.Write(" \"output\": {\r\n \"type\": \"null\"\r\n },\r\n"); } } if (this.isCommandIdempotent) { diff --git a/codegen2/src/Dtdl2Wot/Command/t4/CommandAffordance.tt b/codegen2/src/Dtdl2Wot/Command/t4/CommandAffordance.tt index 8d7a0809ad..24304b40c4 100644 --- a/codegen2/src/Dtdl2Wot/Command/t4/CommandAffordance.tt +++ b/codegen2/src/Dtdl2Wot/Command/t4/CommandAffordance.tt @@ -36,7 +36,9 @@ <# } #> }, <# } else { #> - "input": {}, + "input": { + "type": "null" + }, <# } #> <# } #> <# if (this.dtCommand.Response != null) { #> @@ -70,7 +72,9 @@ <# } #> }, <# } else { #> - "output": {}, + "output": { + "type": "null" + }, <# } #> <# } #> <# if (this.isCommandIdempotent) { #> diff --git a/codegen2/src/Dtdl2Wot/Dtdl2Wot.csproj b/codegen2/src/Dtdl2Wot/Dtdl2Wot.csproj index 6b7626ea24..8fc14c3bd1 100644 --- a/codegen2/src/Dtdl2Wot/Dtdl2Wot.csproj +++ b/codegen2/src/Dtdl2Wot/Dtdl2Wot.csproj @@ -41,6 +41,11 @@ True MapThingSchema.tt + + True + True + PlaceholderThingSchema.tt + True True @@ -84,6 +89,11 @@ MapThingSchema.cs Dtdl2Wot + + TextTemplatingFilePreprocessor + PlaceholderThingSchema.cs + Dtdl2Wot + TextTemplatingFilePreprocessor ObjectThingSchema.cs diff --git a/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs b/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs index 16e3084aba..0cced8531e 100644 --- a/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs +++ b/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs @@ -45,10 +45,7 @@ public InterfaceThing(IReadOnlyDictionary modelDict, Dtmi in this.contentType = payloadFormat switch { PayloadFormat.Avro => "application/avro", - PayloadFormat.Cbor => "application/cbor", PayloadFormat.Json => "application/json", - PayloadFormat.Proto2 => "application/protobuf", - PayloadFormat.Proto3 => "application/protobuf", PayloadFormat.Raw => "application/octet-stream", PayloadFormat.Custom => "", _ => throw new InvalidOperationException($"InvalidOperationException \"{payloadFormat}\" not recognized"), diff --git a/codegen2/src/Dtdl2Wot/Map/code/PlaceholderThingSchema.cs b/codegen2/src/Dtdl2Wot/Map/code/PlaceholderThingSchema.cs new file mode 100644 index 0000000000..62cac3b2d4 --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Map/code/PlaceholderThingSchema.cs @@ -0,0 +1,22 @@ +namespace Dtdl2Wot +{ + using DTDLParser.Models; + + public partial class PlaceholderThingSchema : ITemplateTransform + { + private readonly DTMapInfo dtMap; + private readonly int indent; + private readonly ThingDescriber thingDescriber; + + public PlaceholderThingSchema(DTMapInfo dtMap, int indent, ThingDescriber thingDescriber) + { + this.dtMap = dtMap; + this.indent = indent; + this.thingDescriber = thingDescriber; + } + + public string FileName { get => string.Empty; } + + public string FolderPath { get => string.Empty; } + } +} diff --git a/codegen2/src/Dtdl2Wot/Map/t4/PlaceholderThingSchema.cs b/codegen2/src/Dtdl2Wot/Map/t4/PlaceholderThingSchema.cs new file mode 100644 index 0000000000..0bba3c849f --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Map/t4/PlaceholderThingSchema.cs @@ -0,0 +1,307 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 17.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Dtdl2Wot +{ + using System.Collections.Generic; + using System.Linq; + using DTDLParser.Models; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] + public partial class PlaceholderThingSchema : PlaceholderThingSchemaBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.PushIndent(new string(' ', this.indent)); + this.Write("\"dtv:placeholder\": true,\r\n"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.dtMap.MapValue.Schema, 0))); + this.PopIndent(); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] + public class PlaceholderThingSchemaBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Dtdl2Wot/Map/t4/PlaceholderThingSchema.tt b/codegen2/src/Dtdl2Wot/Map/t4/PlaceholderThingSchema.tt new file mode 100644 index 0000000000..8c5834f95b --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Map/t4/PlaceholderThingSchema.tt @@ -0,0 +1,7 @@ +<#@ template language="C#" linePragmas="false" #> +<#@ import namespace="System.Collections.Generic" #> +<#@ import namespace="System.Linq" #> +<#@ import namespace="DTDLParser.Models" #> +<# this.PushIndent(new string(' ', this.indent)); #> +"dtv:placeholder": true, +<#=this.thingDescriber.GetTypeAndAddenda(this.dtMap.MapValue.Schema, 0)#><# this.PopIndent(); #> diff --git a/codegen2/src/Dtdl2Wot/PayloadFormat.cs b/codegen2/src/Dtdl2Wot/PayloadFormat.cs index cf7f22074d..22365dcaa1 100644 --- a/codegen2/src/Dtdl2Wot/PayloadFormat.cs +++ b/codegen2/src/Dtdl2Wot/PayloadFormat.cs @@ -9,14 +9,8 @@ public static class PayloadFormat { public const string Avro = "Avro/1.11.0"; - public const string Cbor = "Cbor/rfc/8949"; - public const string Json = "Json/ecma/404"; - public const string Proto2 = "Protobuf/2"; - - public const string Proto3 = "Protobuf/3"; - public const string Raw = "raw/0"; public const string Custom = "custom/0"; @@ -25,10 +19,7 @@ public static string Itemize(string separator, string mark) => string.Join(separator, new string[] { Avro, - Cbor, Json, - Proto2, - Proto3, Raw, Custom, }.Select(s => $"{mark}{s}{mark}")); diff --git a/codegen2/src/Dtdl2Wot/Property/code/PropertyAffordance.cs b/codegen2/src/Dtdl2Wot/Property/code/PropertyAffordance.cs index 753cccd1c2..e6ab307f7e 100644 --- a/codegen2/src/Dtdl2Wot/Property/code/PropertyAffordance.cs +++ b/codegen2/src/Dtdl2Wot/Property/code/PropertyAffordance.cs @@ -16,6 +16,7 @@ public partial class PropertyAffordance : ITemplateTransform private readonly DTSchemaInfo? valueSchema; private readonly string? readErrorSchemaName; private readonly string? writeErrorSchemaName; + private readonly bool isSchemaFragmented; private readonly ThingDescriber thingDescriber; public PropertyAffordance(DTPropertyInfo dtProperty, int mqttVersion, bool usesTypes, string contentType, string propertyTopic, ThingDescriber thingDescriber) @@ -36,6 +37,9 @@ public PropertyAffordance(DTPropertyInfo dtProperty, int mqttVersion, bool usesT this.readErrorSchemaName = readErrorField != null ? new CodeName(readErrorField.Schema.Id).AsGiven : null; this.writeErrorSchemaName = writeErrorField != null ? new CodeName(writeErrorField.Schema.Id).AsGiven : null; + DTEntityInfo? fragCarrier = isSchemaPropertyResult ? valueField : dtProperty; + this.isSchemaFragmented = fragCarrier?.SupplementalTypes.Contains(new Dtmi(string.Format(DtdlMqttExtensionValues.FragmentedAdjunctTypeFormat, mqttVersion))) ?? false; + this.thingDescriber = thingDescriber; } diff --git a/codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.cs b/codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.cs index 1decb60b46..4b669b6aae 100644 --- a/codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.cs +++ b/codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.cs @@ -35,7 +35,7 @@ public virtual string TransformText() this.Write("\",\r\n"); } if (this.usesTypes) { - this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.valueSchema, 6))); + this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.valueSchema, 6, this.isSchemaFragmented))); this.Write(",\r\n \"readOnly\": "); this.Write(this.ToStringHelper.ToStringWithCulture(this.dtProperty.Writable ? "false" : "true")); this.Write(",\r\n"); diff --git a/codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.tt b/codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.tt index 1c45c39020..c0b1d2976b 100644 --- a/codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.tt +++ b/codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.tt @@ -8,7 +8,7 @@ "description": "<#=this.dtProperty.Description.First().Value#>", <# } #> <# if (this.usesTypes) { #> -<#=this.thingDescriber.GetTypeAndAddenda(this.valueSchema, 6)#>, +<#=this.thingDescriber.GetTypeAndAddenda(this.valueSchema, 6, this.isSchemaFragmented)#>, "readOnly": <#=this.dtProperty.Writable ? "false" : "true"#>, <# } #> "forms": [ diff --git a/codegen2/src/Dtdl2Wot/Telemetry/t4/TelemetryAffordance.cs b/codegen2/src/Dtdl2Wot/Telemetry/t4/TelemetryAffordance.cs index b4bf711bc8..15fc1a1cd4 100644 --- a/codegen2/src/Dtdl2Wot/Telemetry/t4/TelemetryAffordance.cs +++ b/codegen2/src/Dtdl2Wot/Telemetry/t4/TelemetryAffordance.cs @@ -39,7 +39,7 @@ public virtual string TransformText() this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.dtTelemetry.Schema, 8))); this.Write("\r\n },\r\n"); } else { - this.Write(" \"data\": {},\r\n"); + this.Write(" \"data\": {\r\n \"type\": \"null\"\r\n },\r\n"); } this.Write(" \"forms\": [\r\n {\r\n \"href\": \""); this.Write(this.ToStringHelper.ToStringWithCulture(this.dtTelemetry.Id)); diff --git a/codegen2/src/Dtdl2Wot/Telemetry/t4/TelemetryAffordance.tt b/codegen2/src/Dtdl2Wot/Telemetry/t4/TelemetryAffordance.tt index a43c36545b..5bff6298bf 100644 --- a/codegen2/src/Dtdl2Wot/Telemetry/t4/TelemetryAffordance.tt +++ b/codegen2/src/Dtdl2Wot/Telemetry/t4/TelemetryAffordance.tt @@ -12,7 +12,9 @@ <#=this.thingDescriber.GetTypeAndAddenda(this.dtTelemetry.Schema, 8)#> }, <# } else { #> - "data": {}, + "data": { + "type": "null" + }, <# } #> "forms": [ { diff --git a/codegen2/src/Dtdl2Wot/ThingDescriber.cs b/codegen2/src/Dtdl2Wot/ThingDescriber.cs index d06d1f7e12..bb5bc75a59 100644 --- a/codegen2/src/Dtdl2Wot/ThingDescriber.cs +++ b/codegen2/src/Dtdl2Wot/ThingDescriber.cs @@ -16,29 +16,29 @@ public ThingDescriber(int mqttVersion) this.ancestralSchemaIds = new HashSet(); } - public string GetTypeAndAddenda(DTSchemaInfo dtSchema, int indent) + public string GetTypeAndAddenda(DTSchemaInfo dtSchema, int indent, bool isFragmented = false) { if (dtSchema.EntityKind == DTEntityKind.Object) { - var templateTransform = new ObjectThingSchema((DTObjectInfo)dtSchema, indent, this.mqttVersion, this); + ITemplateTransform templateTransform = new ObjectThingSchema((DTObjectInfo)dtSchema, indent, this.mqttVersion, this); return this.GetTransformedText(templateTransform, dtSchema.Id); } if (dtSchema.EntityKind == DTEntityKind.Enum) { - var templateTransform = new EnumThingSchema((DTEnumInfo)dtSchema, indent); + ITemplateTransform templateTransform = new EnumThingSchema((DTEnumInfo)dtSchema, indent); return this.GetTransformedText(templateTransform, dtSchema.Id); } if (dtSchema.EntityKind == DTEntityKind.Array) { - var templateTransform = new ArrayThingSchema((DTArrayInfo)dtSchema, indent, this); + ITemplateTransform templateTransform = new ArrayThingSchema((DTArrayInfo)dtSchema, indent, this); return this.GetTransformedText(templateTransform, dtSchema.Id); } if (dtSchema.EntityKind == DTEntityKind.Map) { - var templateTransform = new MapThingSchema((DTMapInfo)dtSchema, indent, this); + ITemplateTransform templateTransform = isFragmented ? new PlaceholderThingSchema((DTMapInfo)dtSchema, indent, this) : new MapThingSchema((DTMapInfo)dtSchema, indent, this); return this.GetTransformedText(templateTransform, dtSchema.Id); } @@ -72,19 +72,19 @@ public string GetTypeAndAddenda(DTSchemaInfo dtSchema, int indent) public string GetCommandAffordance(DTCommandInfo dtCommand, bool usesTypes, string contentType, string commandTopic, string serviceGroupId) { - var templateTransform = new CommandAffordance(dtCommand, this.mqttVersion, usesTypes, contentType, commandTopic, serviceGroupId, this); + ITemplateTransform templateTransform = new CommandAffordance(dtCommand, this.mqttVersion, usesTypes, contentType, commandTopic, serviceGroupId, this); return templateTransform.TransformText(); } public string GetPropertyAffordance(DTPropertyInfo dtProperty, bool usesTypes, string contentType, string propertyTopic) { - var templateTransform = new PropertyAffordance(dtProperty, this.mqttVersion, usesTypes, contentType, propertyTopic, this); + ITemplateTransform templateTransform = new PropertyAffordance(dtProperty, this.mqttVersion, usesTypes, contentType, propertyTopic, this); return templateTransform.TransformText(); } public string GetTelemetryAffordance(DTTelemetryInfo dtTelemetry, bool usesTypes, string contentType, string telemetryTopic, string serviceGroupId) { - var templateTransform = new TelemetryAffordance(dtTelemetry, usesTypes, contentType, telemetryTopic, serviceGroupId, this); + ITemplateTransform templateTransform = new TelemetryAffordance(dtTelemetry, usesTypes, contentType, telemetryTopic, serviceGroupId, this); return templateTransform.TransformText(); } From 119e17edd4ab5233d3f9e68d7308ad7cc0e58f56 Mon Sep 17 00:00:00 2001 From: Auto Gen Date: Wed, 17 Dec 2025 08:57:49 -0800 Subject: [PATCH 22/52] remove generated T4 .cs files --- .../src/Dtdl2Wot/Array/t4/ArrayThingSchema.cs | 313 ------------ .../Dtdl2Wot/Command/t4/CommandAffordance.cs | 446 ----------------- .../src/Dtdl2Wot/Enum/t4/EnumThingSchema.cs | 321 ------------- .../Dtdl2Wot/Interface/t4/InterfaceThing.cs | 451 ------------------ .../src/Dtdl2Wot/Map/t4/MapThingSchema.cs | 313 ------------ .../Dtdl2Wot/Map/t4/PlaceholderThingSchema.cs | 307 ------------ .../Dtdl2Wot/Object/t4/ObjectThingSchema.cs | 343 ------------- .../Property/t4/PropertyAffordance.cs | 355 -------------- .../Telemetry/t4/TelemetryAffordance.cs | 335 ------------- 9 files changed, 3184 deletions(-) delete mode 100644 codegen2/src/Dtdl2Wot/Array/t4/ArrayThingSchema.cs delete mode 100644 codegen2/src/Dtdl2Wot/Command/t4/CommandAffordance.cs delete mode 100644 codegen2/src/Dtdl2Wot/Enum/t4/EnumThingSchema.cs delete mode 100644 codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.cs delete mode 100644 codegen2/src/Dtdl2Wot/Map/t4/MapThingSchema.cs delete mode 100644 codegen2/src/Dtdl2Wot/Map/t4/PlaceholderThingSchema.cs delete mode 100644 codegen2/src/Dtdl2Wot/Object/t4/ObjectThingSchema.cs delete mode 100644 codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.cs delete mode 100644 codegen2/src/Dtdl2Wot/Telemetry/t4/TelemetryAffordance.cs diff --git a/codegen2/src/Dtdl2Wot/Array/t4/ArrayThingSchema.cs b/codegen2/src/Dtdl2Wot/Array/t4/ArrayThingSchema.cs deleted file mode 100644 index 3358d99d47..0000000000 --- a/codegen2/src/Dtdl2Wot/Array/t4/ArrayThingSchema.cs +++ /dev/null @@ -1,313 +0,0 @@ -// ------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version: 17.0.0.0 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ -namespace Dtdl2Wot -{ - using System.Collections.Generic; - using System.Linq; - using DTDLParser.Models; - using System; - - /// - /// Class to produce the template output - /// - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] - public partial class ArrayThingSchema : ArrayThingSchemaBase - { - /// - /// Create the template output - /// - public virtual string TransformText() - { - this.PushIndent(new string(' ', this.indent)); - this.Write("\"type\": \"array\",\r\n\"items\": {\r\n"); - if (this.dtArray.Description.Any()) { - this.Write(" \"description\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.dtArray.Description.First().Value)); - this.Write("\",\r\n"); - } - this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.dtArray.ElementSchema, 2))); - this.Write("\r\n}"); - this.PopIndent(); - return this.GenerationEnvironment.ToString(); - } - } - #region Base class - /// - /// Base class for this transformation - /// - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] - public class ArrayThingSchemaBase - { - #region Fields - private global::System.Text.StringBuilder generationEnvironmentField; - private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; - private global::System.Collections.Generic.List indentLengthsField; - private string currentIndentField = ""; - private bool endsWithNewline; - private global::System.Collections.Generic.IDictionary sessionField; - #endregion - #region Properties - /// - /// The string builder that generation-time code is using to assemble generated output - /// - public System.Text.StringBuilder GenerationEnvironment - { - get - { - if ((this.generationEnvironmentField == null)) - { - this.generationEnvironmentField = new global::System.Text.StringBuilder(); - } - return this.generationEnvironmentField; - } - set - { - this.generationEnvironmentField = value; - } - } - /// - /// The error collection for the generation process - /// - public System.CodeDom.Compiler.CompilerErrorCollection Errors - { - get - { - if ((this.errorsField == null)) - { - this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); - } - return this.errorsField; - } - } - /// - /// A list of the lengths of each indent that was added with PushIndent - /// - private System.Collections.Generic.List indentLengths - { - get - { - if ((this.indentLengthsField == null)) - { - this.indentLengthsField = new global::System.Collections.Generic.List(); - } - return this.indentLengthsField; - } - } - /// - /// Gets the current indent we use when adding lines to the output - /// - public string CurrentIndent - { - get - { - return this.currentIndentField; - } - } - /// - /// Current transformation session - /// - public virtual global::System.Collections.Generic.IDictionary Session - { - get - { - return this.sessionField; - } - set - { - this.sessionField = value; - } - } - #endregion - #region Transform-time helpers - /// - /// Write text directly into the generated output - /// - public void Write(string textToAppend) - { - if (string.IsNullOrEmpty(textToAppend)) - { - return; - } - // If we're starting off, or if the previous text ended with a newline, - // we have to append the current indent first. - if (((this.GenerationEnvironment.Length == 0) - || this.endsWithNewline)) - { - this.GenerationEnvironment.Append(this.currentIndentField); - this.endsWithNewline = false; - } - // Check if the current text ends with a newline - if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) - { - this.endsWithNewline = true; - } - // This is an optimization. If the current indent is "", then we don't have to do any - // of the more complex stuff further down. - if ((this.currentIndentField.Length == 0)) - { - this.GenerationEnvironment.Append(textToAppend); - return; - } - // Everywhere there is a newline in the text, add an indent after it - textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); - // If the text ends with a newline, then we should strip off the indent added at the very end - // because the appropriate indent will be added when the next time Write() is called - if (this.endsWithNewline) - { - this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); - } - else - { - this.GenerationEnvironment.Append(textToAppend); - } - } - /// - /// Write text directly into the generated output - /// - public void WriteLine(string textToAppend) - { - this.Write(textToAppend); - this.GenerationEnvironment.AppendLine(); - this.endsWithNewline = true; - } - /// - /// Write formatted text directly into the generated output - /// - public void Write(string format, params object[] args) - { - this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); - } - /// - /// Write formatted text directly into the generated output - /// - public void WriteLine(string format, params object[] args) - { - this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); - } - /// - /// Raise an error - /// - public void Error(string message) - { - System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); - error.ErrorText = message; - this.Errors.Add(error); - } - /// - /// Raise a warning - /// - public void Warning(string message) - { - System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); - error.ErrorText = message; - error.IsWarning = true; - this.Errors.Add(error); - } - /// - /// Increase the indent - /// - public void PushIndent(string indent) - { - if ((indent == null)) - { - throw new global::System.ArgumentNullException("indent"); - } - this.currentIndentField = (this.currentIndentField + indent); - this.indentLengths.Add(indent.Length); - } - /// - /// Remove the last indent that was added with PushIndent - /// - public string PopIndent() - { - string returnValue = ""; - if ((this.indentLengths.Count > 0)) - { - int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; - this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); - if ((indentLength > 0)) - { - returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); - this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); - } - } - return returnValue; - } - /// - /// Remove any indentation - /// - public void ClearIndent() - { - this.indentLengths.Clear(); - this.currentIndentField = ""; - } - #endregion - #region ToString Helpers - /// - /// Utility class to produce culture-oriented representation of an object as a string. - /// - public class ToStringInstanceHelper - { - private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; - /// - /// Gets or sets format provider to be used by ToStringWithCulture method. - /// - public System.IFormatProvider FormatProvider - { - get - { - return this.formatProviderField ; - } - set - { - if ((value != null)) - { - this.formatProviderField = value; - } - } - } - /// - /// This is called from the compile/run appdomain to convert objects within an expression block to a string - /// - public string ToStringWithCulture(object objectToConvert) - { - if ((objectToConvert == null)) - { - throw new global::System.ArgumentNullException("objectToConvert"); - } - System.Type t = objectToConvert.GetType(); - System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { - typeof(System.IFormatProvider)}); - if ((method == null)) - { - return objectToConvert.ToString(); - } - else - { - return ((string)(method.Invoke(objectToConvert, new object[] { - this.formatProviderField }))); - } - } - } - private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); - /// - /// Helper to produce culture-oriented representation of an object as a string - /// - public ToStringInstanceHelper ToStringHelper - { - get - { - return this.toStringHelperField; - } - } - #endregion - } - #endregion -} diff --git a/codegen2/src/Dtdl2Wot/Command/t4/CommandAffordance.cs b/codegen2/src/Dtdl2Wot/Command/t4/CommandAffordance.cs deleted file mode 100644 index eb9cf3877a..0000000000 --- a/codegen2/src/Dtdl2Wot/Command/t4/CommandAffordance.cs +++ /dev/null @@ -1,446 +0,0 @@ -// ------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version: 17.0.0.0 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ -namespace Dtdl2Wot -{ - using System.Collections.Generic; - using System.Linq; - using DTDLParser; - using DTDLParser.Models; - using System; - - /// - /// Class to produce the template output - /// - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] - public partial class CommandAffordance : CommandAffordanceBase - { - /// - /// Create the template output - /// - public virtual string TransformText() - { - this.Write(" \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Name)); - this.Write("\": {\r\n"); - if (this.dtCommand.Description.Any()) { - this.Write(" \"description\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Description.First().Value)); - this.Write("\",\r\n"); - } - if (this.dtCommand.Request != null) { - if (this.usesTypes) { - this.Write(" \"input\": {\r\n"); - if (this.isRequestTransparent) { - if (this.dtCommand.Request.Description.Any()) { - this.Write(" \"description\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Request.Description.First().Value)); - this.Write("\",\r\n"); - } else if (this.dtCommand.Request.Schema.Description.Any()) { - this.Write(" \"description\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Request.Schema.Description.First().Value)); - this.Write("\",\r\n"); - } - this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.dtCommand.Request.Schema, 8))); - this.Write("\r\n"); - } else { - if (this.dtCommand.Request.Description.Any()) { - this.Write(" \"description\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Request.Description.First().Value)); - this.Write("\",\r\n"); - } - this.Write(" \"type\": \"object\",\r\n"); - if (!this.dtCommand.Request.Nullable) { - this.Write(" \"required\": [ \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Request.Name)); - this.Write("\" ],\r\n"); - } - this.Write(" \"properties\": {\r\n \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Request.Name)); - this.Write("\": {\r\n"); - if (!this.dtCommand.Request.Schema.Id.AbsoluteUri.StartsWith("dtmi:dtdl:instance:Schema:") && this.dtCommand.Request.Schema.Description.Any()) { - this.Write(" \"description\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Request.Schema.Description.First().Value)); - this.Write("\",\r\n"); - } - this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.dtCommand.Request.Schema, 12))); - this.Write("\r\n }\r\n }\r\n"); - } - this.Write(" },\r\n"); - } else { - this.Write(" \"input\": {\r\n \"type\": \"null\"\r\n },\r\n"); - } - } - if (this.dtCommand.Response != null) { - if (this.usesTypes) { - this.Write(" \"output\": {\r\n"); - if (this.isResponseTransparent) { - if (this.dtCommand.Response.Description.Any()) { - this.Write(" \"description\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Response.Description.First().Value)); - this.Write("\",\r\n"); - } else if (this.dtCommand.Response.Schema.Description.Any()) { - this.Write(" \"description\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Response.Schema.Description.First().Value)); - this.Write("\",\r\n"); - } - this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.dtCommand.Response.Schema, 8))); - this.Write("\r\n"); - } else { - if (this.dtCommand.Response.Description.Any()) { - this.Write(" \"description\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Response.Description.First().Value)); - this.Write("\",\r\n"); - } - this.Write(" \"type\": \"object\",\r\n"); - if (!this.dtCommand.Response.Nullable) { - this.Write(" \"required\": [ \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.responseName)); - this.Write("\" ],\r\n"); - } - this.Write(" \"properties\": {\r\n \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.responseName)); - this.Write("\": {\r\n"); - if (this.responseDescription?.Any() ?? false) { - this.Write(" \"description\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.responseDescription.First().Value)); - this.Write("\",\r\n"); - } else if (!this.responseSchema.Id.AbsoluteUri.StartsWith("dtmi:dtdl:instance:Schema:") && this.responseSchema.Description.Any()) { - this.Write(" \"description\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.responseSchema.Description.First().Value)); - this.Write("\",\r\n"); - } - this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.responseSchema, 12))); - this.Write("\r\n }\r\n }\r\n"); - } - this.Write(" },\r\n"); - } else { - this.Write(" \"output\": {\r\n \"type\": \"null\"\r\n },\r\n"); - } - } - if (this.isCommandIdempotent) { - this.Write(" \"idempotent\": true,\r\n"); - } - if (this.isCommandCacheable) { - this.Write(" \"safe\": true,\r\n"); - } - this.Write(" \"forms\": [\r\n {\r\n \"href\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Id)); - this.Write("\",\r\n \"contentType\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.contentType)); - this.Write("\",\r\n"); - if (this.isResponseSchemaResult) { - if (this.errorSchemaName != null) { - this.Write(" \"additionalResponses\": [\r\n {\r\n \"success\": false" + - ",\r\n \"schema\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.errorSchemaName)); - this.Write("\"\r\n }\r\n ],\r\n"); - } - if (this.infoSchemaName != null) { - this.Write(" \"dtv:headerInfo\": [\r\n {\r\n \"contentType\": \"appli" + - "cation/json\",\r\n \"schema\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.infoSchemaName)); - this.Write("\"\r\n }\r\n ],\r\n"); - } - if (this.codeEnumeration.Count > 0) { - this.Write(" \"dtv:headerCode\": [\r\n"); - int ix = 1; foreach (KeyValuePair kvp in this.codeEnumeration) { - this.Write(" \""); - this.Write(this.ToStringHelper.ToStringWithCulture(kvp.Key)); - this.Write("\""); - this.Write(this.ToStringHelper.ToStringWithCulture(ix < this.codeEnumeration.Count ? "," : "")); - this.Write("\r\n"); - ix++; } - this.Write(" ],\r\n"); - } - } - if (this.serviceGroupId != null) { - this.Write(" \"dtv:serviceGroupId\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.serviceGroupId)); - this.Write("\",\r\n"); - } - this.Write(" \"dtv:topic\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.commandTopic ?? "")); - this.Write("\",\r\n \"op\": \"invokeaction\"\r\n }\r\n ]\r\n }"); - return this.GenerationEnvironment.ToString(); - } - } - #region Base class - /// - /// Base class for this transformation - /// - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] - public class CommandAffordanceBase - { - #region Fields - private global::System.Text.StringBuilder generationEnvironmentField; - private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; - private global::System.Collections.Generic.List indentLengthsField; - private string currentIndentField = ""; - private bool endsWithNewline; - private global::System.Collections.Generic.IDictionary sessionField; - #endregion - #region Properties - /// - /// The string builder that generation-time code is using to assemble generated output - /// - public System.Text.StringBuilder GenerationEnvironment - { - get - { - if ((this.generationEnvironmentField == null)) - { - this.generationEnvironmentField = new global::System.Text.StringBuilder(); - } - return this.generationEnvironmentField; - } - set - { - this.generationEnvironmentField = value; - } - } - /// - /// The error collection for the generation process - /// - public System.CodeDom.Compiler.CompilerErrorCollection Errors - { - get - { - if ((this.errorsField == null)) - { - this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); - } - return this.errorsField; - } - } - /// - /// A list of the lengths of each indent that was added with PushIndent - /// - private System.Collections.Generic.List indentLengths - { - get - { - if ((this.indentLengthsField == null)) - { - this.indentLengthsField = new global::System.Collections.Generic.List(); - } - return this.indentLengthsField; - } - } - /// - /// Gets the current indent we use when adding lines to the output - /// - public string CurrentIndent - { - get - { - return this.currentIndentField; - } - } - /// - /// Current transformation session - /// - public virtual global::System.Collections.Generic.IDictionary Session - { - get - { - return this.sessionField; - } - set - { - this.sessionField = value; - } - } - #endregion - #region Transform-time helpers - /// - /// Write text directly into the generated output - /// - public void Write(string textToAppend) - { - if (string.IsNullOrEmpty(textToAppend)) - { - return; - } - // If we're starting off, or if the previous text ended with a newline, - // we have to append the current indent first. - if (((this.GenerationEnvironment.Length == 0) - || this.endsWithNewline)) - { - this.GenerationEnvironment.Append(this.currentIndentField); - this.endsWithNewline = false; - } - // Check if the current text ends with a newline - if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) - { - this.endsWithNewline = true; - } - // This is an optimization. If the current indent is "", then we don't have to do any - // of the more complex stuff further down. - if ((this.currentIndentField.Length == 0)) - { - this.GenerationEnvironment.Append(textToAppend); - return; - } - // Everywhere there is a newline in the text, add an indent after it - textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); - // If the text ends with a newline, then we should strip off the indent added at the very end - // because the appropriate indent will be added when the next time Write() is called - if (this.endsWithNewline) - { - this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); - } - else - { - this.GenerationEnvironment.Append(textToAppend); - } - } - /// - /// Write text directly into the generated output - /// - public void WriteLine(string textToAppend) - { - this.Write(textToAppend); - this.GenerationEnvironment.AppendLine(); - this.endsWithNewline = true; - } - /// - /// Write formatted text directly into the generated output - /// - public void Write(string format, params object[] args) - { - this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); - } - /// - /// Write formatted text directly into the generated output - /// - public void WriteLine(string format, params object[] args) - { - this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); - } - /// - /// Raise an error - /// - public void Error(string message) - { - System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); - error.ErrorText = message; - this.Errors.Add(error); - } - /// - /// Raise a warning - /// - public void Warning(string message) - { - System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); - error.ErrorText = message; - error.IsWarning = true; - this.Errors.Add(error); - } - /// - /// Increase the indent - /// - public void PushIndent(string indent) - { - if ((indent == null)) - { - throw new global::System.ArgumentNullException("indent"); - } - this.currentIndentField = (this.currentIndentField + indent); - this.indentLengths.Add(indent.Length); - } - /// - /// Remove the last indent that was added with PushIndent - /// - public string PopIndent() - { - string returnValue = ""; - if ((this.indentLengths.Count > 0)) - { - int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; - this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); - if ((indentLength > 0)) - { - returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); - this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); - } - } - return returnValue; - } - /// - /// Remove any indentation - /// - public void ClearIndent() - { - this.indentLengths.Clear(); - this.currentIndentField = ""; - } - #endregion - #region ToString Helpers - /// - /// Utility class to produce culture-oriented representation of an object as a string. - /// - public class ToStringInstanceHelper - { - private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; - /// - /// Gets or sets format provider to be used by ToStringWithCulture method. - /// - public System.IFormatProvider FormatProvider - { - get - { - return this.formatProviderField ; - } - set - { - if ((value != null)) - { - this.formatProviderField = value; - } - } - } - /// - /// This is called from the compile/run appdomain to convert objects within an expression block to a string - /// - public string ToStringWithCulture(object objectToConvert) - { - if ((objectToConvert == null)) - { - throw new global::System.ArgumentNullException("objectToConvert"); - } - System.Type t = objectToConvert.GetType(); - System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { - typeof(System.IFormatProvider)}); - if ((method == null)) - { - return objectToConvert.ToString(); - } - else - { - return ((string)(method.Invoke(objectToConvert, new object[] { - this.formatProviderField }))); - } - } - } - private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); - /// - /// Helper to produce culture-oriented representation of an object as a string - /// - public ToStringInstanceHelper ToStringHelper - { - get - { - return this.toStringHelperField; - } - } - #endregion - } - #endregion -} diff --git a/codegen2/src/Dtdl2Wot/Enum/t4/EnumThingSchema.cs b/codegen2/src/Dtdl2Wot/Enum/t4/EnumThingSchema.cs deleted file mode 100644 index b3868db97f..0000000000 --- a/codegen2/src/Dtdl2Wot/Enum/t4/EnumThingSchema.cs +++ /dev/null @@ -1,321 +0,0 @@ -// ------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version: 17.0.0.0 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ -namespace Dtdl2Wot -{ - using System.Collections.Generic; - using System.Linq; - using DTDLParser.Models; - using System; - - /// - /// Class to produce the template output - /// - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] - public partial class EnumThingSchema : EnumThingSchemaBase - { - /// - /// Create the template output - /// - public virtual string TransformText() - { - this.PushIndent(new string(' ', this.indent)); - if (CanExpressAsEnum(this.dtEnum)) { - this.Write("\"title\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.enumTitle)); - this.Write("\",\r\n\"type\": \"string\",\r\n\"enum\": [\r\n"); - int ix1 = 1; foreach (var enumValue in this.dtEnum.EnumValues.OrderBy(ev => ev.EnumValue)) { - this.Write(" \""); - this.Write(this.ToStringHelper.ToStringWithCulture(enumValue.Name)); - this.Write("\""); - this.Write(this.ToStringHelper.ToStringWithCulture(ix1 < this.dtEnum.EnumValues.Count ? "," : "")); - this.Write("\r\n"); - ix1++; } - this.Write("]"); - } else if (this.valueSchema == "integer") { - this.Write("\"type\": \"integer\",\r\n\"minimum\": -2147483648,\r\n\"maximum\": 2147483647"); - } else { - this.Write("\"type\": \"string\""); - } this.PopIndent(); - return this.GenerationEnvironment.ToString(); - } - } - #region Base class - /// - /// Base class for this transformation - /// - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] - public class EnumThingSchemaBase - { - #region Fields - private global::System.Text.StringBuilder generationEnvironmentField; - private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; - private global::System.Collections.Generic.List indentLengthsField; - private string currentIndentField = ""; - private bool endsWithNewline; - private global::System.Collections.Generic.IDictionary sessionField; - #endregion - #region Properties - /// - /// The string builder that generation-time code is using to assemble generated output - /// - public System.Text.StringBuilder GenerationEnvironment - { - get - { - if ((this.generationEnvironmentField == null)) - { - this.generationEnvironmentField = new global::System.Text.StringBuilder(); - } - return this.generationEnvironmentField; - } - set - { - this.generationEnvironmentField = value; - } - } - /// - /// The error collection for the generation process - /// - public System.CodeDom.Compiler.CompilerErrorCollection Errors - { - get - { - if ((this.errorsField == null)) - { - this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); - } - return this.errorsField; - } - } - /// - /// A list of the lengths of each indent that was added with PushIndent - /// - private System.Collections.Generic.List indentLengths - { - get - { - if ((this.indentLengthsField == null)) - { - this.indentLengthsField = new global::System.Collections.Generic.List(); - } - return this.indentLengthsField; - } - } - /// - /// Gets the current indent we use when adding lines to the output - /// - public string CurrentIndent - { - get - { - return this.currentIndentField; - } - } - /// - /// Current transformation session - /// - public virtual global::System.Collections.Generic.IDictionary Session - { - get - { - return this.sessionField; - } - set - { - this.sessionField = value; - } - } - #endregion - #region Transform-time helpers - /// - /// Write text directly into the generated output - /// - public void Write(string textToAppend) - { - if (string.IsNullOrEmpty(textToAppend)) - { - return; - } - // If we're starting off, or if the previous text ended with a newline, - // we have to append the current indent first. - if (((this.GenerationEnvironment.Length == 0) - || this.endsWithNewline)) - { - this.GenerationEnvironment.Append(this.currentIndentField); - this.endsWithNewline = false; - } - // Check if the current text ends with a newline - if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) - { - this.endsWithNewline = true; - } - // This is an optimization. If the current indent is "", then we don't have to do any - // of the more complex stuff further down. - if ((this.currentIndentField.Length == 0)) - { - this.GenerationEnvironment.Append(textToAppend); - return; - } - // Everywhere there is a newline in the text, add an indent after it - textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); - // If the text ends with a newline, then we should strip off the indent added at the very end - // because the appropriate indent will be added when the next time Write() is called - if (this.endsWithNewline) - { - this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); - } - else - { - this.GenerationEnvironment.Append(textToAppend); - } - } - /// - /// Write text directly into the generated output - /// - public void WriteLine(string textToAppend) - { - this.Write(textToAppend); - this.GenerationEnvironment.AppendLine(); - this.endsWithNewline = true; - } - /// - /// Write formatted text directly into the generated output - /// - public void Write(string format, params object[] args) - { - this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); - } - /// - /// Write formatted text directly into the generated output - /// - public void WriteLine(string format, params object[] args) - { - this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); - } - /// - /// Raise an error - /// - public void Error(string message) - { - System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); - error.ErrorText = message; - this.Errors.Add(error); - } - /// - /// Raise a warning - /// - public void Warning(string message) - { - System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); - error.ErrorText = message; - error.IsWarning = true; - this.Errors.Add(error); - } - /// - /// Increase the indent - /// - public void PushIndent(string indent) - { - if ((indent == null)) - { - throw new global::System.ArgumentNullException("indent"); - } - this.currentIndentField = (this.currentIndentField + indent); - this.indentLengths.Add(indent.Length); - } - /// - /// Remove the last indent that was added with PushIndent - /// - public string PopIndent() - { - string returnValue = ""; - if ((this.indentLengths.Count > 0)) - { - int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; - this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); - if ((indentLength > 0)) - { - returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); - this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); - } - } - return returnValue; - } - /// - /// Remove any indentation - /// - public void ClearIndent() - { - this.indentLengths.Clear(); - this.currentIndentField = ""; - } - #endregion - #region ToString Helpers - /// - /// Utility class to produce culture-oriented representation of an object as a string. - /// - public class ToStringInstanceHelper - { - private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; - /// - /// Gets or sets format provider to be used by ToStringWithCulture method. - /// - public System.IFormatProvider FormatProvider - { - get - { - return this.formatProviderField ; - } - set - { - if ((value != null)) - { - this.formatProviderField = value; - } - } - } - /// - /// This is called from the compile/run appdomain to convert objects within an expression block to a string - /// - public string ToStringWithCulture(object objectToConvert) - { - if ((objectToConvert == null)) - { - throw new global::System.ArgumentNullException("objectToConvert"); - } - System.Type t = objectToConvert.GetType(); - System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { - typeof(System.IFormatProvider)}); - if ((method == null)) - { - return objectToConvert.ToString(); - } - else - { - return ((string)(method.Invoke(objectToConvert, new object[] { - this.formatProviderField }))); - } - } - } - private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); - /// - /// Helper to produce culture-oriented representation of an object as a string - /// - public ToStringInstanceHelper ToStringHelper - { - get - { - return this.toStringHelperField; - } - } - #endregion - } - #endregion -} diff --git a/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.cs b/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.cs deleted file mode 100644 index 61c8880831..0000000000 --- a/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.cs +++ /dev/null @@ -1,451 +0,0 @@ -// ------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version: 17.0.0.0 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ -namespace Dtdl2Wot -{ - using System.Collections.Generic; - using System.Linq; - using DTDLParser; - using DTDLParser.Models; - using System; - - /// - /// Class to produce the template output - /// - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] - public partial class InterfaceThing : InterfaceThingBase - { - /// - /// Create the template output - /// - public virtual string TransformText() - { - this.Write("{\r\n \"@context\": [\r\n \"https://www.w3.org/2022/wot/td/v1.1\",\r\n { \"dtv\": \"htt" + - "p://azure.com/DigitalTwins/dtmi#\" }\r\n ],\r\n \"id\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.dtInterface.Id.ToString())); - this.Write("\",\r\n \"title\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.serviceName.AsGiven)); - this.Write(@""", - ""securityDefinitions"": { - ""nosec_sc"": { - ""scheme"": ""nosec"" - } - }, - ""security"": [ - ""nosec_sc"" - ], - ""links"": [ - { - ""rel"": ""service-desc"", - ""href"": ""./SchemaNames.json"", - ""type"": ""application/json"" - } - ], -"); - if (this.errorSchemas.Any() || this.namespacedEnums.Any()) { - this.Write(" \"schemaDefinitions\": {\r\n"); - int ix1 = 1; foreach (KeyValuePair errorSchema in this.errorSchemas) { - this.Write(" \""); - this.Write(this.ToStringHelper.ToStringWithCulture(errorSchema.Key)); - this.Write("\": {\r\n"); - if (errorSchema.Value.Description.Any()) { - this.Write(" \"description\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(errorSchema.Value.Description.First().Value)); - this.Write("\",\r\n"); - } - this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(errorSchema.Value, 6))); - this.Write("\r\n }"); - this.Write(this.ToStringHelper.ToStringWithCulture(ix1 < this.errorSchemas.Count + this.namespacedEnums.Count ? "," : "")); - this.Write("\r\n"); - ix1++; } - foreach (KeyValuePair namespacedEnum in this.namespacedEnums) { - this.Write(" \""); - this.Write(this.ToStringHelper.ToStringWithCulture(namespacedEnum.Key)); - this.Write("\": {\r\n \"type\": \"object\",\r\n \"const\": true,\r\n"); - if (namespacedEnum.Value.Description.Any()) { - this.Write(" \"description\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(namespacedEnum.Value.Description.First().Value)); - this.Write("\",\r\n"); - } - this.Write(" \"properties\": {\r\n"); - int ix2 = 1; foreach (DTEnumValueInfo enumValue in namespacedEnum.Value.EnumValues) { - this.Write(" \""); - this.Write(this.ToStringHelper.ToStringWithCulture(enumValue.Name)); - this.Write("\": {\r\n \"type\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(ThingDescriber.GetPrimitiveType(namespacedEnum.Value.ValueSchema.Id))); - this.Write("\",\r\n"); - if (enumValue.Description.Any()) { - this.Write(" \"description\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(enumValue.Description.First().Value)); - this.Write("\",\r\n"); - } - if (ThingDescriber.GetPrimitiveType(namespacedEnum.Value.ValueSchema.Id) == "integer") { - this.Write(" \"const\": "); - this.Write(this.ToStringHelper.ToStringWithCulture(enumValue.EnumValue)); - this.Write("\r\n"); - } else { - this.Write(" \"const\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(enumValue.EnumValue)); - this.Write("\"\r\n"); - } - this.Write(" }"); - this.Write(this.ToStringHelper.ToStringWithCulture(ix2 < namespacedEnum.Value.EnumValues.Count ? "," : "")); - this.Write("\r\n"); - ix2++; } - this.Write(" }\r\n }"); - this.Write(this.ToStringHelper.ToStringWithCulture(ix1 < this.errorSchemas.Count + this.namespacedEnums.Count ? "," : "")); - this.Write("\r\n"); - ix1++; } - this.Write(" },\r\n"); - } - if (this.aggregateTelemetries || this.aggregateProperties) { - this.Write(" \"forms\": [\r\n"); - if (this.aggregateTelemetries) { - this.Write(" {\r\n \"href\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.dtInterface.Id)); - this.Write("\",\r\n \"contentType\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.contentType)); - this.Write("\",\r\n \"dtv:topic\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.telemetryTopic)); - this.Write("\",\r\n \"op\": \"subscribeallevents\"\r\n }"); - this.Write(this.ToStringHelper.ToStringWithCulture(this.aggregateProperties ? "," : "")); - this.Write("\r\n"); - } - if (this.aggregateProperties) { - if (this.dtInterface.Properties.Any(p => p.Value.Writable)) { - this.Write(" {\r\n \"href\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.dtInterface.Id)); - this.Write("\",\r\n \"contentType\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.contentType)); - this.Write("\",\r\n"); - if (this.dtInterface.Properties.Values.Any(p => p.Writable && IsSchemaPropertyResult(p.Schema) && ((DTObjectInfo)p.Schema).Fields.Any(f => IsFieldWriteError(f)))) { - this.Write(" \"additionalResponses\": [\r\n {\r\n \"success\": false\r\n }\r" + - "\n ],\r\n"); - } - this.Write(" \"dtv:topic\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyTopic.Replace(MqttTopicTokens.PropertyAction, "write"))); - this.Write("\",\r\n \"op\": \"writemultipleproperties\"\r\n },\r\n"); - } - this.Write(" {\r\n \"href\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.dtInterface.Id)); - this.Write("\",\r\n \"contentType\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.contentType)); - this.Write("\",\r\n"); - if (this.dtInterface.Properties.Values.Any(p => IsSchemaPropertyResult(p.Schema) && ((DTObjectInfo)p.Schema).Fields.Any(f => IsFieldReadError(f)))) { - this.Write(" \"additionalResponses\": [\r\n {\r\n \"success\": false\r\n }\r" + - "\n ],\r\n"); - } - this.Write(" \"dtv:topic\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyTopic.Replace(MqttTopicTokens.PropertyAction, "read"))); - this.Write("\",\r\n \"op\": \"readallproperties\"\r\n }\r\n"); - } - this.Write(" ],\r\n"); - } - this.Write(" \"actions\": {\r\n"); - int ix = 1; foreach (KeyValuePair dtCommand in this.dtInterface.Commands) { - this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetCommandAffordance(dtCommand.Value, this.usesTypes, this.contentType, this.commandTopic, this.cmdServiceGroupId))); - this.Write(this.ToStringHelper.ToStringWithCulture(ix < this.dtInterface.Commands.Count ? "," : "")); - this.Write("\r\n"); - ix++; } - this.Write(" },\r\n \"properties\": {\r\n"); - ix = 1; foreach (KeyValuePair dtProperty in this.dtInterface.Properties) { - this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetPropertyAffordance(dtProperty.Value, this.usesTypes, this.contentType, this.propertyTopic))); - this.Write(this.ToStringHelper.ToStringWithCulture(ix < this.dtInterface.Properties.Count ? "," : "")); - this.Write("\r\n"); - ix++; } - this.Write(" },\r\n \"events\": {\r\n"); - ix = 1; foreach (KeyValuePair dtTelemetry in this.dtInterface.Telemetries) { - this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTelemetryAffordance(dtTelemetry.Value, this.usesTypes, this.contentType, this.telemetryTopic, this.telemServiceGroupId))); - this.Write(this.ToStringHelper.ToStringWithCulture(ix < this.dtInterface.Telemetries.Count ? "," : "")); - this.Write("\r\n"); - ix++; } - this.Write(" }\r\n}\r\n"); - return this.GenerationEnvironment.ToString(); - } - -private bool IsSchemaPropertyResult(DTSchemaInfo dtSchema) => dtSchema != null && dtSchema.SupplementalTypes.Contains(new Dtmi(string.Format(DtdlMqttExtensionValues.PropertyResultAdjunctTypeFormat, this.mqttVersion))); - -private bool IsFieldReadError(DTFieldInfo dtField) => dtField.SupplementalTypes.Contains(new Dtmi(string.Format(DtdlMqttExtensionValues.ReadErrorAdjunctTypeFormat, this.mqttVersion))); - -private bool IsFieldWriteError(DTFieldInfo dtField) => dtField.SupplementalTypes.Contains(new Dtmi(string.Format(DtdlMqttExtensionValues.WriteErrorAdjunctTypeFormat, this.mqttVersion))); - - } - #region Base class - /// - /// Base class for this transformation - /// - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] - public class InterfaceThingBase - { - #region Fields - private global::System.Text.StringBuilder generationEnvironmentField; - private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; - private global::System.Collections.Generic.List indentLengthsField; - private string currentIndentField = ""; - private bool endsWithNewline; - private global::System.Collections.Generic.IDictionary sessionField; - #endregion - #region Properties - /// - /// The string builder that generation-time code is using to assemble generated output - /// - public System.Text.StringBuilder GenerationEnvironment - { - get - { - if ((this.generationEnvironmentField == null)) - { - this.generationEnvironmentField = new global::System.Text.StringBuilder(); - } - return this.generationEnvironmentField; - } - set - { - this.generationEnvironmentField = value; - } - } - /// - /// The error collection for the generation process - /// - public System.CodeDom.Compiler.CompilerErrorCollection Errors - { - get - { - if ((this.errorsField == null)) - { - this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); - } - return this.errorsField; - } - } - /// - /// A list of the lengths of each indent that was added with PushIndent - /// - private System.Collections.Generic.List indentLengths - { - get - { - if ((this.indentLengthsField == null)) - { - this.indentLengthsField = new global::System.Collections.Generic.List(); - } - return this.indentLengthsField; - } - } - /// - /// Gets the current indent we use when adding lines to the output - /// - public string CurrentIndent - { - get - { - return this.currentIndentField; - } - } - /// - /// Current transformation session - /// - public virtual global::System.Collections.Generic.IDictionary Session - { - get - { - return this.sessionField; - } - set - { - this.sessionField = value; - } - } - #endregion - #region Transform-time helpers - /// - /// Write text directly into the generated output - /// - public void Write(string textToAppend) - { - if (string.IsNullOrEmpty(textToAppend)) - { - return; - } - // If we're starting off, or if the previous text ended with a newline, - // we have to append the current indent first. - if (((this.GenerationEnvironment.Length == 0) - || this.endsWithNewline)) - { - this.GenerationEnvironment.Append(this.currentIndentField); - this.endsWithNewline = false; - } - // Check if the current text ends with a newline - if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) - { - this.endsWithNewline = true; - } - // This is an optimization. If the current indent is "", then we don't have to do any - // of the more complex stuff further down. - if ((this.currentIndentField.Length == 0)) - { - this.GenerationEnvironment.Append(textToAppend); - return; - } - // Everywhere there is a newline in the text, add an indent after it - textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); - // If the text ends with a newline, then we should strip off the indent added at the very end - // because the appropriate indent will be added when the next time Write() is called - if (this.endsWithNewline) - { - this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); - } - else - { - this.GenerationEnvironment.Append(textToAppend); - } - } - /// - /// Write text directly into the generated output - /// - public void WriteLine(string textToAppend) - { - this.Write(textToAppend); - this.GenerationEnvironment.AppendLine(); - this.endsWithNewline = true; - } - /// - /// Write formatted text directly into the generated output - /// - public void Write(string format, params object[] args) - { - this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); - } - /// - /// Write formatted text directly into the generated output - /// - public void WriteLine(string format, params object[] args) - { - this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); - } - /// - /// Raise an error - /// - public void Error(string message) - { - System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); - error.ErrorText = message; - this.Errors.Add(error); - } - /// - /// Raise a warning - /// - public void Warning(string message) - { - System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); - error.ErrorText = message; - error.IsWarning = true; - this.Errors.Add(error); - } - /// - /// Increase the indent - /// - public void PushIndent(string indent) - { - if ((indent == null)) - { - throw new global::System.ArgumentNullException("indent"); - } - this.currentIndentField = (this.currentIndentField + indent); - this.indentLengths.Add(indent.Length); - } - /// - /// Remove the last indent that was added with PushIndent - /// - public string PopIndent() - { - string returnValue = ""; - if ((this.indentLengths.Count > 0)) - { - int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; - this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); - if ((indentLength > 0)) - { - returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); - this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); - } - } - return returnValue; - } - /// - /// Remove any indentation - /// - public void ClearIndent() - { - this.indentLengths.Clear(); - this.currentIndentField = ""; - } - #endregion - #region ToString Helpers - /// - /// Utility class to produce culture-oriented representation of an object as a string. - /// - public class ToStringInstanceHelper - { - private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; - /// - /// Gets or sets format provider to be used by ToStringWithCulture method. - /// - public System.IFormatProvider FormatProvider - { - get - { - return this.formatProviderField ; - } - set - { - if ((value != null)) - { - this.formatProviderField = value; - } - } - } - /// - /// This is called from the compile/run appdomain to convert objects within an expression block to a string - /// - public string ToStringWithCulture(object objectToConvert) - { - if ((objectToConvert == null)) - { - throw new global::System.ArgumentNullException("objectToConvert"); - } - System.Type t = objectToConvert.GetType(); - System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { - typeof(System.IFormatProvider)}); - if ((method == null)) - { - return objectToConvert.ToString(); - } - else - { - return ((string)(method.Invoke(objectToConvert, new object[] { - this.formatProviderField }))); - } - } - } - private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); - /// - /// Helper to produce culture-oriented representation of an object as a string - /// - public ToStringInstanceHelper ToStringHelper - { - get - { - return this.toStringHelperField; - } - } - #endregion - } - #endregion -} diff --git a/codegen2/src/Dtdl2Wot/Map/t4/MapThingSchema.cs b/codegen2/src/Dtdl2Wot/Map/t4/MapThingSchema.cs deleted file mode 100644 index 5893a9a471..0000000000 --- a/codegen2/src/Dtdl2Wot/Map/t4/MapThingSchema.cs +++ /dev/null @@ -1,313 +0,0 @@ -// ------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version: 17.0.0.0 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ -namespace Dtdl2Wot -{ - using System.Collections.Generic; - using System.Linq; - using DTDLParser.Models; - using System; - - /// - /// Class to produce the template output - /// - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] - public partial class MapThingSchema : MapThingSchemaBase - { - /// - /// Create the template output - /// - public virtual string TransformText() - { - this.PushIndent(new string(' ', this.indent)); - this.Write("\"type\": \"object\",\r\n\"dtv:additionalProperties\": {\r\n"); - if (this.dtMap.Description.Any()) { - this.Write(" \"description\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.dtMap.Description.First().Value)); - this.Write("\",\r\n"); - } - this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.dtMap.MapValue.Schema, 2))); - this.Write("\r\n}"); - this.PopIndent(); - return this.GenerationEnvironment.ToString(); - } - } - #region Base class - /// - /// Base class for this transformation - /// - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] - public class MapThingSchemaBase - { - #region Fields - private global::System.Text.StringBuilder generationEnvironmentField; - private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; - private global::System.Collections.Generic.List indentLengthsField; - private string currentIndentField = ""; - private bool endsWithNewline; - private global::System.Collections.Generic.IDictionary sessionField; - #endregion - #region Properties - /// - /// The string builder that generation-time code is using to assemble generated output - /// - public System.Text.StringBuilder GenerationEnvironment - { - get - { - if ((this.generationEnvironmentField == null)) - { - this.generationEnvironmentField = new global::System.Text.StringBuilder(); - } - return this.generationEnvironmentField; - } - set - { - this.generationEnvironmentField = value; - } - } - /// - /// The error collection for the generation process - /// - public System.CodeDom.Compiler.CompilerErrorCollection Errors - { - get - { - if ((this.errorsField == null)) - { - this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); - } - return this.errorsField; - } - } - /// - /// A list of the lengths of each indent that was added with PushIndent - /// - private System.Collections.Generic.List indentLengths - { - get - { - if ((this.indentLengthsField == null)) - { - this.indentLengthsField = new global::System.Collections.Generic.List(); - } - return this.indentLengthsField; - } - } - /// - /// Gets the current indent we use when adding lines to the output - /// - public string CurrentIndent - { - get - { - return this.currentIndentField; - } - } - /// - /// Current transformation session - /// - public virtual global::System.Collections.Generic.IDictionary Session - { - get - { - return this.sessionField; - } - set - { - this.sessionField = value; - } - } - #endregion - #region Transform-time helpers - /// - /// Write text directly into the generated output - /// - public void Write(string textToAppend) - { - if (string.IsNullOrEmpty(textToAppend)) - { - return; - } - // If we're starting off, or if the previous text ended with a newline, - // we have to append the current indent first. - if (((this.GenerationEnvironment.Length == 0) - || this.endsWithNewline)) - { - this.GenerationEnvironment.Append(this.currentIndentField); - this.endsWithNewline = false; - } - // Check if the current text ends with a newline - if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) - { - this.endsWithNewline = true; - } - // This is an optimization. If the current indent is "", then we don't have to do any - // of the more complex stuff further down. - if ((this.currentIndentField.Length == 0)) - { - this.GenerationEnvironment.Append(textToAppend); - return; - } - // Everywhere there is a newline in the text, add an indent after it - textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); - // If the text ends with a newline, then we should strip off the indent added at the very end - // because the appropriate indent will be added when the next time Write() is called - if (this.endsWithNewline) - { - this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); - } - else - { - this.GenerationEnvironment.Append(textToAppend); - } - } - /// - /// Write text directly into the generated output - /// - public void WriteLine(string textToAppend) - { - this.Write(textToAppend); - this.GenerationEnvironment.AppendLine(); - this.endsWithNewline = true; - } - /// - /// Write formatted text directly into the generated output - /// - public void Write(string format, params object[] args) - { - this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); - } - /// - /// Write formatted text directly into the generated output - /// - public void WriteLine(string format, params object[] args) - { - this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); - } - /// - /// Raise an error - /// - public void Error(string message) - { - System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); - error.ErrorText = message; - this.Errors.Add(error); - } - /// - /// Raise a warning - /// - public void Warning(string message) - { - System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); - error.ErrorText = message; - error.IsWarning = true; - this.Errors.Add(error); - } - /// - /// Increase the indent - /// - public void PushIndent(string indent) - { - if ((indent == null)) - { - throw new global::System.ArgumentNullException("indent"); - } - this.currentIndentField = (this.currentIndentField + indent); - this.indentLengths.Add(indent.Length); - } - /// - /// Remove the last indent that was added with PushIndent - /// - public string PopIndent() - { - string returnValue = ""; - if ((this.indentLengths.Count > 0)) - { - int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; - this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); - if ((indentLength > 0)) - { - returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); - this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); - } - } - return returnValue; - } - /// - /// Remove any indentation - /// - public void ClearIndent() - { - this.indentLengths.Clear(); - this.currentIndentField = ""; - } - #endregion - #region ToString Helpers - /// - /// Utility class to produce culture-oriented representation of an object as a string. - /// - public class ToStringInstanceHelper - { - private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; - /// - /// Gets or sets format provider to be used by ToStringWithCulture method. - /// - public System.IFormatProvider FormatProvider - { - get - { - return this.formatProviderField ; - } - set - { - if ((value != null)) - { - this.formatProviderField = value; - } - } - } - /// - /// This is called from the compile/run appdomain to convert objects within an expression block to a string - /// - public string ToStringWithCulture(object objectToConvert) - { - if ((objectToConvert == null)) - { - throw new global::System.ArgumentNullException("objectToConvert"); - } - System.Type t = objectToConvert.GetType(); - System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { - typeof(System.IFormatProvider)}); - if ((method == null)) - { - return objectToConvert.ToString(); - } - else - { - return ((string)(method.Invoke(objectToConvert, new object[] { - this.formatProviderField }))); - } - } - } - private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); - /// - /// Helper to produce culture-oriented representation of an object as a string - /// - public ToStringInstanceHelper ToStringHelper - { - get - { - return this.toStringHelperField; - } - } - #endregion - } - #endregion -} diff --git a/codegen2/src/Dtdl2Wot/Map/t4/PlaceholderThingSchema.cs b/codegen2/src/Dtdl2Wot/Map/t4/PlaceholderThingSchema.cs deleted file mode 100644 index 0bba3c849f..0000000000 --- a/codegen2/src/Dtdl2Wot/Map/t4/PlaceholderThingSchema.cs +++ /dev/null @@ -1,307 +0,0 @@ -// ------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version: 17.0.0.0 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ -namespace Dtdl2Wot -{ - using System.Collections.Generic; - using System.Linq; - using DTDLParser.Models; - using System; - - /// - /// Class to produce the template output - /// - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] - public partial class PlaceholderThingSchema : PlaceholderThingSchemaBase - { - /// - /// Create the template output - /// - public virtual string TransformText() - { - this.PushIndent(new string(' ', this.indent)); - this.Write("\"dtv:placeholder\": true,\r\n"); - this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.dtMap.MapValue.Schema, 0))); - this.PopIndent(); - return this.GenerationEnvironment.ToString(); - } - } - #region Base class - /// - /// Base class for this transformation - /// - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] - public class PlaceholderThingSchemaBase - { - #region Fields - private global::System.Text.StringBuilder generationEnvironmentField; - private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; - private global::System.Collections.Generic.List indentLengthsField; - private string currentIndentField = ""; - private bool endsWithNewline; - private global::System.Collections.Generic.IDictionary sessionField; - #endregion - #region Properties - /// - /// The string builder that generation-time code is using to assemble generated output - /// - public System.Text.StringBuilder GenerationEnvironment - { - get - { - if ((this.generationEnvironmentField == null)) - { - this.generationEnvironmentField = new global::System.Text.StringBuilder(); - } - return this.generationEnvironmentField; - } - set - { - this.generationEnvironmentField = value; - } - } - /// - /// The error collection for the generation process - /// - public System.CodeDom.Compiler.CompilerErrorCollection Errors - { - get - { - if ((this.errorsField == null)) - { - this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); - } - return this.errorsField; - } - } - /// - /// A list of the lengths of each indent that was added with PushIndent - /// - private System.Collections.Generic.List indentLengths - { - get - { - if ((this.indentLengthsField == null)) - { - this.indentLengthsField = new global::System.Collections.Generic.List(); - } - return this.indentLengthsField; - } - } - /// - /// Gets the current indent we use when adding lines to the output - /// - public string CurrentIndent - { - get - { - return this.currentIndentField; - } - } - /// - /// Current transformation session - /// - public virtual global::System.Collections.Generic.IDictionary Session - { - get - { - return this.sessionField; - } - set - { - this.sessionField = value; - } - } - #endregion - #region Transform-time helpers - /// - /// Write text directly into the generated output - /// - public void Write(string textToAppend) - { - if (string.IsNullOrEmpty(textToAppend)) - { - return; - } - // If we're starting off, or if the previous text ended with a newline, - // we have to append the current indent first. - if (((this.GenerationEnvironment.Length == 0) - || this.endsWithNewline)) - { - this.GenerationEnvironment.Append(this.currentIndentField); - this.endsWithNewline = false; - } - // Check if the current text ends with a newline - if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) - { - this.endsWithNewline = true; - } - // This is an optimization. If the current indent is "", then we don't have to do any - // of the more complex stuff further down. - if ((this.currentIndentField.Length == 0)) - { - this.GenerationEnvironment.Append(textToAppend); - return; - } - // Everywhere there is a newline in the text, add an indent after it - textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); - // If the text ends with a newline, then we should strip off the indent added at the very end - // because the appropriate indent will be added when the next time Write() is called - if (this.endsWithNewline) - { - this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); - } - else - { - this.GenerationEnvironment.Append(textToAppend); - } - } - /// - /// Write text directly into the generated output - /// - public void WriteLine(string textToAppend) - { - this.Write(textToAppend); - this.GenerationEnvironment.AppendLine(); - this.endsWithNewline = true; - } - /// - /// Write formatted text directly into the generated output - /// - public void Write(string format, params object[] args) - { - this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); - } - /// - /// Write formatted text directly into the generated output - /// - public void WriteLine(string format, params object[] args) - { - this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); - } - /// - /// Raise an error - /// - public void Error(string message) - { - System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); - error.ErrorText = message; - this.Errors.Add(error); - } - /// - /// Raise a warning - /// - public void Warning(string message) - { - System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); - error.ErrorText = message; - error.IsWarning = true; - this.Errors.Add(error); - } - /// - /// Increase the indent - /// - public void PushIndent(string indent) - { - if ((indent == null)) - { - throw new global::System.ArgumentNullException("indent"); - } - this.currentIndentField = (this.currentIndentField + indent); - this.indentLengths.Add(indent.Length); - } - /// - /// Remove the last indent that was added with PushIndent - /// - public string PopIndent() - { - string returnValue = ""; - if ((this.indentLengths.Count > 0)) - { - int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; - this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); - if ((indentLength > 0)) - { - returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); - this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); - } - } - return returnValue; - } - /// - /// Remove any indentation - /// - public void ClearIndent() - { - this.indentLengths.Clear(); - this.currentIndentField = ""; - } - #endregion - #region ToString Helpers - /// - /// Utility class to produce culture-oriented representation of an object as a string. - /// - public class ToStringInstanceHelper - { - private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; - /// - /// Gets or sets format provider to be used by ToStringWithCulture method. - /// - public System.IFormatProvider FormatProvider - { - get - { - return this.formatProviderField ; - } - set - { - if ((value != null)) - { - this.formatProviderField = value; - } - } - } - /// - /// This is called from the compile/run appdomain to convert objects within an expression block to a string - /// - public string ToStringWithCulture(object objectToConvert) - { - if ((objectToConvert == null)) - { - throw new global::System.ArgumentNullException("objectToConvert"); - } - System.Type t = objectToConvert.GetType(); - System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { - typeof(System.IFormatProvider)}); - if ((method == null)) - { - return objectToConvert.ToString(); - } - else - { - return ((string)(method.Invoke(objectToConvert, new object[] { - this.formatProviderField }))); - } - } - } - private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); - /// - /// Helper to produce culture-oriented representation of an object as a string - /// - public ToStringInstanceHelper ToStringHelper - { - get - { - return this.toStringHelperField; - } - } - #endregion - } - #endregion -} diff --git a/codegen2/src/Dtdl2Wot/Object/t4/ObjectThingSchema.cs b/codegen2/src/Dtdl2Wot/Object/t4/ObjectThingSchema.cs deleted file mode 100644 index 741485892f..0000000000 --- a/codegen2/src/Dtdl2Wot/Object/t4/ObjectThingSchema.cs +++ /dev/null @@ -1,343 +0,0 @@ -// ------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version: 17.0.0.0 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ -namespace Dtdl2Wot -{ - using System.Collections.Generic; - using System.Linq; - using DTDLParser.Models; - using System; - - /// - /// Class to produce the template output - /// - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] - public partial class ObjectThingSchema : ObjectThingSchemaBase - { - /// - /// Create the template output - /// - public virtual string TransformText() - { - this.PushIndent(new string(' ', this.indent)); - this.Write("\"title\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.objectTitle)); - this.Write("\",\r\n\"type\": \"object\",\r\n"); - if (this.objectFields.Any(f => IsFieldRequired(f))) { - this.Write("\"required\": [ "); - this.Write(this.ToStringHelper.ToStringWithCulture(string.Join(", ", this.objectFields.Where(f => IsFieldRequired(f)).Select(f => $"\"{f.Name}\"")))); - this.Write(" ],\r\n"); - } - if (this.objectFields.Any(f => IsFieldMessage(f))) { - this.Write("\"dtv:errorMessage\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.objectFields.First(f => IsFieldMessage(f)).Name)); - this.Write("\",\r\n"); - } - this.Write("\"properties\": {\r\n"); - int ix2 = 1; foreach (var dtField in this.objectFields) { - this.Write(" \""); - this.Write(this.ToStringHelper.ToStringWithCulture(dtField.Name)); - this.Write("\": {\r\n"); - if (dtField.Description.Any()) { - this.Write(" \"description\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(dtField.Description.First().Value)); - this.Write("\",\r\n"); - } else if (!dtField.Schema.Id.AbsoluteUri.StartsWith("dtmi:dtdl:instance:Schema:") && dtField.Schema.Description.Any()) { - this.Write(" \"description\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(dtField.Schema.Description.First().Value)); - this.Write("\",\r\n"); - } - this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(dtField.Schema, 4))); - this.Write("\r\n }"); - this.Write(this.ToStringHelper.ToStringWithCulture(ix2 < this.objectFields.Count ? "," : "")); - this.Write("\r\n"); - ix2++; } - this.Write("}"); - this.PopIndent(); - return this.GenerationEnvironment.ToString(); - } - - private bool IsFieldRequired(DTFieldInfo dtField) => dtField.SupplementalTypes.Any(t => DtdlMqttExtensionValues.RequiredAdjunctTypeRegex.IsMatch(t.AbsoluteUri)); - - private bool IsFieldMessage(DTFieldInfo dtField) => dtField.SupplementalTypes.Contains(this.errorMessageAdjunctTypeId); - - } - #region Base class - /// - /// Base class for this transformation - /// - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] - public class ObjectThingSchemaBase - { - #region Fields - private global::System.Text.StringBuilder generationEnvironmentField; - private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; - private global::System.Collections.Generic.List indentLengthsField; - private string currentIndentField = ""; - private bool endsWithNewline; - private global::System.Collections.Generic.IDictionary sessionField; - #endregion - #region Properties - /// - /// The string builder that generation-time code is using to assemble generated output - /// - public System.Text.StringBuilder GenerationEnvironment - { - get - { - if ((this.generationEnvironmentField == null)) - { - this.generationEnvironmentField = new global::System.Text.StringBuilder(); - } - return this.generationEnvironmentField; - } - set - { - this.generationEnvironmentField = value; - } - } - /// - /// The error collection for the generation process - /// - public System.CodeDom.Compiler.CompilerErrorCollection Errors - { - get - { - if ((this.errorsField == null)) - { - this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); - } - return this.errorsField; - } - } - /// - /// A list of the lengths of each indent that was added with PushIndent - /// - private System.Collections.Generic.List indentLengths - { - get - { - if ((this.indentLengthsField == null)) - { - this.indentLengthsField = new global::System.Collections.Generic.List(); - } - return this.indentLengthsField; - } - } - /// - /// Gets the current indent we use when adding lines to the output - /// - public string CurrentIndent - { - get - { - return this.currentIndentField; - } - } - /// - /// Current transformation session - /// - public virtual global::System.Collections.Generic.IDictionary Session - { - get - { - return this.sessionField; - } - set - { - this.sessionField = value; - } - } - #endregion - #region Transform-time helpers - /// - /// Write text directly into the generated output - /// - public void Write(string textToAppend) - { - if (string.IsNullOrEmpty(textToAppend)) - { - return; - } - // If we're starting off, or if the previous text ended with a newline, - // we have to append the current indent first. - if (((this.GenerationEnvironment.Length == 0) - || this.endsWithNewline)) - { - this.GenerationEnvironment.Append(this.currentIndentField); - this.endsWithNewline = false; - } - // Check if the current text ends with a newline - if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) - { - this.endsWithNewline = true; - } - // This is an optimization. If the current indent is "", then we don't have to do any - // of the more complex stuff further down. - if ((this.currentIndentField.Length == 0)) - { - this.GenerationEnvironment.Append(textToAppend); - return; - } - // Everywhere there is a newline in the text, add an indent after it - textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); - // If the text ends with a newline, then we should strip off the indent added at the very end - // because the appropriate indent will be added when the next time Write() is called - if (this.endsWithNewline) - { - this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); - } - else - { - this.GenerationEnvironment.Append(textToAppend); - } - } - /// - /// Write text directly into the generated output - /// - public void WriteLine(string textToAppend) - { - this.Write(textToAppend); - this.GenerationEnvironment.AppendLine(); - this.endsWithNewline = true; - } - /// - /// Write formatted text directly into the generated output - /// - public void Write(string format, params object[] args) - { - this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); - } - /// - /// Write formatted text directly into the generated output - /// - public void WriteLine(string format, params object[] args) - { - this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); - } - /// - /// Raise an error - /// - public void Error(string message) - { - System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); - error.ErrorText = message; - this.Errors.Add(error); - } - /// - /// Raise a warning - /// - public void Warning(string message) - { - System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); - error.ErrorText = message; - error.IsWarning = true; - this.Errors.Add(error); - } - /// - /// Increase the indent - /// - public void PushIndent(string indent) - { - if ((indent == null)) - { - throw new global::System.ArgumentNullException("indent"); - } - this.currentIndentField = (this.currentIndentField + indent); - this.indentLengths.Add(indent.Length); - } - /// - /// Remove the last indent that was added with PushIndent - /// - public string PopIndent() - { - string returnValue = ""; - if ((this.indentLengths.Count > 0)) - { - int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; - this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); - if ((indentLength > 0)) - { - returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); - this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); - } - } - return returnValue; - } - /// - /// Remove any indentation - /// - public void ClearIndent() - { - this.indentLengths.Clear(); - this.currentIndentField = ""; - } - #endregion - #region ToString Helpers - /// - /// Utility class to produce culture-oriented representation of an object as a string. - /// - public class ToStringInstanceHelper - { - private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; - /// - /// Gets or sets format provider to be used by ToStringWithCulture method. - /// - public System.IFormatProvider FormatProvider - { - get - { - return this.formatProviderField ; - } - set - { - if ((value != null)) - { - this.formatProviderField = value; - } - } - } - /// - /// This is called from the compile/run appdomain to convert objects within an expression block to a string - /// - public string ToStringWithCulture(object objectToConvert) - { - if ((objectToConvert == null)) - { - throw new global::System.ArgumentNullException("objectToConvert"); - } - System.Type t = objectToConvert.GetType(); - System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { - typeof(System.IFormatProvider)}); - if ((method == null)) - { - return objectToConvert.ToString(); - } - else - { - return ((string)(method.Invoke(objectToConvert, new object[] { - this.formatProviderField }))); - } - } - } - private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); - /// - /// Helper to produce culture-oriented representation of an object as a string - /// - public ToStringInstanceHelper ToStringHelper - { - get - { - return this.toStringHelperField; - } - } - #endregion - } - #endregion -} diff --git a/codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.cs b/codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.cs deleted file mode 100644 index 4b669b6aae..0000000000 --- a/codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.cs +++ /dev/null @@ -1,355 +0,0 @@ -// ------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version: 17.0.0.0 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ -namespace Dtdl2Wot -{ - using System.Collections.Generic; - using System.Linq; - using DTDLParser; - using DTDLParser.Models; - using System; - - /// - /// Class to produce the template output - /// - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] - public partial class PropertyAffordance : PropertyAffordanceBase - { - /// - /// Create the template output - /// - public virtual string TransformText() - { - this.Write(" \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.dtProperty.Name)); - this.Write("\": {\r\n"); - if (this.dtProperty.Description.Any()) { - this.Write(" \"description\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.dtProperty.Description.First().Value)); - this.Write("\",\r\n"); - } - if (this.usesTypes) { - this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.valueSchema, 6, this.isSchemaFragmented))); - this.Write(",\r\n \"readOnly\": "); - this.Write(this.ToStringHelper.ToStringWithCulture(this.dtProperty.Writable ? "false" : "true")); - this.Write(",\r\n"); - } - this.Write(" \"forms\": [\r\n"); - if (this.dtProperty.Writable) { - this.Write(" {\r\n \"href\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.dtProperty.Id)); - this.Write("\",\r\n \"contentType\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.contentType)); - this.Write("\",\r\n"); - if (this.isSchemaPropertyResult && this.writeErrorSchemaName != null) { - this.Write(" \"additionalResponses\": [\r\n {\r\n \"success\": false" + - ",\r\n \"schema\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.writeErrorSchemaName)); - this.Write("\"\r\n }\r\n ],\r\n"); - } - if (this.separate) { - this.Write(" \"dtv:topic\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyTopic.Replace(MqttTopicTokens.PropertyAction, "write"))); - this.Write("\",\r\n"); - } - this.Write(" \"op\": \"writeproperty\"\r\n },\r\n"); - } - this.Write(" {\r\n \"href\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.dtProperty.Id)); - this.Write("\",\r\n \"contentType\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.contentType)); - this.Write("\",\r\n"); - if (this.isSchemaPropertyResult && this.readErrorSchemaName != null) { - this.Write(" \"additionalResponses\": [\r\n {\r\n \"success\": false" + - ",\r\n \"schema\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.readErrorSchemaName)); - this.Write("\"\r\n }\r\n ],\r\n"); - } - if (this.separate) { - this.Write(" \"dtv:topic\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyTopic.Replace(MqttTopicTokens.PropertyAction, "read"))); - this.Write("\",\r\n"); - } - this.Write(" \"op\": \"readproperty\"\r\n }\r\n ]\r\n }"); - return this.GenerationEnvironment.ToString(); - } - } - #region Base class - /// - /// Base class for this transformation - /// - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] - public class PropertyAffordanceBase - { - #region Fields - private global::System.Text.StringBuilder generationEnvironmentField; - private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; - private global::System.Collections.Generic.List indentLengthsField; - private string currentIndentField = ""; - private bool endsWithNewline; - private global::System.Collections.Generic.IDictionary sessionField; - #endregion - #region Properties - /// - /// The string builder that generation-time code is using to assemble generated output - /// - public System.Text.StringBuilder GenerationEnvironment - { - get - { - if ((this.generationEnvironmentField == null)) - { - this.generationEnvironmentField = new global::System.Text.StringBuilder(); - } - return this.generationEnvironmentField; - } - set - { - this.generationEnvironmentField = value; - } - } - /// - /// The error collection for the generation process - /// - public System.CodeDom.Compiler.CompilerErrorCollection Errors - { - get - { - if ((this.errorsField == null)) - { - this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); - } - return this.errorsField; - } - } - /// - /// A list of the lengths of each indent that was added with PushIndent - /// - private System.Collections.Generic.List indentLengths - { - get - { - if ((this.indentLengthsField == null)) - { - this.indentLengthsField = new global::System.Collections.Generic.List(); - } - return this.indentLengthsField; - } - } - /// - /// Gets the current indent we use when adding lines to the output - /// - public string CurrentIndent - { - get - { - return this.currentIndentField; - } - } - /// - /// Current transformation session - /// - public virtual global::System.Collections.Generic.IDictionary Session - { - get - { - return this.sessionField; - } - set - { - this.sessionField = value; - } - } - #endregion - #region Transform-time helpers - /// - /// Write text directly into the generated output - /// - public void Write(string textToAppend) - { - if (string.IsNullOrEmpty(textToAppend)) - { - return; - } - // If we're starting off, or if the previous text ended with a newline, - // we have to append the current indent first. - if (((this.GenerationEnvironment.Length == 0) - || this.endsWithNewline)) - { - this.GenerationEnvironment.Append(this.currentIndentField); - this.endsWithNewline = false; - } - // Check if the current text ends with a newline - if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) - { - this.endsWithNewline = true; - } - // This is an optimization. If the current indent is "", then we don't have to do any - // of the more complex stuff further down. - if ((this.currentIndentField.Length == 0)) - { - this.GenerationEnvironment.Append(textToAppend); - return; - } - // Everywhere there is a newline in the text, add an indent after it - textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); - // If the text ends with a newline, then we should strip off the indent added at the very end - // because the appropriate indent will be added when the next time Write() is called - if (this.endsWithNewline) - { - this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); - } - else - { - this.GenerationEnvironment.Append(textToAppend); - } - } - /// - /// Write text directly into the generated output - /// - public void WriteLine(string textToAppend) - { - this.Write(textToAppend); - this.GenerationEnvironment.AppendLine(); - this.endsWithNewline = true; - } - /// - /// Write formatted text directly into the generated output - /// - public void Write(string format, params object[] args) - { - this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); - } - /// - /// Write formatted text directly into the generated output - /// - public void WriteLine(string format, params object[] args) - { - this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); - } - /// - /// Raise an error - /// - public void Error(string message) - { - System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); - error.ErrorText = message; - this.Errors.Add(error); - } - /// - /// Raise a warning - /// - public void Warning(string message) - { - System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); - error.ErrorText = message; - error.IsWarning = true; - this.Errors.Add(error); - } - /// - /// Increase the indent - /// - public void PushIndent(string indent) - { - if ((indent == null)) - { - throw new global::System.ArgumentNullException("indent"); - } - this.currentIndentField = (this.currentIndentField + indent); - this.indentLengths.Add(indent.Length); - } - /// - /// Remove the last indent that was added with PushIndent - /// - public string PopIndent() - { - string returnValue = ""; - if ((this.indentLengths.Count > 0)) - { - int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; - this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); - if ((indentLength > 0)) - { - returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); - this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); - } - } - return returnValue; - } - /// - /// Remove any indentation - /// - public void ClearIndent() - { - this.indentLengths.Clear(); - this.currentIndentField = ""; - } - #endregion - #region ToString Helpers - /// - /// Utility class to produce culture-oriented representation of an object as a string. - /// - public class ToStringInstanceHelper - { - private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; - /// - /// Gets or sets format provider to be used by ToStringWithCulture method. - /// - public System.IFormatProvider FormatProvider - { - get - { - return this.formatProviderField ; - } - set - { - if ((value != null)) - { - this.formatProviderField = value; - } - } - } - /// - /// This is called from the compile/run appdomain to convert objects within an expression block to a string - /// - public string ToStringWithCulture(object objectToConvert) - { - if ((objectToConvert == null)) - { - throw new global::System.ArgumentNullException("objectToConvert"); - } - System.Type t = objectToConvert.GetType(); - System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { - typeof(System.IFormatProvider)}); - if ((method == null)) - { - return objectToConvert.ToString(); - } - else - { - return ((string)(method.Invoke(objectToConvert, new object[] { - this.formatProviderField }))); - } - } - } - private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); - /// - /// Helper to produce culture-oriented representation of an object as a string - /// - public ToStringInstanceHelper ToStringHelper - { - get - { - return this.toStringHelperField; - } - } - #endregion - } - #endregion -} diff --git a/codegen2/src/Dtdl2Wot/Telemetry/t4/TelemetryAffordance.cs b/codegen2/src/Dtdl2Wot/Telemetry/t4/TelemetryAffordance.cs deleted file mode 100644 index 15fc1a1cd4..0000000000 --- a/codegen2/src/Dtdl2Wot/Telemetry/t4/TelemetryAffordance.cs +++ /dev/null @@ -1,335 +0,0 @@ -// ------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version: 17.0.0.0 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -// ------------------------------------------------------------------------------ -namespace Dtdl2Wot -{ - using System.Collections.Generic; - using System.Linq; - using DTDLParser; - using DTDLParser.Models; - using System; - - /// - /// Class to produce the template output - /// - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] - public partial class TelemetryAffordance : TelemetryAffordanceBase - { - /// - /// Create the template output - /// - public virtual string TransformText() - { - this.Write(" \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.dtTelemetry.Name)); - this.Write("\": {\r\n"); - if (this.dtTelemetry.Description.Any()) { - this.Write(" \"description\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.dtTelemetry.Description.First().Value)); - this.Write("\",\r\n"); - } - if (this.usesTypes) { - this.Write(" \"data\": {\r\n"); - this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.dtTelemetry.Schema, 8))); - this.Write("\r\n },\r\n"); - } else { - this.Write(" \"data\": {\r\n \"type\": \"null\"\r\n },\r\n"); - } - this.Write(" \"forms\": [\r\n {\r\n \"href\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.dtTelemetry.Id)); - this.Write("\",\r\n \"contentType\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.contentType)); - this.Write("\",\r\n"); - if (this.serviceGroupId != null) { - this.Write(" \"dtv:serviceGroupId\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.serviceGroupId)); - this.Write("\",\r\n"); - } - if (this.separate) { - this.Write(" \"dtv:topic\": \""); - this.Write(this.ToStringHelper.ToStringWithCulture(this.telemetryTopic)); - this.Write("\",\r\n"); - } - this.Write(" \"op\": \"subscribeevent\"\r\n }\r\n ]\r\n }"); - return this.GenerationEnvironment.ToString(); - } - } - #region Base class - /// - /// Base class for this transformation - /// - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")] - public class TelemetryAffordanceBase - { - #region Fields - private global::System.Text.StringBuilder generationEnvironmentField; - private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; - private global::System.Collections.Generic.List indentLengthsField; - private string currentIndentField = ""; - private bool endsWithNewline; - private global::System.Collections.Generic.IDictionary sessionField; - #endregion - #region Properties - /// - /// The string builder that generation-time code is using to assemble generated output - /// - public System.Text.StringBuilder GenerationEnvironment - { - get - { - if ((this.generationEnvironmentField == null)) - { - this.generationEnvironmentField = new global::System.Text.StringBuilder(); - } - return this.generationEnvironmentField; - } - set - { - this.generationEnvironmentField = value; - } - } - /// - /// The error collection for the generation process - /// - public System.CodeDom.Compiler.CompilerErrorCollection Errors - { - get - { - if ((this.errorsField == null)) - { - this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); - } - return this.errorsField; - } - } - /// - /// A list of the lengths of each indent that was added with PushIndent - /// - private System.Collections.Generic.List indentLengths - { - get - { - if ((this.indentLengthsField == null)) - { - this.indentLengthsField = new global::System.Collections.Generic.List(); - } - return this.indentLengthsField; - } - } - /// - /// Gets the current indent we use when adding lines to the output - /// - public string CurrentIndent - { - get - { - return this.currentIndentField; - } - } - /// - /// Current transformation session - /// - public virtual global::System.Collections.Generic.IDictionary Session - { - get - { - return this.sessionField; - } - set - { - this.sessionField = value; - } - } - #endregion - #region Transform-time helpers - /// - /// Write text directly into the generated output - /// - public void Write(string textToAppend) - { - if (string.IsNullOrEmpty(textToAppend)) - { - return; - } - // If we're starting off, or if the previous text ended with a newline, - // we have to append the current indent first. - if (((this.GenerationEnvironment.Length == 0) - || this.endsWithNewline)) - { - this.GenerationEnvironment.Append(this.currentIndentField); - this.endsWithNewline = false; - } - // Check if the current text ends with a newline - if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) - { - this.endsWithNewline = true; - } - // This is an optimization. If the current indent is "", then we don't have to do any - // of the more complex stuff further down. - if ((this.currentIndentField.Length == 0)) - { - this.GenerationEnvironment.Append(textToAppend); - return; - } - // Everywhere there is a newline in the text, add an indent after it - textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); - // If the text ends with a newline, then we should strip off the indent added at the very end - // because the appropriate indent will be added when the next time Write() is called - if (this.endsWithNewline) - { - this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); - } - else - { - this.GenerationEnvironment.Append(textToAppend); - } - } - /// - /// Write text directly into the generated output - /// - public void WriteLine(string textToAppend) - { - this.Write(textToAppend); - this.GenerationEnvironment.AppendLine(); - this.endsWithNewline = true; - } - /// - /// Write formatted text directly into the generated output - /// - public void Write(string format, params object[] args) - { - this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); - } - /// - /// Write formatted text directly into the generated output - /// - public void WriteLine(string format, params object[] args) - { - this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); - } - /// - /// Raise an error - /// - public void Error(string message) - { - System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); - error.ErrorText = message; - this.Errors.Add(error); - } - /// - /// Raise a warning - /// - public void Warning(string message) - { - System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); - error.ErrorText = message; - error.IsWarning = true; - this.Errors.Add(error); - } - /// - /// Increase the indent - /// - public void PushIndent(string indent) - { - if ((indent == null)) - { - throw new global::System.ArgumentNullException("indent"); - } - this.currentIndentField = (this.currentIndentField + indent); - this.indentLengths.Add(indent.Length); - } - /// - /// Remove the last indent that was added with PushIndent - /// - public string PopIndent() - { - string returnValue = ""; - if ((this.indentLengths.Count > 0)) - { - int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; - this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); - if ((indentLength > 0)) - { - returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); - this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); - } - } - return returnValue; - } - /// - /// Remove any indentation - /// - public void ClearIndent() - { - this.indentLengths.Clear(); - this.currentIndentField = ""; - } - #endregion - #region ToString Helpers - /// - /// Utility class to produce culture-oriented representation of an object as a string. - /// - public class ToStringInstanceHelper - { - private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; - /// - /// Gets or sets format provider to be used by ToStringWithCulture method. - /// - public System.IFormatProvider FormatProvider - { - get - { - return this.formatProviderField ; - } - set - { - if ((value != null)) - { - this.formatProviderField = value; - } - } - } - /// - /// This is called from the compile/run appdomain to convert objects within an expression block to a string - /// - public string ToStringWithCulture(object objectToConvert) - { - if ((objectToConvert == null)) - { - throw new global::System.ArgumentNullException("objectToConvert"); - } - System.Type t = objectToConvert.GetType(); - System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { - typeof(System.IFormatProvider)}); - if ((method == null)) - { - return objectToConvert.ToString(); - } - else - { - return ((string)(method.Invoke(objectToConvert, new object[] { - this.formatProviderField }))); - } - } - } - private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); - /// - /// Helper to produce culture-oriented representation of an object as a string - /// - public ToStringInstanceHelper ToStringHelper - { - get - { - return this.toStringHelperField; - } - } - #endregion - } - #endregion -} From a3be13e1aee028d65b9ffc729f3e4925d0a7a136 Mon Sep 17 00:00:00 2001 From: Auto Gen Date: Wed, 17 Dec 2025 08:58:34 -0800 Subject: [PATCH 23/52] add Dtdld2Wot .gitignore --- codegen2/src/Dtdl2Wot/.gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 codegen2/src/Dtdl2Wot/.gitignore diff --git a/codegen2/src/Dtdl2Wot/.gitignore b/codegen2/src/Dtdl2Wot/.gitignore new file mode 100644 index 0000000000..db669da381 --- /dev/null +++ b/codegen2/src/Dtdl2Wot/.gitignore @@ -0,0 +1 @@ +**/t4/*.cs From 39be747228b345976fa95267c80423779aa9bb3b Mon Sep 17 00:00:00 2001 From: Auto Gen Date: Thu, 18 Dec 2025 09:13:45 -0800 Subject: [PATCH 24/52] validate topic patterns --- codegen2/eval/wot/ExternalSchemas.TD.json | 6 +- .../ErrorLog.cs | 89 +++++- .../ErrorReporter.cs | 11 + .../ExternalReference.cs | 4 - .../MqttTopicTokens.cs | 56 ++++ .../ThingValidator.cs | 299 ++++++++++++++---- .../ValueReference.cs | 4 + .../ActionEnvoyGenerator.cs | 2 +- .../MqttTopicTokens.cs | 58 ---- .../PropertyEnvoyGenerator.cs | 2 +- .../Actions/t4/DotNetCommandExecutor.tt | 5 +- .../dotnet/Actions/t4/DotNetCommandInvoker.tt | 5 +- .../Events/t4/DotNetTelemetryReceiver.tt | 5 +- .../dotnet/Events/t4/DotNetTelemetrySender.tt | 7 +- .../Properties/t4/DotNetPropertyConsumer.tt | 18 +- .../Properties/t4/DotNetPropertyMaintainer.tt | 18 +- .../dotnet/Service/t4/DotNetService.tt | 12 +- .../rust/Actions/t4/RustCommandExecutor.tt | 5 +- .../rust/Actions/t4/RustCommandInvoker.tt | 5 +- .../rust/Events/t4/RustTelemetryReceiver.tt | 5 +- .../rust/Events/t4/RustTelemetrySender.tt | 8 +- .../Properties/t4/RustPropertyConsumer.tt | 18 +- .../Properties/t4/RustPropertyMaintainer.tt | 18 +- .../Command/code/CommandAffordance.cs | 2 +- codegen2/src/Dtdl2Wot/DtdlMqttTopicTokens.cs | 28 ++ .../Dtdl2Wot/Interface/code/InterfaceThing.cs | 4 +- .../Dtdl2Wot/Interface/t4/InterfaceThing.tt | 4 +- codegen2/src/Dtdl2Wot/MqttTopicTokens.cs | 58 ---- .../Property/code/PropertyAffordance.cs | 4 +- .../Property/t4/PropertyAffordance.tt | 4 +- .../Telemetry/code/TelemetryAffordance.cs | 4 +- 31 files changed, 475 insertions(+), 293 deletions(-) delete mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/ExternalReference.cs create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/MqttTopicTokens.cs create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/ValueReference.cs delete mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/MqttTopicTokens.cs create mode 100644 codegen2/src/Dtdl2Wot/DtdlMqttTopicTokens.cs delete mode 100644 codegen2/src/Dtdl2Wot/MqttTopicTokens.cs diff --git a/codegen2/eval/wot/ExternalSchemas.TD.json b/codegen2/eval/wot/ExternalSchemas.TD.json index de6edbb08c..3d796de549 100644 --- a/codegen2/eval/wot/ExternalSchemas.TD.json +++ b/codegen2/eval/wot/ExternalSchemas.TD.json @@ -56,7 +56,7 @@ { "href": "dtmi:test:PropertyTogether;1", "contentType": "application/json", - "dtv:topic": "test/PropertyTogether/read", + "dtv:topic": "test/PropertyTogether/write", "additionalResponses": [ { "success": false @@ -91,7 +91,7 @@ { "href": "dtmi:jsonTest:ExternalSchemas:_contents:__Aleph;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/property/Alpha", + "dtv:topic": "sample/{modelId}/property/Alpha/{action}", "additionalResponses": [ { "success": false, @@ -103,7 +103,7 @@ { "href": "dtmi:jsonTest:ExternalSchemas:_contents:__Aleph;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/property/Alpha", + "dtv:topic": "sample/{modelId}/property/Alpha/{action}", "additionalResponses": [ { "success": false, diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs index b84af4f762..d6d3a41760 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs @@ -2,12 +2,15 @@ { using System.Collections.Generic; using System.IO; + using Azure.Iot.Operations.TDParser.Model; public class ErrorLog { - private readonly Dictionary> referencesFromThings; - private readonly Dictionary<(string, string), List> typedReferencesFromThings; + private readonly Dictionary>> idsOfThings; + private readonly Dictionary> referencesFromThings; + private readonly Dictionary<(string, string), List> typedReferencesFromThings; private readonly Dictionary> namesInThings; + private readonly Dictionary> topicsInThings; private readonly Dictionary>> schemaNames; private readonly string defaultFolder; @@ -21,9 +24,11 @@ public class ErrorLog public ErrorLog(string defaultFolder) { - this.referencesFromThings = new Dictionary>(); - this.typedReferencesFromThings = new Dictionary<(string, string), List>(); + this.idsOfThings = new Dictionary>>(); + this.referencesFromThings = new Dictionary>(); + this.typedReferencesFromThings = new Dictionary<(string, string), List>(); this.namesInThings = new Dictionary>(); + this.topicsInThings = new Dictionary>(); this.schemaNames = new Dictionary>>(); this.defaultFolder = defaultFolder; @@ -34,6 +39,17 @@ public ErrorLog(string defaultFolder) public void CheckForDuplicatesInThings() { + foreach (var (id, idSites) in idsOfThings) + { + if (idSites.Count > 1) + { + foreach (var (filename, lineNumber) in idSites) + { + AddError(ErrorLevel.Error, $"Duplicate use of '{TDThing.IdName}' value '{id}' across TDs.", filename, lineNumber, crossRef: id); + } + } + } + foreach (var (name, nameSites) in namesInThings) { if (nameSites.Count > 1) @@ -44,6 +60,30 @@ public void CheckForDuplicatesInThings() } } } + + foreach (var (topic, topicReferences) in topicsInThings) + { + if (topicReferences.Count > 1) + { + foreach (ValueReference reference in topicReferences) + { + string description; + string citation; + if (topic == reference.Value) + { + description = "Topic"; + citation = string.Empty; + } + else + { + description = topic.Contains('{') ? "Partially resolved topic" : "Resolved topic"; + citation = $" (in model as \"{reference.Value}\")"; + } + + AddError(ErrorLevel.Error, $"{description} '{topic}' used by multiple affordances{citation}.", reference.Filename, reference.LineNumber, crossRef: topic); + } + } + } } public void CheckForDuplicatesInSchemas() @@ -64,12 +104,12 @@ public void RegisterReferenceFromThing(string refPath, string filename, int line { string fullPath = Path.GetFullPath(Path.Combine(this.defaultFolder, refPath)).Replace('\\', '/'); - if (!referencesFromThings.TryGetValue(fullPath, out List? references)) + if (!referencesFromThings.TryGetValue(fullPath, out List? references)) { references = new(); referencesFromThings[fullPath] = references; } - references.Add(new ExternalReference(filename, lineNumber, refValue)); + references.Add(new ValueReference(filename, lineNumber, refValue)); } public void RegisterTypedReferenceFromThing(string refPath, string filename, int lineNumber, string type, string refValue) @@ -77,12 +117,23 @@ public void RegisterTypedReferenceFromThing(string refPath, string filename, int string fullPath = Path.GetFullPath(Path.Combine(this.defaultFolder, refPath)).Replace('\\', '/'); var key = (fullPath, type); - if (!typedReferencesFromThings.TryGetValue(key, out List? typedReferences)) + if (!typedReferencesFromThings.TryGetValue(key, out List? typedReferences)) { typedReferences = new(); typedReferencesFromThings[key] = typedReferences; } - typedReferences.Add(new ExternalReference(filename, lineNumber, refValue)); + typedReferences.Add(new ValueReference(filename, lineNumber, refValue)); + } + + public void RegisterIdOfThing(string id, string filename, int lineNumber) + { + if (!idsOfThings.TryGetValue(id, out List>? idSites)) + { + idSites = new(); + idsOfThings[id] = idSites; + } + + idSites.Add(new KeyValuePair(filename, lineNumber)); } public void RegisterNameInThing(string name, string filename, int lineNumber) @@ -99,6 +150,16 @@ public void RegisterNameInThing(string name, string filename, int lineNumber) } } + public void RegisterTopicInThing(string resolvedTopic, string filename, int lineNumber, string rawTopic) + { + if (!topicsInThings.TryGetValue(resolvedTopic, out List? topicReferences)) + { + topicReferences = new(); + topicsInThings[resolvedTopic] = topicReferences; + } + topicReferences.Add(new ValueReference(filename, lineNumber, rawTopic)); + } + public void RegisterSchemaName(string name, string filename, string dirpath, int lineNumber) { if (!schemaNames.TryGetValue(name, out List>? nameSites)) @@ -139,11 +200,11 @@ public void AddError(ErrorLevel level, string message, string filename, int line public void AddReferenceError(string refPath, string description, string reason, string filename, string dirpath, int lineNumber, string refValue) { - if (dirpath.Equals(this.defaultFolder) && referencesFromThings.TryGetValue(refPath, out List? references)) + if (dirpath.Equals(this.defaultFolder) && referencesFromThings.TryGetValue(refPath, out List? references)) { - foreach (ExternalReference reference in references) + foreach (ValueReference reference in references) { - AddError(ErrorLevel.Error, $"External schema reference \"{reference.RefValue}\" not resolvable; {reason}", reference.Filename, reference.LineNumber); + AddError(ErrorLevel.Error, $"External schema reference \"{reference.Value}\" not resolvable; {reason}", reference.Filename, reference.LineNumber); } } else @@ -155,11 +216,11 @@ public void AddReferenceError(string refPath, string description, string reason, public void AddReferenceTypeError(string refPath, string description, string filename, string dirpath, int lineNumber, string refValue, string refType, string actualType) { var key = (refPath, refType); - if (dirpath.Equals(this.defaultFolder) && typedReferencesFromThings.TryGetValue(key, out List? typedReferences)) + if (dirpath.Equals(this.defaultFolder) && typedReferencesFromThings.TryGetValue(key, out List? typedReferences)) { - foreach (ExternalReference reference in typedReferences) + foreach (ValueReference reference in typedReferences) { - AddError(ErrorLevel.Error, $"External schema reference \"{reference.RefValue}\" is expected to define a schema of type \"{refType}\", but it defines a schema of type \"{actualType}\"", reference.Filename, reference.LineNumber); + AddError(ErrorLevel.Error, $"External schema reference \"{reference.Value}\" is expected to define a schema of type \"{refType}\", but it defines a schema of type \"{actualType}\"", reference.Filename, reference.LineNumber); } } else diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs index 68c453f818..abc1a4d586 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs @@ -3,6 +3,7 @@ using System; using System.IO; using System.Text.RegularExpressions; + using Azure.Iot.Operations.TDParser; public class ErrorReporter { @@ -33,11 +34,21 @@ public void RegisterTypedReferenceFromThing(long byteIndex, string type, string this.errorLog.RegisterTypedReferenceFromThing(refPath, this.filename, GetLineNumber(byteIndex), type, refValue); } + public void RegisterIdOfThing(ValueTracker id) + { + this.errorLog.RegisterIdOfThing(id.Value.Value, this.filename, GetLineNumber(id.TokenIndex)); + } + public void RegisterNameInThing(string name, long byteIndex) { this.errorLog.RegisterNameInThing(name, this.filename, GetLineNumber(byteIndex)); } + public void RegisterTopicInThing(string resolvedTopic, long byteIndex, string rawTopic) + { + this.errorLog.RegisterTopicInThing(resolvedTopic, this.filename, GetLineNumber(byteIndex), rawTopic); + } + public void RegisterSchemaName(string name, long byteIndex) { this.errorLog.RegisterSchemaName(name, this.filename, this.basePath, GetLineNumber(byteIndex)); diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ExternalReference.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ExternalReference.cs deleted file mode 100644 index c9b265ae5a..0000000000 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ExternalReference.cs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Azure.Iot.Operations.CodeGeneration -{ - public record ExternalReference(string Filename, int LineNumber, string RefValue); -} diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/MqttTopicTokens.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/MqttTopicTokens.cs new file mode 100644 index 0000000000..0b553837c4 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/MqttTopicTokens.cs @@ -0,0 +1,56 @@ +namespace Azure.Iot.Operations.CodeGeneration +{ + /// + /// Static class that defines string values of the replaceable components used in topic patterns. + /// + public static class MqttTopicTokens + { + /// + /// Token representing the ID of a service. + /// + public const string ModelId = "modelId"; + + /// + /// Token representing the ID of an Action executor, should be used only in Action topic patterns. + /// + public const string ActionExecutorId = "executorId"; + + /// + /// Token representing the MQTT Client ID of an Action invoker, should be used only in Action topic patterns. + /// + public const string ActionInvokerId = "invokerClientId"; + + /// + /// Token representing the ID of an Event sender, should be used only in Event topic patterns. + /// + public const string EventSenderId = "senderId"; + + /// + /// Token representing the ID of a Property maintainer, should be used only in Property topic patterns. + /// + public const string PropertyMaintainerId = "maintainerId"; + + /// + /// Token representing the MQTT Client ID of a Property consumer, should be used only in Property topic patterns. + /// + public const string PropertyConsumerId = "consumerClientId"; + + /// + /// Token representing a Property action, 'read' or 'write'. + /// + public const string PropertyAction = "action"; + + public static class PropertyActionValues + { + /// + /// Token value indicating a Property read action, 'readproperty' or 'readallproperties'. + /// + public const string Read = "read"; + + /// + /// Token value indicating a Property write action, 'writeproperty' or 'writemultipleproperties'. + /// + public const string Write = "write"; + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs index 3239b75f80..37b1e07b33 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs @@ -39,42 +39,44 @@ public bool TryValidateThng(TDThing thing, HashSet serializ hasError = true; } - if (!TryValidateId(thing.Id)) + if (!TryValidateTitle(thing.Title)) { hasError = true; } - if (!TryValidateTitle(thing.Title)) + if (!TryValidateLinks(thing.Links)) { hasError = true; } - if (!TryValidateLinks(thing.Links)) + if (!TryValidateSchemaDefinitions(thing.SchemaDefinitions)) { hasError = true; } - if (!TryValidateSchemaDefinitions(thing.SchemaDefinitions)) + ValueTracker? modelIdTopic = null; + + if (!TryValidateRootForms(thing.Forms, thing.SchemaDefinitions, thing.Id!, serializationFormats, ref modelIdTopic)) { hasError = true; } - if (!TryValidateRootForms(thing.Forms, thing.SchemaDefinitions, serializationFormats)) + if (!TryValidateActions(thing.Actions, thing.SchemaDefinitions, thing.Id!, serializationFormats, ref modelIdTopic)) { hasError = true; } - if (!TryValidateActions(thing.Actions, thing.SchemaDefinitions, serializationFormats)) + if (!TryValidateProperties(thing.Properties, thing.SchemaDefinitions, thing.Id!, serializationFormats, ref modelIdTopic)) { hasError = true; } - if (!TryValidateProperties(thing.Properties, thing.SchemaDefinitions, serializationFormats)) + if (!TryValidateEvents(thing.Events, thing.SchemaDefinitions, thing.Id!, serializationFormats, ref modelIdTopic)) { hasError = true; } - if (!TryValidateEvents(thing.Events, thing.SchemaDefinitions, serializationFormats)) + if (!TryValidateId(thing.Id, modelIdTopic)) { hasError = true; } @@ -171,14 +173,14 @@ private void CheckSchemaDefinitionsCoverage(MapTracker? schemaDefi } } - private bool TryValidateRootForms(ArrayTracker? forms, MapTracker? schemaDefinitions, HashSet serializationFormats) + private bool TryValidateRootForms(ArrayTracker? forms, MapTracker? schemaDefinitions, ValueTracker id, HashSet serializationFormats, ref ValueTracker? modelIdTopic) { if (forms?.Elements == null) { return true; } - if (!TryValidateForms(forms, FormsKind.Root, schemaDefinitions, out ValueTracker? contentType)) + if (!TryValidateForms(forms, FormsKind.Root, schemaDefinitions, id, out ValueTracker? contentType, ref modelIdTopic)) { return false; } @@ -431,7 +433,7 @@ private bool TryValidateContext(ArrayTracker? context) return !hasError; } - private bool TryValidateId(ValueTracker? id) + private bool TryValidateId(ValueTracker? id, ValueTracker? modelIdTopic) { if (id == null) { @@ -445,6 +447,29 @@ private bool TryValidateId(ValueTracker? id) return false; } + if (id.Value.Value.Any(c => c is < '!' or > '~')) + { + errorReporter.ReportError($"Thing Description '{TDThing.IdName}' property value \"{id.Value.Value}\" contains invalid character(s); only printable ASCII characters not including space are allowed.", id.TokenIndex); + return false; + } + + if (modelIdTopic != null) + { + if (id.Value.Value.Any(c => c is '+' or '#' or '{' or '}')) + { + errorReporter.ReportError($"Thing Description '{TDThing.IdName}' property value \"{id.Value.Value}\" contains invalid character(s); only printable ASCII characters not including space, '\"', '+', '#', '{{', or '}}' are allowed when TD includes a topic that contains token '{{{MqttTopicTokens.ModelId}}}'.", id.TokenIndex, modelIdTopic.TokenIndex); + return false; + } + + if (id.Value.Value.StartsWith('/') || id.Value.Value.EndsWith('/') || id.Value.Value.Contains("//")) + { + errorReporter.ReportError($"Thing Description '{TDThing.IdName}' property value \"{id.Value.Value}\" must not start with, end with, or contain more than one successive '/' when TD includes a topic that contains token '{{{MqttTopicTokens.ModelId}}}'.", id.TokenIndex, modelIdTopic.TokenIndex); + return false; + } + } + + errorReporter.RegisterIdOfThing(id); + return true; } @@ -569,7 +594,7 @@ private bool TryValidateSchemaDefinitions(MapTracker? schemaDefini return !hasError; } - private bool TryValidateActions(MapTracker? actions, MapTracker? schemaDefinitions, HashSet serializationFormats) + private bool TryValidateActions(MapTracker? actions, MapTracker? schemaDefinitions, ValueTracker id, HashSet serializationFormats, ref ValueTracker? modelIdTopic) { if (actions?.Entries == null) { @@ -580,7 +605,7 @@ private bool TryValidateActions(MapTracker? actions, MapTracker> action in actions.Entries) { - if (!TryValidateAction(action.Key, action.Value, schemaDefinitions, out ValueTracker? contentType)) + if (!TryValidateAction(action.Key, action.Value, schemaDefinitions, id, out ValueTracker? contentType, ref modelIdTopic)) { hasError = true; } @@ -593,7 +618,7 @@ private bool TryValidateActions(MapTracker? actions, MapTracker action, MapTracker? schemaDefinitions, out ValueTracker? contentType) + private bool TryValidateAction(string name, ValueTracker action, MapTracker? schemaDefinitions, ValueTracker id, out ValueTracker? contentType, ref ValueTracker? modelIdTopic) { if (action.Value.Forms == null) { @@ -601,7 +626,7 @@ private bool TryValidateAction(string name, ValueTracker action, MapTr contentType = null; return false; } - else if (!TryValidateForms(action.Value.Forms, FormsKind.Action, schemaDefinitions, out contentType)) + else if (!TryValidateForms(action.Value.Forms, FormsKind.Action, schemaDefinitions, id, out contentType, ref modelIdTopic)) { return false; } @@ -652,7 +677,7 @@ private bool TryValidateActionDataSchema(ValueTracker dataSchema, string p return TryValidateDataSchema(dataSchema, null, DataSchemaKind.Action, contentType); } - private bool TryValidateProperties(MapTracker? properties, MapTracker? schemaDefinitions, HashSet serializationFormats) + private bool TryValidateProperties(MapTracker? properties, MapTracker? schemaDefinitions, ValueTracker id, HashSet serializationFormats, ref ValueTracker? modelIdTopic) { if (properties?.Entries == null) { @@ -663,7 +688,7 @@ private bool TryValidateProperties(MapTracker? properties, MapTracke foreach (KeyValuePair> property in properties.Entries) { - if (!TryValidateProperty(property.Key, property.Value, schemaDefinitions, out ValueTracker? contentType)) + if (!TryValidateProperty(property.Key, property.Value, schemaDefinitions, id, out ValueTracker? contentType, ref modelIdTopic)) { hasError = true; } @@ -676,7 +701,7 @@ private bool TryValidateProperties(MapTracker? properties, MapTracke return !hasError; } - private bool TryValidateProperty(string name, ValueTracker property, MapTracker? schemaDefinitions, out ValueTracker? contentType) + private bool TryValidateProperty(string name, ValueTracker property, MapTracker? schemaDefinitions, ValueTracker id, out ValueTracker? contentType, ref ValueTracker? modelIdTopic) { if (property.Value.Forms == null) { @@ -684,7 +709,7 @@ private bool TryValidateProperty(string name, ValueTracker property, contentType = null; return false; } - else if (!TryValidatePropertyForms(name, property.Value.Forms, schemaDefinitions, property.Value.ReadOnly, out contentType)) + else if (!TryValidatePropertyForms(name, property.Value.Forms, schemaDefinitions, id, property.Value.ReadOnly, out contentType, ref modelIdTopic)) { return false; } @@ -697,9 +722,11 @@ private bool TryValidateProperty(string name, ValueTracker property, return true; } - private bool TryValidatePropertyForms(string name, ArrayTracker forms, MapTracker? schemaDefinitions, ValueTracker? readOnly, out ValueTracker? contentType) + private bool TryValidatePropertyForms(string name, ArrayTracker forms, MapTracker? schemaDefinitions, ValueTracker id, ValueTracker? readOnly, out ValueTracker? contentType, ref ValueTracker? modelIdTopic) { - if (!TryValidateForms(forms, FormsKind.Property, schemaDefinitions, out contentType)) + bool isReadOnly = readOnly?.Value.Value == true; + + if (!TryValidateForms(forms, FormsKind.Property, schemaDefinitions, id, out contentType, ref modelIdTopic, isReadOnly)) { return false; } @@ -712,9 +739,9 @@ private bool TryValidatePropertyForms(string name, ArrayTracker forms, M if (writeOp != null) { - if (readOnly?.Value.Value == true) + if (isReadOnly) { - errorReporter.ReportError($"'{TDProperty.FormsName}' array contains '{TDForm.OpName}' property with value '{TDValues.OpWriteProp}' but the property has '{TDProperty.ReadOnlyName}' true.", writeOp.TokenIndex, readOnly.TokenIndex); + errorReporter.ReportError($"'{TDProperty.FormsName}' array contains '{TDForm.OpName}' property with value '{TDValues.OpWriteProp}' but the property has '{TDProperty.ReadOnlyName}' true.", writeOp.TokenIndex, readOnly?.TokenIndex ?? -1); hasError = true; } if (readOp == null) @@ -749,7 +776,7 @@ private bool TryValidatePropertyForms(string name, ArrayTracker forms, M return !hasError; } - private bool TryValidateEvents(MapTracker? evts, MapTracker? schemaDefinitions, HashSet serializationFormats) + private bool TryValidateEvents(MapTracker? evts, MapTracker? schemaDefinitions, ValueTracker id, HashSet serializationFormats, ref ValueTracker? modelIdTopic) { if (evts?.Entries == null) { @@ -760,7 +787,7 @@ private bool TryValidateEvents(MapTracker? evts, MapTracker> evt in evts.Entries) { - if (!TryValidateEvent(evt.Key, evt.Value, schemaDefinitions, out ValueTracker? contentType)) + if (!TryValidateEvent(evt.Key, evt.Value, schemaDefinitions, id, out ValueTracker? contentType, ref modelIdTopic)) { hasError = true; } @@ -773,7 +800,7 @@ private bool TryValidateEvents(MapTracker? evts, MapTracker evt, MapTracker? schemaDefinitions, out ValueTracker? contentType) + private bool TryValidateEvent(string name, ValueTracker evt, MapTracker? schemaDefinitions, ValueTracker id, out ValueTracker? contentType, ref ValueTracker? modelIdTopic) { if (evt.Value.Forms == null) { @@ -781,7 +808,7 @@ private bool TryValidateEvent(string name, ValueTracker evt, MapTracker contentType = null; return false; } - else if (!TryValidateForms(evt.Value.Forms, FormsKind.Event, schemaDefinitions, out contentType)) + else if (!TryValidateForms(evt.Value.Forms, FormsKind.Event, schemaDefinitions, id, out contentType, ref modelIdTopic)) { return false; } @@ -812,7 +839,7 @@ private bool TryValidateEvent(string name, ValueTracker evt, MapTracker return !hasError; } - private bool TryValidateForms(ArrayTracker forms, FormsKind formsKind, MapTracker? schemaDefinitions, out ValueTracker? contentType) + private bool TryValidateForms(ArrayTracker forms, FormsKind formsKind, MapTracker? schemaDefinitions, ValueTracker id, out ValueTracker? contentType, ref ValueTracker? modelIdTopic, bool isReadOnly = false) { contentType = null; @@ -826,7 +853,7 @@ private bool TryValidateForms(ArrayTracker forms, FormsKind formsKind, M foreach (ValueTracker form in forms.Elements) { - if (!TryValidateForm(form, formsKind, schemaDefinitions, out ValueTracker? formContentType)) + if (!TryValidateForm(form, formsKind, schemaDefinitions, id, out ValueTracker? formContentType, ref modelIdTopic, isReadOnly)) { hasError = true; } @@ -870,7 +897,7 @@ private bool TryValidateForms(ArrayTracker forms, FormsKind formsKind, M return !hasError; } - private bool TryValidateForm(ValueTracker form, FormsKind formsKind, MapTracker? schemaDefinitions, out ValueTracker? contentType) + private bool TryValidateForm(ValueTracker form, FormsKind formsKind, MapTracker? schemaDefinitions, ValueTracker id, out ValueTracker? contentType, ref ValueTracker? modelIdTopic, bool isReadOnly) { bool hasError = false; @@ -899,29 +926,6 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map hasError = true; } - if (form.Value.Topic == null) - { - if (formsKind == FormsKind.Root) - { - errorReporter.ReportError($"Root-level form is missing required '{TDForm.TopicName}' property.", form.TokenIndex); - hasError = true; - } - } - else - { - if (string.IsNullOrWhiteSpace(form.Value.Topic.Value.Value)) - { - errorReporter.ReportError($"Form '{TDForm.TopicName}' property has empty value.", form.Value.Topic.TokenIndex); - hasError = true; - } - - if (form.Value.ContentType == null) - { - errorReporter.ReportError($"Form missing '{TDForm.ContentTypeName}' property, which is required when '{TDForm.TopicName}' property present.", form.TokenIndex, form.Value.Topic.TokenIndex); - hasError = true; - } - } - if (form.Value.ContentType != null) { if (formsKind == FormsKind.Action || formsKind == FormsKind.Event) @@ -1010,6 +1014,10 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map } } + bool hasOpRead = form.Value.Op?.Elements?.Any(op => op.Value.Value == TDValues.OpReadProp || op.Value.Value == TDValues.OpReadAllProps) ?? false; + bool hasOpWrite = form.Value.Op?.Elements?.Any(op => op.Value.Value == TDValues.OpWriteProp || op.Value.Value == TDValues.OpWriteMultProps) ?? false; + bool hasOpSub = form.Value.Op?.Elements?.Any(op => op.Value.Value == TDValues.OpSubEvent || op.Value.Value == TDValues.OpSubAllEvents) ?? false; + if (form.Value.Op?.Elements != null) { foreach (IGrouping> dupOpGroup in form.Value.Op.Elements.GroupBy(op => op.Value.Value).Where(g => g.Count() > 1)) @@ -1020,15 +1028,12 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map if (formsKind == FormsKind.Root) { - bool hasReadAllProps = form.Value.Op.Elements.Any(op => op.Value.Value == TDValues.OpReadAllProps); - bool hasWriteMultProps = form.Value.Op.Elements.Any(op => op.Value.Value == TDValues.OpWriteMultProps); - bool hasSubAllEvents = form.Value.Op.Elements.Any(op => op.Value.Value == TDValues.OpSubAllEvents); - if (hasReadAllProps && hasSubAllEvents) + if (hasOpRead && hasOpSub) { errorReporter.ReportError($"A single form '{TDForm.OpName}' property cannot contain both '{TDValues.OpReadAllProps}' and '{TDValues.OpSubAllEvents}' values.", form.Value.Op.TokenIndex); hasError = true; } - if (hasWriteMultProps && hasSubAllEvents) + if (hasOpWrite && hasOpSub) { errorReporter.ReportError($"Form '{TDForm.OpName}' property cannot contain both '{TDValues.OpWriteMultProps}' and '{TDValues.OpSubAllEvents}' values.", form.Value.Op.TokenIndex); hasError = true; @@ -1036,6 +1041,28 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map } } + if (form.Value.Topic == null) + { + if (formsKind == FormsKind.Root) + { + errorReporter.ReportError($"Root-level form is missing required '{TDForm.TopicName}' property.", form.TokenIndex); + hasError = true; + } + } + else + { + if (!TryValidateTopic(form.Value.Topic, formsKind, id, hasOpRead, hasOpWrite, hasOpSub, ref modelIdTopic, isReadOnly)) + { + hasError = true; + } + + if (form.Value.ContentType == null) + { + errorReporter.ReportError($"Form missing '{TDForm.ContentTypeName}' property, which is required when '{TDForm.TopicName}' property present.", form.TokenIndex, form.Value.Topic.TokenIndex); + hasError = true; + } + } + if (form.Value.HeaderCode != null) { if (formsKind != FormsKind.Action) @@ -1116,6 +1143,162 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map return !hasError; } + private bool TryValidateTopic(ValueTracker topic, FormsKind formsKind, ValueTracker id, bool hasOpRead, bool hasOpWrite, bool hasOpSub, ref ValueTracker? modelIdTopic, bool isReadOnly) + { + FormsKind effectiveFormsKind = formsKind switch + { + FormsKind.Action => FormsKind.Action, + FormsKind.Property => FormsKind.Property, + FormsKind.Event => FormsKind.Event, + FormsKind.Root when hasOpRead || hasOpWrite => FormsKind.Property, + FormsKind.Root when hasOpSub => FormsKind.Event, + _ => FormsKind.Root, + }; + + bool hasError = false; + + if (topic.Value.Value.Length == 0) + { + errorReporter.ReportError($"Form '{TDForm.TopicName}' property has empty value.", topic.TokenIndex); + return false; + } + + if (topic.Value.Value.StartsWith('$')) + { + errorReporter.ReportError($"Form '{TDForm.TopicName}' property value starts with reserved character '$'.", topic.TokenIndex); + hasError = true; + } + + bool actionTokenPresent = false; + foreach (string level in topic.Value.Value.Split('/')) + { + if (level.Length == 0) + { + errorReporter.ReportError($"Form '{TDForm.TopicName}' property has value containing empty topic level.", topic.TokenIndex); + hasError = true; + } + else if (level.StartsWith('{') && level.EndsWith('}')) + { + string token = level[1..^1]; + if (token.Length == 0) + { + errorReporter.ReportError($"Form '{TDForm.TopicName}' property has value containing empty token '{{}}'.", topic.TokenIndex); + hasError = true; + } + else if (token.StartsWith("ex:")) + { + string exToken = token[3..]; + if (exToken.Length == 0) + { + errorReporter.ReportError($"Form '{TDForm.TopicName}' property has value containing empty custom token '{{ex:}}'.", topic.TokenIndex); + hasError = true; + } + else if (!exToken.All(c => char.IsAsciiLetter(c))) + { + errorReporter.ReportError($"Form '{TDForm.TopicName}' property has value containing custom token '{{{token}}}' that contains invalid character(s); only ASCII letters are allowed after the 'ex:' prefix.", topic.TokenIndex); + hasError = true; + } + } + else + { + if (token == MqttTopicTokens.ModelId) + { + if (modelIdTopic == null) + { + modelIdTopic = topic; + } + } + else + { + switch (effectiveFormsKind) + { + case FormsKind.Action: + if (token != MqttTopicTokens.ActionInvokerId && token != MqttTopicTokens.ActionExecutorId) + { + errorReporter.ReportError($"Form '{TDForm.TopicName}' property has value containing token '{{{token}}}' that does not start with 'ex:' and that is not valid in an action topic; only '{{{MqttTopicTokens.ModelId}}}', '{{{MqttTopicTokens.ActionInvokerId}}}', and '{{{MqttTopicTokens.ActionExecutorId}}}' are allowed.", topic.TokenIndex); + hasError = true; + } + break; + case FormsKind.Property: + if (token == MqttTopicTokens.PropertyAction) + { + actionTokenPresent = true; + } + else if (token != MqttTopicTokens.PropertyConsumerId && token != MqttTopicTokens.PropertyMaintainerId) + { + errorReporter.ReportError($"Form '{TDForm.TopicName}' property has value containing token '{{{token}}}' that does not start with 'ex:' and that is not valid in a property topic; only '{{{MqttTopicTokens.ModelId}}}', '{{{MqttTopicTokens.PropertyAction}}}', '{{{MqttTopicTokens.PropertyConsumerId}}}', and '{{{MqttTopicTokens.PropertyMaintainerId}}}' are allowed.", topic.TokenIndex); + hasError = true; + } + break; + case FormsKind.Event: + if (token != MqttTopicTokens.EventSenderId) + { + errorReporter.ReportError($"Form '{TDForm.TopicName}' property has value containing token '{{{token}}}' that does not start with 'ex:' and that is not valid in an event topic; only '{{{MqttTopicTokens.ModelId}}}' and '{{{MqttTopicTokens.EventSenderId}}}' are allowed.", topic.TokenIndex); + hasError = true; + } + break; + } + } + } + } + else + { + if (level.Any(c => c is < '!' or > '~' or '+' or '#' or '{' or '}')) + { + errorReporter.ReportError($"Form '{TDForm.TopicName}' property has value containing non-token topic level '{level}' that contains invalid character(s); only printable ASCII characters not including space, '\"', '+', '#', '{{', or '}}' are allowed.", topic.TokenIndex); + hasError = true; + } + } + } + + string partiallyResolvedTopic = topic.Value.Value.Replace($"{{{MqttTopicTokens.ModelId}}}", id.Value.Value); + if (effectiveFormsKind == FormsKind.Property) + { + if (actionTokenPresent) + { + string readResolvedTopic = partiallyResolvedTopic.Replace($"{{{MqttTopicTokens.PropertyAction}}}", MqttTopicTokens.PropertyActionValues.Read); + string writeResolvedTopic = partiallyResolvedTopic.Replace($"{{{MqttTopicTokens.PropertyAction}}}", MqttTopicTokens.PropertyActionValues.Write); + + if (hasOpRead) + { + errorReporter.RegisterTopicInThing(readResolvedTopic, topic.TokenIndex, topic.Value.Value); + } + + if (hasOpWrite) + { + errorReporter.RegisterTopicInThing(writeResolvedTopic, topic.TokenIndex, topic.Value.Value); + } + + if (!hasOpRead && !hasOpWrite) + { + errorReporter.RegisterTopicInThing(readResolvedTopic, topic.TokenIndex, topic.Value.Value); + if (!isReadOnly) + { + errorReporter.RegisterTopicInThing(writeResolvedTopic, topic.TokenIndex, topic.Value.Value); + } + } + } + else + { + if ((hasOpRead && hasOpWrite) || (!hasOpRead && !hasOpWrite && !isReadOnly)) + { + errorReporter.ReportError($"Form '{TDForm.TopicName}' property value is missing required '{{{MqttTopicTokens.PropertyAction}}}' token for a property form that supports both read and write operations.", topic.TokenIndex); + hasError = true; + } + else + { + errorReporter.RegisterTopicInThing(partiallyResolvedTopic, topic.TokenIndex, topic.Value.Value); + } + } + } + else + { + errorReporter.RegisterTopicInThing(partiallyResolvedTopic, topic.TokenIndex, topic.Value.Value); + } + + return !hasError; + } + private bool TryValidateSchemaReferences(ArrayTracker schemaReferences, FormsKind formsKind, string propertyName, MapTracker? schemaDefinitions) { bool hasError = false; diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ValueReference.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ValueReference.cs new file mode 100644 index 0000000000..79882fac06 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ValueReference.cs @@ -0,0 +1,4 @@ +namespace Azure.Iot.Operations.CodeGeneration +{ + public record ValueReference(string Filename, int LineNumber, string Value); +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs index 6aafee8444..e385571152 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs @@ -122,7 +122,7 @@ internal static List GenerateActionEnvoys(ErrorReporter errorReporte private static bool DoesTopicReferToExecutor(string? topic) { - return topic != null && topic.Contains(MqttTopicTokens.CommandExecutorId); + return topic != null && topic.Contains($"{{{MqttTopicTokens.ActionExecutorId}}}"); } } } diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/MqttTopicTokens.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/MqttTopicTokens.cs deleted file mode 100644 index c4f41b2330..0000000000 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/MqttTopicTokens.cs +++ /dev/null @@ -1,58 +0,0 @@ -namespace Azure.Iot.Operations.EnvoyGenerator -{ - /// - /// Static class that defines string values of the replaceable components used in topic patterns. - /// - public static class MqttTopicTokens - { - /// - /// Token representing the ID of a service; when generated from a DTDL model, this is the ID of the DTDL Interface. - /// - public const string ModelId = "{modelId}"; - - /// - /// Token representing the name of a Command. - /// - public const string CommandName = "{commandName}"; - - /// - /// Token representing the ID of a Command executor, should be used only in Command topic patterns. - /// - public const string CommandExecutorId = "{executorId}"; - - /// - /// Token representing the MQTT Client ID of a Command invoker, should be used only in Command topic patterns. - /// - public const string CommandInvokerId = "{invokerClientId}"; - - /// - /// Token representing the name of a Telemetry. - /// - public const string TelemetryName = "{telemetryName}"; - - /// - /// Token representing the ID of a Telemetry sender, should be used only in Telemetry topic patterns. - /// - public const string TelemetrySenderId = "{senderId}"; - - /// - /// Token representing the name of a Property. - /// - public const string PropertyName = "{propertyName}"; - - /// - /// Token representing the ID of a Property maintainer, should be used only in Property topic patterns. - /// - public const string PropertyMaintainerId = "{maintainerId}"; - - /// - /// Token representing the MQTT Client ID of a Property consumer, should be used only in Property topic patterns. - /// - public const string PropertyConsumerId = "{consumerClientId}"; - - /// - /// Token representing a Property action, 'read' or 'write'. - /// - public const string PropertyAction = "{action}"; - } -} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/PropertyEnvoyGenerator.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/PropertyEnvoyGenerator.cs index 7d33678320..9968e54dcc 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/PropertyEnvoyGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/PropertyEnvoyGenerator.cs @@ -237,7 +237,7 @@ internal static List GeneratePropertyEnvoys(ErrorReporter errorRep private static bool DoesTopicReferToMaintainer(string? topic) { - return topic != null && topic.Contains(MqttTopicTokens.PropertyMaintainerId); + return topic != null && topic.Contains($"{{{MqttTopicTokens.PropertyMaintainerId}}}"); } } } diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandExecutor.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandExecutor.tt index dc1c0c46f8..0b291fe392 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandExecutor.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandExecutor.tt @@ -35,12 +35,11 @@ namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage. public <#=this.componentName.GetTypeName(TargetLanguage.CSharp)#>(ApplicationContext applicationContext, IMqttPubSubClient mqttClient) : base(applicationContext, mqttClient, "<#=this.commandName.AsGiven#>", new <#=string.Format(this.serializerClassName, this.TypeParams())#>()) { - TopicTokenMap["modelId"] = "<#=this.modelId#>"; + TopicTokenMap["<#=MqttTopicTokens.ModelId#>"] = "<#=this.modelId#>"; if (mqttClient.ClientId != null) { - TopicTokenMap["executorId"] = mqttClient.ClientId; + TopicTokenMap["<#=MqttTopicTokens.ActionExecutorId#>"] = mqttClient.ClientId; } - TopicTokenMap["commandName"] = "<#=this.commandName.AsGiven#>"; } } } diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandInvoker.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandInvoker.tt index 11b66dd10d..e9fbfebbfe 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandInvoker.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandInvoker.tt @@ -29,12 +29,11 @@ namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage. { this.ResponseTopicPrefix = "clients/{invokerClientId}"; // default value, can be overwritten by user code - TopicTokenMap["modelId"] = "<#=this.modelId#>"; + TopicTokenMap["<#=MqttTopicTokens.ModelId#>"] = "<#=this.modelId#>"; if (mqttClient.ClientId != null) { - TopicTokenMap["invokerClientId"] = mqttClient.ClientId; + TopicTokenMap["<#=MqttTopicTokens.ActionInvokerId#>"] = mqttClient.ClientId; } - TopicTokenMap["commandName"] = "<#=this.commandName.AsGiven#>"; } } } diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetryReceiver.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetryReceiver.tt index 9485812f9f..4358d30e9c 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetryReceiver.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetryReceiver.tt @@ -30,10 +30,7 @@ namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage. public <#=this.componentName.GetTypeName(TargetLanguage.CSharp)#>(ApplicationContext applicationContext, IMqttPubSubClient mqttClient) : base(applicationContext, mqttClient, new <#=this.serializerClassName#>()) { - TopicTokenMap["modelId"] = "<#=this.modelId#>"; -<# if (!this.telemetryName.IsEmpty) { #> - TopicTokenMap["telemetryName"] = "<#=this.telemetryName.AsGiven#>"; -<# } #> + TopicTokenMap["<#=MqttTopicTokens.ModelId#>"] = "<#=this.modelId#>"; } } } diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetrySender.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetrySender.tt index f1ccb61cc1..e810f81d02 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetrySender.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetrySender.tt @@ -26,14 +26,11 @@ namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage. public <#=this.componentName.GetTypeName(TargetLanguage.CSharp)#>(ApplicationContext applicationContext, IMqttPubSubClient mqttClient) : base(applicationContext, mqttClient, new <#=this.serializerClassName#>()) { - TopicTokenMap["modelId"] = "<#=this.modelId#>"; + TopicTokenMap["<#=MqttTopicTokens.ModelId#>"] = "<#=this.modelId#>"; if (mqttClient.ClientId != null) { - TopicTokenMap["senderId"] = mqttClient.ClientId; + TopicTokenMap["<#=MqttTopicTokens.EventSenderId#>"] = mqttClient.ClientId; } -<# if (!this.telemetryName.IsEmpty) { #> - TopicTokenMap["telemetryName"] = "<#=this.telemetryName.AsGiven#>"; -<# } #> } } } diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyConsumer.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyConsumer.tt index 8f4741a322..f10c07af04 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyConsumer.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyConsumer.tt @@ -45,15 +45,12 @@ namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage. { RequestTopicPattern = AttributeRetriever.GetAttribute(this)?.Topic ?? string.Empty; - TopicTokenMap["action"] = "read"; - TopicTokenMap["modelId"] = "<#=this.modelId#>"; + TopicTokenMap["<#=MqttTopicTokens.PropertyAction#>"] = "<#=MqttTopicTokens.PropertyActionValues.Read#>"; + TopicTokenMap["<#=MqttTopicTokens.ModelId#>"] = "<#=this.modelId#>"; if (mqttClient.ClientId != null) { - TopicTokenMap["consumerClientId"] = mqttClient.ClientId; + TopicTokenMap["<#=MqttTopicTokens.PropertyConsumerId#>"] = mqttClient.ClientId; } -<# if (!this.propertyName.IsEmpty) { #> - TopicTokenMap["propertyName"] = "<#=this.propertyName.AsGiven#>"; -<# } #> } } <# } #> @@ -79,15 +76,12 @@ namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage. { RequestTopicPattern = AttributeRetriever.GetAttribute(this)?.Topic ?? string.Empty; - TopicTokenMap["action"] = "write"; - TopicTokenMap["modelId"] = "<#=this.modelId#>"; + TopicTokenMap["<#=MqttTopicTokens.PropertyAction#>"] = "<#=MqttTopicTokens.PropertyActionValues.Write#>"; + TopicTokenMap["<#=MqttTopicTokens.ModelId#>"] = "<#=this.modelId#>"; if (mqttClient.ClientId != null) { - TopicTokenMap["consumerClientId"] = mqttClient.ClientId; + TopicTokenMap["<#=MqttTopicTokens.PropertyConsumerId#>"] = mqttClient.ClientId; } -<# if (!this.propertyName.IsEmpty) { #> - TopicTokenMap["propertyName"] = "<#=this.propertyName.AsGiven#>"; -<# } #> } } <# } #> diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyMaintainer.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyMaintainer.tt index e9327156f9..0a21209941 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyMaintainer.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyMaintainer.tt @@ -47,15 +47,12 @@ namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage. ServiceGroupId = string.Empty; RequestTopicPattern = AttributeRetriever.GetAttribute(this)?.Topic ?? string.Empty; - TopicTokenMap["action"] = "read"; - TopicTokenMap["modelId"] = "<#=this.modelId#>"; + TopicTokenMap["<#=MqttTopicTokens.PropertyAction#>"] = "<#=MqttTopicTokens.PropertyActionValues.Read#>"; + TopicTokenMap["<#=MqttTopicTokens.ModelId#>"] = "<#=this.modelId#>"; if (mqttClient.ClientId != null) { - TopicTokenMap["maintainerId"] = mqttClient.ClientId; + TopicTokenMap["<#=MqttTopicTokens.PropertyMaintainerId#>"] = mqttClient.ClientId; } -<# if (!this.propertyName.IsEmpty) { #> - TopicTokenMap["propertyName"] = "<#=this.propertyName.AsGiven#>"; -<# } #> } } <# } #> @@ -82,15 +79,12 @@ namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage. { RequestTopicPattern = AttributeRetriever.GetAttribute(this)?.Topic ?? string.Empty; - TopicTokenMap["action"] = "write"; - TopicTokenMap["modelId"] = "<#=this.modelId#>"; + TopicTokenMap["<#=MqttTopicTokens.PropertyAction#>"] = "<#=MqttTopicTokens.PropertyActionValues.Write#>"; + TopicTokenMap["<#=MqttTopicTokens.ModelId#>"] = "<#=this.modelId#>"; if (mqttClient.ClientId != null) { - TopicTokenMap["maintainerId"] = mqttClient.ClientId; + TopicTokenMap["<#=MqttTopicTokens.PropertyMaintainerId#>"] = mqttClient.ClientId; } -<# if (!this.propertyName.IsEmpty) { #> - TopicTokenMap["propertyName"] = "<#=this.propertyName.AsGiven#>"; -<# } #> } } <# } #> diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Service/t4/DotNetService.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Service/t4/DotNetService.tt index 086349d942..0d55d1ff6b 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Service/t4/DotNetService.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Service/t4/DotNetService.tt @@ -48,8 +48,8 @@ namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage. /// The MQTT client to use. /// /// The topic token replacement map to use for all operations by default. Generally, this will include the token values - /// for topic tokens such as "modelId" which should be the same for the duration of this service's lifetime. Note that - /// additional topic tokens can be specified per-telemetry message. + /// for topic tokens such as "<#=MqttTopicTokens.ModelId#>" which should be the same for the duration of this service's lifetime. Note that + /// additional topic tokens can be specified per event message. /// public Service(ApplicationContext applicationContext, IMqttPubSubClient mqttClient, Dictionary? topicTokenMap = null) { @@ -95,12 +95,12 @@ namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage. } <# foreach (var actionSpec in this.actionSpecs) { #> - this.<#=actionSpec.Executor.GetVariableName(TargetLanguage.CSharp)#>.TopicTokenMap.TryAdd("executorId", clientId); + this.<#=actionSpec.Executor.GetVariableName(TargetLanguage.CSharp)#>.TopicTokenMap.TryAdd("<#=MqttTopicTokens.ActionExecutorId#>", clientId); <# } #> <# foreach (var propSpec in this.propSpecs) { #> - this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "responder")#>.TopicTokenMap.TryAdd("maintainerId", clientId); + this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "responder")#>.TopicTokenMap.TryAdd("<#=MqttTopicTokens.PropertyMaintainerId#>", clientId); <# if (propSpec.WriteReqSchema != null) { #> - this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "responder")#>.TopicTokenMap.TryAdd("maintainerId", clientId); + this.<#=propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "responder")#>.TopicTokenMap.TryAdd("<#=MqttTopicTokens.PropertyMaintainerId#>", clientId); <# } #> <# } #> } @@ -364,7 +364,7 @@ namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage. /// The MQTT client to use. /// /// The topic token replacement map to use for all operations by default. Generally, this will include the token values - /// for topic tokens such as "modelId" which should be the same for the duration of this client's lifetime. + /// for topic tokens such as "<#=MqttTopicTokens.ModelId#>" which should be the same for the duration of this client's lifetime. /// public Client(ApplicationContext applicationContext, IMqttPubSubClient mqttClient, Dictionary? topicTokenMap = null) { diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutor.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutor.tt index 4c1056fb22..09a6272074 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutor.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutor.tt @@ -127,9 +127,8 @@ where .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("modelId".to_string(), "<#=this.modelId#>".to_string()); - topic_token_map.insert("executorId".to_string(), client.client_id().to_string()); - topic_token_map.insert("commandName".to_string(), "<#=this.commandName.AsGiven#>".to_string()); + topic_token_map.insert("<#=MqttTopicTokens.ModelId#>".to_string(), "<#=this.modelId#>".to_string()); + topic_token_map.insert("<#=MqttTopicTokens.ActionExecutorId#>".to_string(), client.client_id().to_string()); let executor_options = executor_options_builder .request_topic_pattern("<#=this.topicPattern#>") diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.tt index b62fc8880f..149bdb930e 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.tt @@ -158,9 +158,8 @@ where .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("modelId".to_string(), "<#=this.modelId#>".to_string()); - topic_token_map.insert("invokerClientId".to_string(), client.client_id().to_string()); - topic_token_map.insert("commandName".to_string(), "<#=this.commandName.AsGiven#>".to_string()); + topic_token_map.insert("<#=MqttTopicTokens.ModelId#>".to_string(), "<#=this.modelId#>".to_string()); + topic_token_map.insert("<#=MqttTopicTokens.ActionInvokerId#>".to_string(), client.client_id().to_string()); let invoker_options = invoker_options_builder .request_topic_pattern("<#=this.topicPattern#>") diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.tt index 03ca52a400..84743643cc 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.tt @@ -49,10 +49,7 @@ where .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("modelId".to_string(), "<#=this.modelId#>".to_string()); -<# if (!this.telemetryName.IsEmpty) { #> - topic_token_map.insert("telemetryName".to_string(), "<#=this.telemetryName.AsGiven#>".to_string()); -<# } #> + topic_token_map.insert("<#=MqttTopicTokens.ModelId#>".to_string(), "<#=this.modelId#>".to_string()); let receiver_options = receiver_options_builder .topic_pattern("<#=this.topicPattern#>") diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.tt index 58e6ecb476..2623a68b54 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.tt @@ -116,12 +116,8 @@ where .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("modelId".to_string(), "<#=this.modelId#>".to_string()); - topic_token_map.insert("senderId".to_string(), client.client_id().to_string()); - -<# if (!this.telemetryName.IsEmpty) { #> - topic_token_map.insert("telemetryName".to_string(), "<#=this.telemetryName.AsGiven#>".to_string()); -<# } #> + topic_token_map.insert("<#=MqttTopicTokens.ModelId#>".to_string(), "<#=this.modelId#>".to_string()); + topic_token_map.insert("<#=MqttTopicTokens.EventSenderId#>".to_string(), client.client_id().to_string()); let sender_options = sender_options_builder .topic_pattern("<#=this.topicPattern#>") diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyConsumer.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyConsumer.tt index 52793a1e16..fcd9c03f6e 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyConsumer.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyConsumer.tt @@ -239,12 +239,9 @@ where .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("action".to_string(), "read".to_string()); - topic_token_map.insert("modelId".to_string(), "<#=this.modelId#>".to_string()); - topic_token_map.insert("consumerClientId".to_string(), client.client_id().to_string()); -<# if (!this.propertyName.IsEmpty) { #> - topic_token_map.insert("propertyName".to_string(), "<#=this.propertyName.AsGiven#>".to_string()); -<# } #> + topic_token_map.insert("<#=MqttTopicTokens.PropertyAction#>".to_string(), "<#=MqttTopicTokens.PropertyActionValues.Read#>".to_string()); + topic_token_map.insert("<#=MqttTopicTokens.ModelId#>".to_string(), "<#=this.modelId#>".to_string()); + topic_token_map.insert("<#=MqttTopicTokens.PropertyConsumerId#>".to_string(), client.client_id().to_string()); let invoker_options = invoker_options_builder .request_topic_pattern("<#=this.readTopicPattern#>") @@ -371,12 +368,9 @@ where .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("action".to_string(), "write".to_string()); - topic_token_map.insert("modelId".to_string(), "<#=this.modelId#>".to_string()); - topic_token_map.insert("consumerClientId".to_string(), client.client_id().to_string()); -<# if (!this.propertyName.IsEmpty) { #> - topic_token_map.insert("propertyName".to_string(), "<#=this.propertyName.AsGiven#>".to_string()); -<# } #> + topic_token_map.insert("<#=MqttTopicTokens.PropertyAction#>".to_string(), "<#=MqttTopicTokens.PropertyActionValues.Write#>".to_string()); + topic_token_map.insert("<#=MqttTopicTokens.ModelId#>".to_string(), "<#=this.modelId#>".to_string()); + topic_token_map.insert("<#=MqttTopicTokens.PropertyConsumerId#>".to_string(), client.client_id().to_string()); let invoker_options = invoker_options_builder .request_topic_pattern("<#=this.readTopicPattern#>") diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyMaintainer.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyMaintainer.tt index 44e7aa8d5f..287c3f93a3 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyMaintainer.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyMaintainer.tt @@ -166,12 +166,9 @@ where .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("action".to_string(), "read".to_string()); - topic_token_map.insert("modelId".to_string(), "<#=this.modelId#>".to_string()); - topic_token_map.insert("maintainerId".to_string(), client.client_id().to_string()); -<# if (!this.propertyName.IsEmpty) { #> - topic_token_map.insert("propertyName".to_string(), "<#=this.propertyName.AsGiven#>".to_string()); -<# } #> + topic_token_map.insert("<#=MqttTopicTokens.PropertyAction#>".to_string(), "<#=MqttTopicTokens.PropertyActionValues.Read#>".to_string()); + topic_token_map.insert("<#=MqttTopicTokens.ModelId#>".to_string(), "<#=this.modelId#>".to_string()); + topic_token_map.insert("<#=MqttTopicTokens.PropertyMaintainerId#>".to_string(), client.client_id().to_string()); let executor_options = executor_options_builder .request_topic_pattern("<#=this.readTopicPattern#>") @@ -240,12 +237,9 @@ where .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("action".to_string(), "write".to_string()); - topic_token_map.insert("modelId".to_string(), "<#=this.modelId#>".to_string()); - topic_token_map.insert("maintainerId".to_string(), client.client_id().to_string()); -<# if (!this.propertyName.IsEmpty) { #> - topic_token_map.insert("propertyName".to_string(), "<#=this.propertyName.AsGiven#>".to_string()); -<# } #> + topic_token_map.insert("<#=MqttTopicTokens.PropertyAction#>".to_string(), "<#=MqttTopicTokens.PropertyActionValues.Write#>".to_string()); + topic_token_map.insert("<#=MqttTopicTokens.ModelId#>".to_string(), "<#=this.modelId#>".to_string()); + topic_token_map.insert("<#=MqttTopicTokens.PropertyMaintainerId#>".to_string(), client.client_id().to_string()); let executor_options = executor_options_builder .request_topic_pattern("<#=this.writeTopicPattern#>") diff --git a/codegen2/src/Dtdl2Wot/Command/code/CommandAffordance.cs b/codegen2/src/Dtdl2Wot/Command/code/CommandAffordance.cs index 02ef88518f..55aceab647 100644 --- a/codegen2/src/Dtdl2Wot/Command/code/CommandAffordance.cs +++ b/codegen2/src/Dtdl2Wot/Command/code/CommandAffordance.cs @@ -30,7 +30,7 @@ public CommandAffordance(DTCommandInfo dtCommand, int mqttVersion, bool usesType this.dtCommand = dtCommand; this.usesTypes = usesTypes; this.contentType = contentType; - this.commandTopic = commandTopic.Replace(MqttTopicTokens.CommandName, this.dtCommand.Name); + this.commandTopic = commandTopic.Replace(DtdlMqttTopicTokens.CommandName, this.dtCommand.Name); this.serviceGroupId = serviceGroupId; this.isResponseSchemaResult = dtCommand.Response?.Schema != null && dtCommand.Response.Schema.SupplementalTypes.Contains(new Dtmi(string.Format(DtdlMqttExtensionValues.ResultAdjunctTypeFormat, mqttVersion))); diff --git a/codegen2/src/Dtdl2Wot/DtdlMqttTopicTokens.cs b/codegen2/src/Dtdl2Wot/DtdlMqttTopicTokens.cs new file mode 100644 index 0000000000..0d00a69447 --- /dev/null +++ b/codegen2/src/Dtdl2Wot/DtdlMqttTopicTokens.cs @@ -0,0 +1,28 @@ +namespace Dtdl2Wot +{ + /// + /// Static class that defines string values of the replaceable components used in topic patterns. + /// + public static class DtdlMqttTopicTokens + { + /// + /// Token representing the name of a Command. + /// + public const string CommandName = "{commandName}"; + + /// + /// Token representing the name of a Telemetry. + /// + public const string TelemetryName = "{telemetryName}"; + + /// + /// Token representing the name of a Property. + /// + public const string PropertyName = "{propertyName}"; + + /// + /// Token representing a Property action, 'read' or 'write'. + /// + public const string PropertyAction = "{action}"; + } +} diff --git a/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs b/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs index 0cced8531e..4ab494129e 100644 --- a/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs +++ b/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs @@ -37,8 +37,8 @@ public InterfaceThing(IReadOnlyDictionary modelDict, Dtmi in this.telemServiceGroupId = dtInterface.SupplementalProperties.TryGetValue(string.Format(DtdlMqttExtensionValues.TelemServiceGroupIdPropertyFormat, mqttVersion), out object? telemServiceGroupIdObj) ? (string)telemServiceGroupIdObj : null; this.cmdServiceGroupId = dtInterface.SupplementalProperties.TryGetValue(string.Format(DtdlMqttExtensionValues.CmdServiceGroupIdPropertyFormat, mqttVersion), out object? cmdServiceGroupIdObj) ? (string)cmdServiceGroupIdObj : null; - this.aggregateTelemetries = this.telemetryTopic != null && !this.telemetryTopic.Contains(MqttTopicTokens.TelemetryName); - this.aggregateProperties = this.propertyTopic != null && !this.propertyTopic.Contains(MqttTopicTokens.PropertyName); + this.aggregateTelemetries = this.telemetryTopic != null && !this.telemetryTopic.Contains(DtdlMqttTopicTokens.TelemetryName); + this.aggregateProperties = this.propertyTopic != null && !this.propertyTopic.Contains(DtdlMqttTopicTokens.PropertyName); string payloadFormat = (string)dtInterface.SupplementalProperties[string.Format(DtdlMqttExtensionValues.PayloadFormatPropertyFormat, mqttVersion)]; this.usesTypes = payloadFormat != PayloadFormat.Raw && payloadFormat != PayloadFormat.Custom; diff --git a/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt b/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt index 7d08862b85..40ad5a9e1b 100644 --- a/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt +++ b/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt @@ -83,7 +83,7 @@ } ], <# } #> - "dtv:topic": "<#=this.propertyTopic.Replace(MqttTopicTokens.PropertyAction, "write")#>", + "dtv:topic": "<#=this.propertyTopic.Replace(DtdlMqttTopicTokens.PropertyAction, "write")#>", "op": "writemultipleproperties" }, <# } #> @@ -97,7 +97,7 @@ } ], <# } #> - "dtv:topic": "<#=this.propertyTopic.Replace(MqttTopicTokens.PropertyAction, "read")#>", + "dtv:topic": "<#=this.propertyTopic.Replace(DtdlMqttTopicTokens.PropertyAction, "read")#>", "op": "readallproperties" } <# } #> diff --git a/codegen2/src/Dtdl2Wot/MqttTopicTokens.cs b/codegen2/src/Dtdl2Wot/MqttTopicTokens.cs deleted file mode 100644 index 9fe79d8dd6..0000000000 --- a/codegen2/src/Dtdl2Wot/MqttTopicTokens.cs +++ /dev/null @@ -1,58 +0,0 @@ -namespace Dtdl2Wot -{ - /// - /// Static class that defines string values of the replaceable components used in topic patterns. - /// - public static class MqttTopicTokens - { - /// - /// Token representing the ID of a service; when generated from a DTDL model, this is the ID of the DTDL Interface. - /// - public const string ModelId = "{modelId}"; - - /// - /// Token representing the name of a Command. - /// - public const string CommandName = "{commandName}"; - - /// - /// Token representing the ID of a Command executor, should be used only in Command topic patterns. - /// - public const string CommandExecutorId = "{executorId}"; - - /// - /// Token representing the MQTT Client ID of a Command invoker, should be used only in Command topic patterns. - /// - public const string CommandInvokerId = "{invokerClientId}"; - - /// - /// Token representing the name of a Telemetry. - /// - public const string TelemetryName = "{telemetryName}"; - - /// - /// Token representing the ID of a Telemetry sender, should be used only in Telemetry topic patterns. - /// - public const string TelemetrySenderId = "{senderId}"; - - /// - /// Token representing the name of a Property. - /// - public const string PropertyName = "{propertyName}"; - - /// - /// Token representing the ID of a Property maintainer, should be used only in Property topic patterns. - /// - public const string PropertyMaintainerId = "{maintainerId}"; - - /// - /// Token representing the MQTT Client ID of a Property consumer, should be used only in Property topic patterns. - /// - public const string PropertyConsumerId = "{consumerClientId}"; - - /// - /// Token representing a Property action, 'read' or 'write'. - /// - public const string PropertyAction = "{action}"; - } -} diff --git a/codegen2/src/Dtdl2Wot/Property/code/PropertyAffordance.cs b/codegen2/src/Dtdl2Wot/Property/code/PropertyAffordance.cs index e6ab307f7e..3cd0b8e31e 100644 --- a/codegen2/src/Dtdl2Wot/Property/code/PropertyAffordance.cs +++ b/codegen2/src/Dtdl2Wot/Property/code/PropertyAffordance.cs @@ -24,8 +24,8 @@ public PropertyAffordance(DTPropertyInfo dtProperty, int mqttVersion, bool usesT this.dtProperty = dtProperty; this.usesTypes = usesTypes; this.contentType = contentType; - this.separate = propertyTopic.Contains(MqttTopicTokens.PropertyName); - this.propertyTopic = propertyTopic.Replace(MqttTopicTokens.PropertyName, this.dtProperty.Name); + this.separate = propertyTopic.Contains(DtdlMqttTopicTokens.PropertyName); + this.propertyTopic = propertyTopic.Replace(DtdlMqttTopicTokens.PropertyName, this.dtProperty.Name); this.isSchemaPropertyResult = dtProperty.Schema.SupplementalTypes.Contains(new Dtmi(string.Format(DtdlMqttExtensionValues.PropertyResultAdjunctTypeFormat, mqttVersion))); DTFieldInfo? valueField = (dtProperty.Schema as DTObjectInfo)?.Fields?.FirstOrDefault(f => f.SupplementalTypes.Contains(new Dtmi(string.Format(DtdlMqttExtensionValues.PropertyValueAdjunctTypeFormat, mqttVersion)))); diff --git a/codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.tt b/codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.tt index c0b1d2976b..f751fa2e84 100644 --- a/codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.tt +++ b/codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.tt @@ -25,7 +25,7 @@ ], <# } #> <# if (this.separate) { #> - "dtv:topic": "<#=this.propertyTopic.Replace(MqttTopicTokens.PropertyAction, "write")#>", + "dtv:topic": "<#=this.propertyTopic.Replace(DtdlMqttTopicTokens.PropertyAction, "write")#>", <# } #> "op": "writeproperty" }, @@ -42,7 +42,7 @@ ], <# } #> <# if (this.separate) { #> - "dtv:topic": "<#=this.propertyTopic.Replace(MqttTopicTokens.PropertyAction, "read")#>", + "dtv:topic": "<#=this.propertyTopic.Replace(DtdlMqttTopicTokens.PropertyAction, "read")#>", <# } #> "op": "readproperty" } diff --git a/codegen2/src/Dtdl2Wot/Telemetry/code/TelemetryAffordance.cs b/codegen2/src/Dtdl2Wot/Telemetry/code/TelemetryAffordance.cs index bb5f3da174..1937385d7c 100644 --- a/codegen2/src/Dtdl2Wot/Telemetry/code/TelemetryAffordance.cs +++ b/codegen2/src/Dtdl2Wot/Telemetry/code/TelemetryAffordance.cs @@ -17,8 +17,8 @@ public TelemetryAffordance(DTTelemetryInfo dtTelemetry, bool usesTypes, string c this.dtTelemetry = dtTelemetry; this.usesTypes = usesTypes; this.contentType = contentType; - this.separate = telemetryTopic.Contains(MqttTopicTokens.TelemetryName); - this.telemetryTopic = telemetryTopic.Replace(MqttTopicTokens.TelemetryName, this.dtTelemetry.Name); + this.separate = telemetryTopic.Contains(DtdlMqttTopicTokens.TelemetryName); + this.telemetryTopic = telemetryTopic.Replace(DtdlMqttTopicTokens.TelemetryName, this.dtTelemetry.Name); this.serviceGroupId = serviceGroupId; this.thingDescriber = thingDescriber; From f4c277ad0056e15b6d6d30a578e13b22579a3f61 Mon Sep 17 00:00:00 2001 From: Auto Gen Date: Thu, 18 Dec 2025 09:31:51 -0800 Subject: [PATCH 25/52] automatically determine source subdir from selected language --- codegen2/eval/aio/gen.sh | 8 ++++---- codegen2/eval/g1.sh | 2 +- codegen2/eval/g2.sh | 2 +- codegen2/eval/gen.sh | 20 +++++++++---------- codegen2/eval/gen0.sh | 18 ++++++++--------- .../ArgBinder.cs | 5 ----- .../CommandHandler.cs | 14 ++++++------- .../OptionContainer.cs | 3 --- .../Program.cs | 8 -------- 9 files changed, 32 insertions(+), 48 deletions(-) diff --git a/codegen2/eval/aio/gen.sh b/codegen2/eval/aio/gen.sh index acbbd3897c..5b93eb2350 100644 --- a/codegen2/eval/aio/gen.sh +++ b/codegen2/eval/aio/gen.sh @@ -12,8 +12,8 @@ $genFromDtdl --modelFile ./eng/dtdl/device-discovery-service.json --outDir ./eng [[ -d ./eng/dtdl/FromWot/AssetAndDeviceRegistry ]] && rm -r ./eng/dtdl/FromWot/AssetAndDeviceRegistry $genFromWot --thingFiles ./eng/dtdl/AdrBaseService.TD.json --outDir ./eng/dtdl/FromWot/AssetAndDeviceRegistry --lang csharp --namespace AdrBaseService --workingDir obj/akri/AdrBaseService --sdkPath ../../../dotnet/src/Azure.Iot.Operations.Protocol $genFromWot --thingFiles ./eng/dtdl/DeviceDiscoveryService.TD.json --outDir ./eng/dtdl/FromWot/AssetAndDeviceRegistry --lang csharp --namespace DeviceDiscoveryService --workingDir obj/akri/DeviceDiscoveryService --sdkPath ../../../dotnet/src/Azure.Iot.Operations.Protocol -$genFromWot --thingFiles ./eng/dtdl/AdrBaseService.TD.json --outDir ./eng/dtdl/FromWot/AssetAndDeviceRegistry/adr_base_gen --srcSubdir src --lang rust --namespace AdrBaseService --workingDir target/akri/AdrBaseService --sdkPath ../../../rust -$genFromWot --thingFiles ./eng/dtdl/DeviceDiscoveryService.TD.json --outDir ./eng/dtdl/FromWot/AssetAndDeviceRegistry/device_discovery_gen --srcSubdir src --lang rust --namespace DeviceDiscoveryService --workingDir target/akri/DeviceDiscoveryService --sdkPath ../../../rust +$genFromWot --thingFiles ./eng/dtdl/AdrBaseService.TD.json --outDir ./eng/dtdl/FromWot/AssetAndDeviceRegistry/adr_base_gen --lang rust --namespace AdrBaseService --workingDir target/akri/AdrBaseService --sdkPath ../../../rust +$genFromWot --thingFiles ./eng/dtdl/DeviceDiscoveryService.TD.json --outDir ./eng/dtdl/FromWot/AssetAndDeviceRegistry/device_discovery_gen --lang rust --namespace DeviceDiscoveryService --workingDir target/akri/DeviceDiscoveryService --sdkPath ../../../rust [[ -d ./eng/dtdl/FromDtdl/SchemaRegistry ]] && rm -r ./eng/dtdl/FromDtdl/SchemaRegistry $genFromDtdl --modelFile ./eng/dtdl/SchemaRegistry-1.json --outDir ./eng/dtdl/FromDtdl/SchemaRegistry --lang csharp --sdkPath ../../../dotnet/src/Azure.Iot.Operations.Protocol @@ -21,7 +21,7 @@ $genFromDtdl --modelFile ./eng/dtdl/SchemaRegistry-1.json --outDir ./eng/dtdl/Fr [[ -d ./eng/dtdl/FromWot/SchemaRegistry ]] && rm -r ./eng/dtdl/FromWot/SchemaRegistry $genFromWot --thingFiles ./eng/dtdl/SchemaRegistry.TD.json --outDir ./eng/dtdl/FromWot/SchemaRegistry --lang csharp --namespace SchemaRegistry --workingDir obj/akri/SchemaRegistry --sdkPath ../../../dotnet/src/Azure.Iot.Operations.Protocol -$genFromWot --thingFiles ./eng/dtdl/SchemaRegistry.TD.json --outDir ./eng/dtdl/FromWot/SchemaRegistry/schemaregistry_gen --srcSubdir src --lang rust --namespace SchemaRegistry --workingDir target/akri/SchemaRegistry --sdkPath ../../../rust +$genFromWot --thingFiles ./eng/dtdl/SchemaRegistry.TD.json --outDir ./eng/dtdl/FromWot/SchemaRegistry/schemaregistry_gen --lang rust --namespace SchemaRegistry --workingDir target/akri/SchemaRegistry --sdkPath ../../../rust [[ -d ./eng/dtdl/FromDtdl/StateStore ]] && rm -r ./eng/dtdl/FromDtdl/StateStore $genFromDtdl --modelFile ./eng/dtdl/statestore.json --outDir ./eng/dtdl/FromDtdl/StateStore --lang csharp --sdkPath ../../../dotnet/src/Azure.Iot.Operations.Protocol @@ -29,4 +29,4 @@ $genFromDtdl --modelFile ./eng/dtdl/statestore.json --outDir ./eng/dtdl/FromDtdl [[ -d ./eng/dtdl/FromWot/StateStore ]] && rm -r ./eng/dtdl/FromWot/StateStore $genFromWot --thingFiles ./eng/dtdl/StateStore.TD.json --outDir ./eng/dtdl/FromWot/StateStore --lang csharp --namespace StateStore --workingDir obj/akri/StateStore --sdkPath ../../../dotnet/src/Azure.Iot.Operations.Protocol -$genFromWot --thingFiles ./eng/dtdl/StateStore.TD.json --outDir ./eng/dtdl/FromWot/StateStore/state_store_gen --srcSubdir src --lang rust --namespace StateStore --workingDir obj/akri/StateStore --sdkPath ../../../dotnet/src/Azure.Iot.Operations.Protocol +$genFromWot --thingFiles ./eng/dtdl/StateStore.TD.json --outDir ./eng/dtdl/FromWot/StateStore/state_store_gen --lang rust --namespace StateStore --workingDir obj/akri/StateStore --sdkPath ../../../dotnet/src/Azure.Iot.Operations.Protocol diff --git a/codegen2/eval/g1.sh b/codegen2/eval/g1.sh index 5f7ee0214e..318337604c 100644 --- a/codegen2/eval/g1.sh +++ b/codegen2/eval/g1.sh @@ -6,4 +6,4 @@ gen=../src/Azure.Iot.Operations.ProtocolCompiler/bin/Debug/net9.0/Azure.Iot.Oper $gen --schemas wot/ExternalSchemas/*.json --outDir dotnet/ExternalSchemasOnlySample --lang csharp --namespace ExternalSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/external_schemas_only_gen ]] && rm -r rust/external_schemas_only_gen -$gen --schemas wot/ExternalSchemas/*.json --outDir rust/external_schemas_only_gen --lang rust --namespace ExternalSchemas --sdkPath ../../rust --srcSubdir src +$gen --schemas wot/ExternalSchemas/*.json --outDir rust/external_schemas_only_gen --lang rust --namespace ExternalSchemas --sdkPath ../../rust diff --git a/codegen2/eval/g2.sh b/codegen2/eval/g2.sh index 729facbaa9..5d7ca638d7 100644 --- a/codegen2/eval/g2.sh +++ b/codegen2/eval/g2.sh @@ -6,4 +6,4 @@ gen=../src/Azure.Iot.Operations.ProtocolCompiler/bin/Debug/net9.0/Azure.Iot.Oper $gen --thingFiles wot/ExternalSchemas.TD.json --schemas wot/ExternalSchemas/*.json --outDir dotnet/ExternalSchemasSample --lang csharp --namespace ExternalSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/external_schemas_gen ]] && rm -r rust/external_schemas_gen -$gen --thingFiles wot/ExternalSchemas.TD.json --schemas wot/ExternalSchemas/*.json --outDir rust/external_schemas_gen --lang rust --namespace ExternalSchemas --sdkPath ../../rust --srcSubdir src +$gen --thingFiles wot/ExternalSchemas.TD.json --schemas wot/ExternalSchemas/*.json --outDir rust/external_schemas_gen --lang rust --namespace ExternalSchemas --sdkPath ../../rust diff --git a/codegen2/eval/gen.sh b/codegen2/eval/gen.sh index ad88a68293..6dcf5baf6a 100644 --- a/codegen2/eval/gen.sh +++ b/codegen2/eval/gen.sh @@ -6,58 +6,58 @@ gen=../src/Azure.Iot.Operations.ProtocolCompiler/bin/Debug/net9.0/Azure.Iot.Oper $gen --thingFiles wot/CommandComplexSchemas.TD.json --outDir dotnet/CommandComplexSchemasSample --lang csharp --namespace CommandComplexSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/command_complex_schemas_gen ]] && rm -r rust/command_complex_schemas_gen -$gen --thingFiles wot/CommandComplexSchemas.TD.json --outDir rust/command_complex_schemas_gen --lang rust --namespace CommandComplexSchemas --sdkPath ../../rust --srcSubdir src +$gen --thingFiles wot/CommandComplexSchemas.TD.json --outDir rust/command_complex_schemas_gen --lang rust --namespace CommandComplexSchemas --sdkPath ../../rust [[ -d dotnet/CommandVariantsSample ]] && rm -r dotnet/CommandVariantsSample $gen --thingFiles wot/CommandVariants.TD.json --outDir dotnet/CommandVariantsSample --lang csharp --namespace CommandVariants --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol --defaultImpl [[ -d rust/command_variants_gen ]] && rm -r rust/command_variants_gen -$gen --thingFiles wot/CommandVariants.TD.json --outDir rust/command_variants_gen --lang rust --namespace CommandVariants --sdkPath ../../rust --srcSubdir src +$gen --thingFiles wot/CommandVariants.TD.json --outDir rust/command_variants_gen --lang rust --namespace CommandVariants --sdkPath ../../rust [[ -d dotnet/Counters ]] && rm -r dotnet/Counters $gen --thingFiles wot/CounterCollection.TD.json --outDir dotnet/Counters --lang csharp --namespace CounterCollection --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/counters ]] && rm -r rust/counters -$gen --thingFiles wot/CounterCollection.TD.json --outDir rust/counters --lang rust --namespace CounterCollection --sdkPath ../../rust --srcSubdir src +$gen --thingFiles wot/CounterCollection.TD.json --outDir rust/counters --lang rust --namespace CounterCollection --sdkPath ../../rust [[ -d dotnet/TelemetryComplexSchemasSample ]] && rm -r dotnet/TelemetryComplexSchemasSample $gen --thingFiles wot/TelemetryComplexSchemas.TD.json --outDir dotnet/TelemetryComplexSchemasSample --lang csharp --namespace TelemetryComplexSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/telemetry_complex_schemas_gen ]] && rm -r rust/telemetry_complex_schemas_gen -$gen --thingFiles wot/TelemetryComplexSchemas.TD.json --outDir rust/telemetry_complex_schemas_gen --lang rust --namespace TelemetryComplexSchemas --sdkPath ../../rust --srcSubdir src +$gen --thingFiles wot/TelemetryComplexSchemas.TD.json --outDir rust/telemetry_complex_schemas_gen --lang rust --namespace TelemetryComplexSchemas --sdkPath ../../rust [[ -d dotnet/TelemetryPrimitiveSchemasSample ]] && rm -r dotnet/TelemetryPrimitiveSchemasSample $gen --thingFiles wot/TelemetryPrimitiveSchemas.TD.json --outDir dotnet/TelemetryPrimitiveSchemasSample --lang csharp --namespace TelemetryPrimitiveSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/telemetry_primitive_schemas_gen ]] && rm -r rust/telemetry_primitive_schemas_gen -$gen --thingFiles wot/TelemetryPrimitiveSchemas.TD.json --outDir rust/telemetry_primitive_schemas_gen --lang rust --namespace TelemetryPrimitiveSchemas --sdkPath ../../rust --srcSubdir src +$gen --thingFiles wot/TelemetryPrimitiveSchemas.TD.json --outDir rust/telemetry_primitive_schemas_gen --lang rust --namespace TelemetryPrimitiveSchemas --sdkPath ../../rust [[ -d dotnet/PropertySeparateSample ]] && rm -r dotnet/PropertySeparateSample $gen --thingFiles wot/PropertySeparate.TD.json --outDir dotnet/PropertySeparateSample --lang csharp --namespace PropertySeparate --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/property_separate_gen ]] && rm -r rust/property_separate_gen -$gen --thingFiles wot/PropertySeparate.TD.json --outDir rust/property_separate_gen --lang rust --namespace PropertySeparate --sdkPath ../../rust --srcSubdir src +$gen --thingFiles wot/PropertySeparate.TD.json --outDir rust/property_separate_gen --lang rust --namespace PropertySeparate --sdkPath ../../rust [[ -d dotnet/PropertyTogetherSample ]] && rm -r dotnet/PropertyTogetherSample $gen --thingFiles wot/PropertyTogether.TD.json --outDir dotnet/PropertyTogetherSample --lang csharp --namespace PropertyTogether --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/property_together_gen ]] && rm -r rust/property_together_gen -$gen --thingFiles wot/PropertyTogether.TD.json --outDir rust/property_together_gen --lang rust --namespace PropertyTogether --sdkPath ../../rust --srcSubdir src +$gen --thingFiles wot/PropertyTogether.TD.json --outDir rust/property_together_gen --lang rust --namespace PropertyTogether --sdkPath ../../rust [[ -d dotnet/TwoThingsSample ]] && rm -r dotnet/TwoThingsSample $gen --thingFiles wot/TwoThings.TD.json --outDir dotnet/TwoThingsSample --lang csharp --namespace TwoThings --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/two_things_gen ]] && rm -r rust/two_things_gen -$gen --thingFiles wot/TwoThings.TD.json --outDir rust/two_things_gen --lang rust --namespace TwoThings --sdkPath ../../rust --srcSubdir src +$gen --thingFiles wot/TwoThings.TD.json --outDir rust/two_things_gen --lang rust --namespace TwoThings --sdkPath ../../rust [[ -d dotnet/ExternalSchemasSample ]] && rm -r dotnet/ExternalSchemasSample $gen --thingFiles wot/ExternalSchemas.TD.json --schemas wot/ExternalSchemas/*.json --outDir dotnet/ExternalSchemasSample --lang csharp --namespace ExternalSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/external_schemas_gen ]] && rm -r rust/external_schemas_gen -$gen --thingFiles wot/ExternalSchemas.TD.json --schemas wot/ExternalSchemas/*.json --outDir rust/external_schemas_gen --lang rust --namespace ExternalSchemas --sdkPath ../../rust --srcSubdir src +$gen --thingFiles wot/ExternalSchemas.TD.json --schemas wot/ExternalSchemas/*.json --outDir rust/external_schemas_gen --lang rust --namespace ExternalSchemas --sdkPath ../../rust [[ -d dotnet/ExternalSchemasOnlySample ]] && rm -r dotnet/ExternalSchemasOnlySample $gen --schemas wot/ExternalSchemas/*.json --outDir dotnet/ExternalSchemasOnlySample --lang csharp --namespace ExternalSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/external_schemas_only_gen ]] && rm -r rust/external_schemas_only_gen -$gen --schemas wot/ExternalSchemas/*.json --outDir rust/external_schemas_only_gen --lang rust --namespace ExternalSchemas --sdkPath ../../rust --srcSubdir src +$gen --schemas wot/ExternalSchemas/*.json --outDir rust/external_schemas_only_gen --lang rust --namespace ExternalSchemas --sdkPath ../../rust diff --git a/codegen2/eval/gen0.sh b/codegen2/eval/gen0.sh index e6409d19f2..c6b74f56d9 100644 --- a/codegen2/eval/gen0.sh +++ b/codegen2/eval/gen0.sh @@ -6,52 +6,52 @@ gen=../src/Azure.Iot.Operations.ProtocolCompiler/bin/Debug/net9.0/Azure.Iot.Oper $gen --thingFiles conv/CommandComplexSchemas.TD.json --outDir dotnet/CommandComplexSchemasSample --lang csharp --namespace CommandComplexSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/command_complex_schemas_gen ]] && rm -r rust/command_complex_schemas_gen -$gen --thingFiles conv/CommandComplexSchemas.TD.json --outDir rust/command_complex_schemas_gen --lang rust --namespace CommandComplexSchemas --sdkPath ../../rust --srcSubdir src +$gen --thingFiles conv/CommandComplexSchemas.TD.json --outDir rust/command_complex_schemas_gen --lang rust --namespace CommandComplexSchemas --sdkPath ../../rust [[ -d dotnet/CommandRawSample ]] && rm -r dotnet/CommandRawSample $gen --thingFiles conv/CommandRaw.TD.json --outDir dotnet/CommandRawSample --lang csharp --namespace CommandRaw --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/command_raw_gen ]] && rm -r rust/command_raw_gen -$gen --thingFiles conv/CommandRaw.TD.json --outDir rust/command_raw_gen --lang rust --namespace CommandRaw --sdkPath ../../rust --srcSubdir src +$gen --thingFiles conv/CommandRaw.TD.json --outDir rust/command_raw_gen --lang rust --namespace CommandRaw --sdkPath ../../rust [[ -d dotnet/CommandVariantsSample ]] && rm -r dotnet/CommandVariantsSample $gen --thingFiles conv/CommandVariants.TD.json --outDir dotnet/CommandVariantsSample --lang csharp --namespace CommandVariants --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol --defaultImpl [[ -d rust/command_variants_gen ]] && rm -r rust/command_variants_gen -$gen --thingFiles conv/CommandVariants.TD.json --outDir rust/command_variants_gen --lang rust --namespace CommandVariants --sdkPath ../../rust --srcSubdir src +$gen --thingFiles conv/CommandVariants.TD.json --outDir rust/command_variants_gen --lang rust --namespace CommandVariants --sdkPath ../../rust [[ -d dotnet/PropertySeparateSample ]] && rm -r dotnet/PropertySeparateSample $gen --thingFiles conv/PropertySeparate.TD.json --outDir dotnet/PropertySeparateSample --lang csharp --namespace PropertySeparate --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/property_separate_gen ]] && rm -r rust/property_separate_gen -$gen --thingFiles conv/PropertySeparate.TD.json --outDir rust/property_separate_gen --lang rust --namespace PropertySeparate --sdkPath ../../rust --srcSubdir src +$gen --thingFiles conv/PropertySeparate.TD.json --outDir rust/property_separate_gen --lang rust --namespace PropertySeparate --sdkPath ../../rust [[ -d dotnet/PropertyTogetherSample ]] && rm -r dotnet/PropertyTogetherSample $gen --thingFiles conv/PropertyTogether.TD.json --outDir dotnet/PropertyTogetherSample --lang csharp --namespace PropertyTogether --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/property_together_gen ]] && rm -r rust/property_together_gen -$gen --thingFiles conv/PropertyTogether.TD.json --outDir rust/property_together_gen --lang rust --namespace PropertyTogether --sdkPath ../../rust --srcSubdir src +$gen --thingFiles conv/PropertyTogether.TD.json --outDir rust/property_together_gen --lang rust --namespace PropertyTogether --sdkPath ../../rust [[ -d dotnet/TelemetryAndCommandSample ]] && rm -r dotnet/TelemetryAndCommandSample $gen --thingFiles conv/TelemetryAndCommand.TD.json --outDir dotnet/TelemetryAndCommandSample --lang csharp --namespace TelemetryAndCommand --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/telemetry_and_command_gen ]] && rm -r rust/telemetry_and_command_gen -$gen --thingFiles conv/TelemetryAndCommand.TD.json --outDir rust/telemetry_and_command_gen --lang rust --namespace TelemetryAndCommand --sdkPath ../../rust --srcSubdir src +$gen --thingFiles conv/TelemetryAndCommand.TD.json --outDir rust/telemetry_and_command_gen --lang rust --namespace TelemetryAndCommand --sdkPath ../../rust [[ -d dotnet/TelemetryComplexSchemasSample ]] && rm -r dotnet/TelemetryComplexSchemasSample $gen --thingFiles conv/TelemetryComplexSchemas.TD.json --outDir dotnet/TelemetryComplexSchemasSample --lang csharp --namespace TelemetryComplexSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/telemetry_complex_schemas_gen ]] && rm -r rust/telemetry_complex_schemas_gen -$gen --thingFiles conv/TelemetryComplexSchemas.TD.json --outDir rust/telemetry_complex_schemas_gen --lang rust --namespace TelemetryComplexSchemas --sdkPath ../../rust --srcSubdir src +$gen --thingFiles conv/TelemetryComplexSchemas.TD.json --outDir rust/telemetry_complex_schemas_gen --lang rust --namespace TelemetryComplexSchemas --sdkPath ../../rust [[ -d dotnet/TelemetryPrimitiveSchemasSample ]] && rm -r dotnet/TelemetryPrimitiveSchemasSample $gen --thingFiles conv/TelemetryPrimitiveSchemas.TD.json --outDir dotnet/TelemetryPrimitiveSchemasSample --lang csharp --namespace TelemetryPrimitiveSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/telemetry_primitive_schemas_gen ]] && rm -r rust/telemetry_primitive_schemas_gen -$gen --thingFiles conv/TelemetryPrimitiveSchemas.TD.json --outDir rust/telemetry_primitive_schemas_gen --lang rust --namespace TelemetryPrimitiveSchemas --sdkPath ../../rust --srcSubdir src +$gen --thingFiles conv/TelemetryPrimitiveSchemas.TD.json --outDir rust/telemetry_primitive_schemas_gen --lang rust --namespace TelemetryPrimitiveSchemas --sdkPath ../../rust [[ -d dotnet/TelemetryRawSeparateSample ]] && rm -r dotnet/TelemetryRawSeparateSample $gen --thingFiles conv/TelemetryRawSeparate.TD.json --outDir dotnet/TelemetryRawSeparateSample --lang csharp --namespace TelemetryRawSeparate --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/telemetry_raw_separate_gen ]] && rm -r rust/telemetry_raw_separate_gen -$gen --thingFiles conv/TelemetryRawSeparate.TD.json --outDir rust/telemetry_raw_separate_gen --lang rust --namespace TelemetryRawSeparate --sdkPath ../../rust --srcSubdir src +$gen --thingFiles conv/TelemetryRawSeparate.TD.json --outDir rust/telemetry_raw_separate_gen --lang rust --namespace TelemetryRawSeparate --sdkPath ../../rust diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/ArgBinder.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/ArgBinder.cs index 584843e48f..eed9089c47 100644 --- a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/ArgBinder.cs +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/ArgBinder.cs @@ -14,7 +14,6 @@ public class ArgBinder : BinderBase private readonly Option typeNamerFile; private readonly Option outputDir; private readonly Option workingDir; - private readonly Option outputSourceSubdir; private readonly Option genNamespace; private readonly Option sdkPath; private readonly Option language; @@ -30,7 +29,6 @@ public class ArgBinder : BinderBase /// Filespec(s) of files containing schema definitions. /// Directory for receiving generated code. /// Directory for storing temporary files (relative to outDir unless path is rooted). - /// Subdirectory under outputDir for generated source code. /// Namespace for generated code; null for default. /// Local path or feed URL for Azure.Iot.Operations.Protocol SDK. /// Programming language for generated code. @@ -44,7 +42,6 @@ public ArgBinder( Option typeNamerFile, Option outputDir, Option workingDir, - Option outputSourceSubdir, Option genNamespace, Option sdkPath, Option language, @@ -58,7 +55,6 @@ public ArgBinder( this.typeNamerFile = typeNamerFile; this.outputDir = outputDir; this.workingDir = workingDir; - this.outputSourceSubdir = outputSourceSubdir; this.genNamespace = genNamespace; this.sdkPath = sdkPath; this.language = language; @@ -81,7 +77,6 @@ protected override OptionContainer GetBoundValue(BindingContext bindingContext) TypeNamerFile = bindingContext.ParseResult.GetValueForOption(this.typeNamerFile), OutputDir = outputDir, WorkingDir = Path.IsPathRooted(workingDir) ? new DirectoryInfo(workingDir) : new DirectoryInfo(Path.Combine(outputDir.FullName, workingDir)), - OutputSourceSubdir = bindingContext.ParseResult.GetValueForOption(this.outputSourceSubdir)!, GenNamespace = bindingContext.ParseResult.GetValueForOption(this.genNamespace)!, SdkPath = bindingContext.ParseResult.GetValueForOption(this.sdkPath), Language = bindingContext.ParseResult.GetValueForOption(this.language)!, diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs index 838f2d0d26..626fe331be 100644 --- a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs @@ -21,11 +21,11 @@ internal class CommandHandler private const ConsoleColor ErrorColor = ConsoleColor.Red; private const ConsoleColor WarningColor = ConsoleColor.Yellow; - private static readonly Dictionary LanguageMap = new() + private static readonly Dictionary LanguageMap = new() { - { "csharp", TargetLanguage.CSharp }, - { "rust", TargetLanguage.Rust }, - { "none", TargetLanguage.None }, + { "csharp", (TargetLanguage.CSharp, "") }, + { "rust", (TargetLanguage.Rust, "src") }, + { "none", (TargetLanguage.None, "") }, }; public static readonly string[] SupportedLanguages = LanguageMap.Keys.ToArray(); @@ -42,7 +42,7 @@ public static int GenerateCode(OptionContainer options) } string projectName = LegalizeProjectName(options.OutputDir.Name); - TargetLanguage targetLanguage = LanguageMap[options.Language.ToLowerInvariant()]; + (TargetLanguage targetLanguage, string srcSubdir) = LanguageMap[options.Language.ToLowerInvariant()]; ErrorLog errorLog = new(options.WorkingDir.FullName); @@ -90,7 +90,7 @@ public static int GenerateCode(OptionContainer options) { Dictionary schemaTextsByName = schemaSet.Value.ToDictionary(s => Path.GetFullPath(Path.Combine(options.WorkingDir.FullName, s.FolderPath, s.FileName)).Replace('\\', '/'), s => s.Content); TypeGenerator typeGenerator = new TypeGenerator(schemaSet.Key, targetLanguage, typeNamer, errorLog); - generatedTypes.AddRange(typeGenerator.GenerateTypes(schemaTextsByName, new CodeName(options.GenNamespace), projectName, options.OutputSourceSubdir)); + generatedTypes.AddRange(typeGenerator.GenerateTypes(schemaTextsByName, new CodeName(options.GenNamespace), projectName, srcSubdir)); } errorLog.CheckForDuplicatesInSchemas(); @@ -117,7 +117,7 @@ public static int GenerateCode(OptionContainer options) projectName, sdkPath, typeNames, - options.OutputSourceSubdir, + srcSubdir, generateClient: !options.ServerOnly, generateServer: !options.ClientOnly, generateProject: !options.NoProj, diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/OptionContainer.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/OptionContainer.cs index 3b182faaa6..47fbfcd2e0 100644 --- a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/OptionContainer.cs +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/OptionContainer.cs @@ -22,9 +22,6 @@ public class OptionContainer /// Gets or sets the directory for receiving generated code. public required DirectoryInfo OutputDir { get; set; } - /// Gets or sets a subdirectory under OutputDir for generated source code. - public required string OutputSourceSubdir { get; set; } - /// Gets or sets a namespace for generated code. public required string GenNamespace { get; set; } diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/Program.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/Program.cs index 31f370a3fc..efcd3d19b4 100644 --- a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/Program.cs +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/Program.cs @@ -39,12 +39,6 @@ static void Main(string[] args) description: "Directory for storing temporary files (relative to outDir unless path is rooted)") { ArgumentHelpName = "DIRPATH" }; - var srcSubdirOption = new Option( - name: "--srcSubdir", - getDefaultValue: () => string.Empty, - description: "Subdirectory under OutputDir for generated source code") - { ArgumentHelpName = "SUBDIR" }; - var namespaceOption = new Option( name: "--namespace", getDefaultValue: () => DefaultNamespace, @@ -84,7 +78,6 @@ static void Main(string[] args) typeNamerOption, outDirOption, workingDirOption, - srcSubdirOption, namespaceOption, sdkPathOption, langOption, @@ -100,7 +93,6 @@ static void Main(string[] args) typeNamerOption, outDirOption, workingDirOption, - srcSubdirOption, namespaceOption, sdkPathOption, langOption, From df3c42a4198ffb0fe1d6da17a2831fbd35f3cc3e Mon Sep 17 00:00:00 2001 From: Auto Gen Date: Thu, 18 Dec 2025 13:00:50 -0800 Subject: [PATCH 26/52] support custom SchemaNames rules file in Dtdl2Wot conversion tool --- .../Dtdl2Wot/Interface/code/InterfaceThing.cs | 4 ++- .../Dtdl2Wot/Interface/t4/InterfaceThing.tt | 2 +- codegen2/src/Dtdl2Wot/Program.cs | 28 +++++++++++++------ codegen2/src/Dtdl2Wot/ThingGenerator.cs | 6 ++-- 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs b/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs index 4ab494129e..70d9df041a 100644 --- a/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs +++ b/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs @@ -11,6 +11,7 @@ public partial class InterfaceThing : ITemplateTransform private readonly DTInterfaceInfo dtInterface; private readonly CodeName serviceName; private readonly int mqttVersion; + private string schemaNamesPath; private readonly string? telemetryTopic; private readonly string? commandTopic; private readonly string? propertyTopic; @@ -24,11 +25,12 @@ public partial class InterfaceThing : ITemplateTransform private readonly Dictionary namespacedEnums; private readonly ThingDescriber thingDescriber; - public InterfaceThing(IReadOnlyDictionary modelDict, Dtmi interfaceId, int mqttVersion) + public InterfaceThing(IReadOnlyDictionary modelDict, Dtmi interfaceId, int mqttVersion, string schemaNamesPath) { this.dtInterface = (DTInterfaceInfo)modelDict[interfaceId]; this.serviceName = new CodeName(dtInterface.Id); this.mqttVersion = mqttVersion; + this.schemaNamesPath = schemaNamesPath; this.telemetryTopic = dtInterface.SupplementalProperties.TryGetValue(string.Format(DtdlMqttExtensionValues.TelemTopicPropertyFormat, mqttVersion), out object? telemTopicObj) ? (string)telemTopicObj : null; this.commandTopic = dtInterface.SupplementalProperties.TryGetValue(string.Format(DtdlMqttExtensionValues.CmdReqTopicPropertyFormat, mqttVersion), out object? cmdTopicObj) ? (string)cmdTopicObj : null; diff --git a/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt b/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt index 40ad5a9e1b..960f19d642 100644 --- a/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt +++ b/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt @@ -21,7 +21,7 @@ "links": [ { "rel": "service-desc", - "href": "./SchemaNames.json", + "href": "<#=this.schemaNamesPath#>", "type": "application/json" } ], diff --git a/codegen2/src/Dtdl2Wot/Program.cs b/codegen2/src/Dtdl2Wot/Program.cs index 40e3d9c5ca..7b71276199 100644 --- a/codegen2/src/Dtdl2Wot/Program.cs +++ b/codegen2/src/Dtdl2Wot/Program.cs @@ -14,19 +14,25 @@ static int Main(string[] args) { if (args.Length < 2) { - Console.WriteLine("Usage: Dtdl2Wot "); + Console.WriteLine("Usage: Dtdl2Wot [schemaNamesFilePath]"); Console.WriteLine("Converts a DTDL model file to a WoT Thing Description."); + Console.WriteLine(" Path to the input DTDL model file."); + Console.WriteLine(" Path to the output folder for the generated Thing Description."); + Console.WriteLine(" [schemaNamesFilePath] Optional path to a JSON file that defines schema naming rules."); + Console.WriteLine(" If not specified, default path is 'SchemaNames.json' in the output folder."); + Console.WriteLine(" If file does not exist, one will be created (using specified or default path)."); return 1; } - string inputFilePath = args[0]; - string outputFolderPath = args[1]; + FileInfo inputFile = new FileInfo(args[0]); + DirectoryInfo outputDirectory = new DirectoryInfo(args[1]); + FileInfo schemaNamesFile = new FileInfo(args.Length > 2 ? args[2] : Path.Combine(outputDirectory.FullName, "SchemaNames.json")); - string modelText = File.ReadAllText(inputFilePath); + string modelText = inputFile.OpenText().ReadToEnd(); DtdlParseLocator parseLocator = (int parseIndex, int parseLine, out string sourceName, out int sourceLine) => { - sourceName = inputFilePath; + sourceName = inputFile.Name; sourceLine = parseLine; return true; }; @@ -44,12 +50,16 @@ static int Main(string[] args) ThingGenerator thingGenerator = new ThingGenerator(model, dtInterface.Id, mqttVersion); - DirectoryInfo outDir = new DirectoryInfo(outputFolderPath); + if (!schemaNamesFile.Exists) + { + Stream schemaNamesStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Dtdl2Wot.Resources.conversion.SchemaNames.json")!; + string schemaNamesText = new StreamReader(schemaNamesStream).ReadToEnd(); + File.WriteAllText(schemaNamesFile.FullName, schemaNamesText); - string schemaNamesText = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("Dtdl2Wot.Resources.conversion.SchemaNames.json")!).ReadToEnd(); - File.WriteAllText(Path.Combine(outDir.FullName, "SchemaNames.json"), schemaNamesText); + Console.WriteLine($" generated {schemaNamesFile.FullName}"); + } - return thingGenerator.GenerateThing(outDir) ? 0 : 1; + return thingGenerator.GenerateThing(outputDirectory, schemaNamesFile) ? 0 : 1; } } } diff --git a/codegen2/src/Dtdl2Wot/ThingGenerator.cs b/codegen2/src/Dtdl2Wot/ThingGenerator.cs index 90185426b8..6605858317 100644 --- a/codegen2/src/Dtdl2Wot/ThingGenerator.cs +++ b/codegen2/src/Dtdl2Wot/ThingGenerator.cs @@ -19,11 +19,13 @@ public ThingGenerator(IReadOnlyDictionary modelDict, Dtmi in this.mqttVersion = mqttVersion; } - public bool GenerateThing(DirectoryInfo outDir) + public bool GenerateThing(DirectoryInfo outDir, FileInfo schemaNamesFile) { + string schemaNamesPath = Path.GetRelativePath(outDir.FullName, schemaNamesFile.FullName).Replace('\\', '/'); + DTInterfaceInfo dtInterface = (DTInterfaceInfo)modelDict[interfaceId]; - ITemplateTransform interfaceThingTransform = new InterfaceThing(modelDict, interfaceId, this.mqttVersion); + ITemplateTransform interfaceThingTransform = new InterfaceThing(modelDict, interfaceId, this.mqttVersion, schemaNamesPath); string interfaceThingText; try From 9110c93647c57ebb5cc1261682bd9a23c1b0bb55 Mon Sep 17 00:00:00 2001 From: Auto Gen Date: Fri, 19 Dec 2025 16:04:35 -0800 Subject: [PATCH 27/52] restructure const objects to better fit schema --- .../ThingValidator.cs | 664 +++++++++++------- .../EnvoyGenerator.cs | 24 +- .../ObjectHolder.cs | 19 +- .../Dtdl2Wot/Interface/t4/InterfaceThing.tt | 15 +- 4 files changed, 443 insertions(+), 279 deletions(-) diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs index 37b1e07b33..2f1797fa18 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs @@ -83,7 +83,7 @@ public bool TryValidateThng(TDThing thing, HashSet serializ if (hasError) { - return true; + return false; } if (!TryValidateCrossFormConsistency(thing.Forms, thing.Actions)) @@ -1537,6 +1537,183 @@ private bool TryValidateReferenceDataSchema(ValueTracker dataSchema, Func< return !hasError; } + private bool TryValidateStringConst(ValueTracker dataSchema, ValueTracker constProperty, ValueTracker constValue) + where T : TDDataSchema, IDeserializable + { + if (dataSchema.Value.Title != null && !TitleRegex.IsMatch(dataSchema.Value.Title.Value.Value)) + { + errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a 'service-desc' linked schema naming file", dataSchema.Value.Title.TokenIndex); + } + + bool hasError = false; + + if (constValue.Value.Value is not string) + { + errorReporter.ReportError($"The specified constant value must be a string.", constValue.TokenIndex, dataSchema.Value.Type!.TokenIndex); + hasError = true; + } + + HashSet supportedProperties = new() + { + TDDataSchema.TypeName, + TDDataSchema.TitleName, + TDDataSchema.DescriptionName, + TDDataSchema.ConstName, + }; + if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, "a constant string schema", constProperty.TokenIndex)) + { + hasError = true; + } + + return !hasError; + } + + private bool TryValidateNumberConst(ValueTracker dataSchema, ValueTracker constProperty, ValueTracker constValue) + where T : TDDataSchema, IDeserializable + { + bool hasError = false; + + if (dataSchema.Value.Title != null && !TitleRegex.IsMatch(dataSchema.Value.Title.Value.Value)) + { + errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a 'service-desc' linked schema naming file", dataSchema.Value.Title.TokenIndex); + } + + if (constValue.Value.Value is double numValue) + { + if (dataSchema.Value.Minimum?.Value.Value != null && numValue < dataSchema.Value.Minimum.Value.Value) + { + errorReporter.ReportError($"The specified constant value ({numValue}) cannot be less than the '{TDDataSchema.MinimumName}' property value ({dataSchema.Value.Minimum.Value.Value}).", constValue.TokenIndex, dataSchema.Value.Minimum.TokenIndex); + hasError = true; + } + if (dataSchema.Value.Maximum?.Value.Value != null && numValue > dataSchema.Value.Maximum.Value.Value) + { + errorReporter.ReportError($"The specified constant value ({numValue}) cannot be greater than the '{TDDataSchema.MaximumName}' property value ({dataSchema.Value.Maximum.Value.Value}).", constValue.TokenIndex, dataSchema.Value.Maximum.TokenIndex); + hasError = true; + } + } + else + { + errorReporter.ReportError($"The specified constant value must be a number.", constValue.TokenIndex, dataSchema.Value.Type!.TokenIndex); + hasError = true; + } + + HashSet supportedProperties = new() + { + TDDataSchema.TypeName, + TDDataSchema.TitleName, + TDDataSchema.DescriptionName, + TDDataSchema.MinimumName, + TDDataSchema.MaximumName, + TDDataSchema.ConstName, + }; + if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, "a constant number schema", constProperty.TokenIndex)) + { + hasError = true; + } + + return !hasError; + } + + private bool TryValidateIntegerConst(ValueTracker dataSchema, ValueTracker constProperty, ValueTracker constValue) + where T : TDDataSchema, IDeserializable + { + bool hasError = false; + + if (dataSchema.Value.Title != null && !TitleRegex.IsMatch(dataSchema.Value.Title.Value.Value)) + { + errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a 'service-desc' linked schema naming file", dataSchema.Value.Title.TokenIndex); + } + + if (constValue.Value.Value is double numValue && double.IsInteger(numValue)) + { + if (dataSchema.Value.Minimum?.Value.Value != null && numValue < dataSchema.Value.Minimum.Value.Value) + { + errorReporter.ReportError($"The specified constant value ({numValue}) cannot be less than the '{TDDataSchema.MinimumName}' property value ({dataSchema.Value.Minimum.Value.Value}).", constValue.TokenIndex, dataSchema.Value.Minimum.TokenIndex); + hasError = true; + } + if (dataSchema.Value.Maximum?.Value.Value != null && numValue > dataSchema.Value.Maximum.Value.Value) + { + errorReporter.ReportError($"The specified constant value ({numValue}) cannot be greater than the '{TDDataSchema.MaximumName}' property value ({dataSchema.Value.Maximum.Value.Value}).", constValue.TokenIndex, dataSchema.Value.Maximum.TokenIndex); + hasError = true; + } + } + else + { + errorReporter.ReportError($"The specified constant value must be an integer.", constValue.TokenIndex, dataSchema.Value.Type!.TokenIndex); + hasError = true; + } + + HashSet supportedProperties = new() + { + TDDataSchema.TypeName, + TDDataSchema.TitleName, + TDDataSchema.DescriptionName, + TDDataSchema.MinimumName, + TDDataSchema.MaximumName, + TDDataSchema.ConstName, + }; + if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, "a constant integer schema", constProperty.TokenIndex)) + { + hasError = true; + } + + return !hasError; + } + + private bool TryValidateBooleanConst(ValueTracker dataSchema, ValueTracker constProperty, ValueTracker constValue) + where T : TDDataSchema, IDeserializable + { + bool hasError = false; + + if (dataSchema.Value.Title != null && !TitleRegex.IsMatch(dataSchema.Value.Title.Value.Value)) + { + errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a 'service-desc' linked schema naming file", dataSchema.Value.Title.TokenIndex); + } + + if (constValue.Value.Value is not bool) + { + errorReporter.ReportError($"The specified constant value must be Boolean.", constValue.TokenIndex, dataSchema.Value.Type!.TokenIndex); + hasError = true; + } + + HashSet supportedProperties = new() + { + TDDataSchema.TypeName, + TDDataSchema.TitleName, + TDDataSchema.DescriptionName, + TDDataSchema.ConstName, + }; + if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, "a constant boolean schema", constProperty.TokenIndex)) + { + hasError = true; + } + + return !hasError; + } + + private bool TryValidateResidualProperties(Dictionary propertyNames, HashSet supportedProperties, string schemaDescription, long cfTokenIndex = -1) + { + bool hasError = false; + + foreach (KeyValuePair propertyName in propertyNames) + { + if (!supportedProperties.Contains(propertyName.Key)) + { + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) + { + errorReporter.ReportWarning($"Data schema has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); + } + else + { + errorReporter.ReportError($"Data schema defines {schemaDescription}; property '{propertyName.Key}' is not supported.", propertyName.Value, cfTokenIndex); + hasError = true; + } + } + } + + return !hasError; + } + private bool TryValidateObjectDataSchema(ValueTracker dataSchema, DataSchemaKind dataSchemaKind, Func? propertyApprover) where T : TDDataSchema, IDeserializable { @@ -1559,29 +1736,71 @@ private bool TryValidateObjectDataSchema(ValueTracker dataSchema, DataSche { if (dataSchemaKind != DataSchemaKind.SchemaDefinition) { - errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property is permitted only when the object definition is in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.Const.TokenIndex); - return false; + errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.Const.TokenIndex); + hasError = true; } - else if ((dataSchema.Value.Const.Value.Value as bool?) != true) + else if (dataSchema.Value.Const.Value.ValueMap?.Entries == null) { - errorReporter.ReportError($"When used within an object definition, the '{TDDataSchema.ConstName}' property must have a Boolean value of true, indicating that the '{TDDataSchema.PropertiesName}' elements are constant definitions.", dataSchema.Value.Const.TokenIndex, dataSchema.Value.Type!.TokenIndex); + errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property value must be an object.", dataSchema.Value.Const.TokenIndex, dataSchema.Value.Type!.TokenIndex); hasError = true; } - - foreach (KeyValuePair> property in dataSchema.Value.Properties.Entries) + else { - if (property.Value.Value.Const == null) + foreach (KeyValuePair> property in dataSchema.Value.Properties.Entries) { - errorReporter.ReportError($"Data schema property '{property.Key}' value must have '{TDDataSchema.ConstName}' property when the parent schema defines a constant object.", property.Value.TokenIndex, dataSchema.Value.Const.TokenIndex); - hasError = true; - } - else if (property.Value.Value.Type!.Value.Value == TDValues.TypeObject) - { - errorReporter.ReportError($"Data schema property '{property.Key}' value is not permitted to define a nested constant object; value must define a constant with a primitive type ('{TDValues.TypeString}', '{TDValues.TypeNumber}', '{TDValues.TypeInteger}', or '{TDValues.TypeBoolean}').", property.Value.TokenIndex); + if (property.Value.Value.Type == null) + { + errorReporter.ReportError($"Data schema property '{property.Key}' is missing '{TDDataSchema.TypeName}' property, which is required in an object definition that specifies a constant value.", property.Value.TokenIndex, dataSchema.Value.Const.TokenIndex); + hasError = true; + } + else if (dataSchema.Value.Const.Value.ValueMap.Entries!.TryGetValue(property.Key, out ValueTracker? constValue)) + { + switch (property.Value.Value.Type!.Value.Value) + { + case TDValues.TypeString: + if (!TryValidateStringConst(property.Value, dataSchema.Value.Const, constValue)) + { + hasError = true; + } + break; + case TDValues.TypeNumber: + if (!TryValidateNumberConst(property.Value, dataSchema.Value.Const, constValue)) + { + hasError = true; + } + break; + case TDValues.TypeInteger: + if (!TryValidateIntegerConst(property.Value, dataSchema.Value.Const, constValue)) + { + hasError = true; + } + break; + case TDValues.TypeBoolean: + if (!TryValidateBooleanConst(property.Value, dataSchema.Value.Const, constValue)) + { + hasError = true; + } + break; + default: + errorReporter.ReportError($"Data schema property '{property.Key}' value must specify a '{TDDataSchema.TypeName}' value of '{TDValues.TypeString}', '{TDValues.TypeNumber}', '{TDValues.TypeInteger}', or '{TDValues.TypeBoolean}' because the object definition specifies a constant value.", property.Value.Value.Type.TokenIndex, dataSchema.Value.Const.TokenIndex); + hasError = true; + break; + } + } + else + { + errorReporter.ReportError($"Data schema '{TDDataSchema.PropertiesName}' value has property named '{property.Key}' that has no value in '{TDDataSchema.ConstName}' elements.", property.Value.TokenIndex, dataSchema.Value.Const.Value.ValueMap.TokenIndex); + hasError = true; + } } - else if (!TryValidateDataSchema(property.Value, null, DataSchemaKind.SchemaDefinition)) + + foreach (KeyValuePair> constValue in dataSchema.Value.Const.Value.ValueMap.Entries!) { - hasError = true; + if (!dataSchema.Value.Properties.Entries.ContainsKey(constValue.Key)) + { + errorReporter.ReportError($"Data schema '{TDDataSchema.ConstName}' value has property named '{constValue.Key}' that has no type definition in '{TDDataSchema.PropertiesName}' elements.", constValue.Value.TokenIndex, dataSchema.Value.Properties.TokenIndex); + hasError = true; + } } } @@ -1590,20 +1809,17 @@ private bool TryValidateObjectDataSchema(ValueTracker dataSchema, DataSche errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a 'service-desc' linked schema naming file", dataSchema.Value.Title.TokenIndex); } - foreach (KeyValuePair propertyName in dataSchema.Value.PropertyNames) + HashSet supportedProperties = new() { - if (propertyApprover?.Invoke(propertyName.Key) != true && propertyName.Key != TDDataSchema.TypeName && propertyName.Key != TDDataSchema.TitleName && propertyName.Key != TDDataSchema.DescriptionName && propertyName.Key != TDDataSchema.PropertiesName && propertyName.Key != TDDataSchema.ConstName) - { - if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) - { - errorReporter.ReportWarning($"Data schema has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); - } - else - { - errorReporter.ReportError($"Data schema defines a constant object, which does not support '{propertyName.Key}' property.", propertyName.Value); - hasError = true; - } - } + TDDataSchema.TypeName, + TDDataSchema.TitleName, + TDDataSchema.DescriptionName, + TDDataSchema.PropertiesName, + TDDataSchema.ConstName, + }; + if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, "a constant object", dataSchema.Value.Const.TokenIndex)) + { + hasError = true; } } else @@ -1616,11 +1832,6 @@ private bool TryValidateObjectDataSchema(ValueTracker dataSchema, DataSche } } - if (dataSchema.Value.Title != null && !TitleRegex.IsMatch(dataSchema.Value.Title.Value.Value)) - { - errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a 'service-desc' linked schema naming file", dataSchema.Value.Title.TokenIndex); - } - if (dataSchema.Value.Required?.Elements != null) { foreach (ValueTracker requiredProperty in dataSchema.Value.Required.Elements) @@ -1642,22 +1853,25 @@ private bool TryValidateObjectDataSchema(ValueTracker dataSchema, DataSche } } - foreach (KeyValuePair propertyName in dataSchema.Value.PropertyNames) + HashSet supportedProperties = new() { - if (propertyApprover?.Invoke(propertyName.Key) != true && propertyName.Key != TDDataSchema.TypeName && propertyName.Key != TDDataSchema.TitleName && propertyName.Key != TDDataSchema.DescriptionName && propertyName.Key != TDDataSchema.PropertiesName && propertyName.Key != TDDataSchema.RequiredName && propertyName.Key != TDDataSchema.ErrorMessageName) - { - if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) - { - errorReporter.ReportWarning($"Data schema has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); - } - else - { - errorReporter.ReportError($"Data schema defines a structured object, which does not support '{propertyName.Key}' property.", propertyName.Value); - hasError = true; - } - } + TDDataSchema.TypeName, + TDDataSchema.TitleName, + TDDataSchema.DescriptionName, + TDDataSchema.PropertiesName, + TDDataSchema.RequiredName, + TDDataSchema.ErrorMessageName, + }; + if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, "a structured object", dataSchema.Value.Properties.TokenIndex)) + { + hasError = true; } } + + if (dataSchema.Value.Title != null && !TitleRegex.IsMatch(dataSchema.Value.Title.Value.Value)) + { + errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a 'service-desc' linked schema naming file", dataSchema.Value.Title.TokenIndex); + } } else { @@ -1666,20 +1880,16 @@ private bool TryValidateObjectDataSchema(ValueTracker dataSchema, DataSche hasError = true; } - foreach (KeyValuePair propertyName in dataSchema.Value.PropertyNames) + HashSet supportedProperties = new() { - if (propertyApprover?.Invoke(propertyName.Key) != true && propertyName.Key != TDDataSchema.TypeName && propertyName.Key != TDDataSchema.TitleName && propertyName.Key != TDDataSchema.DescriptionName && propertyName.Key != TDDataSchema.AdditionalPropertiesName) - { - if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) - { - errorReporter.ReportWarning($"Data schema has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); - } - else - { - errorReporter.ReportError($"Data schema defines a map, which does not support '{propertyName.Key}' property.", propertyName.Value); - hasError = true; - } - } + TDDataSchema.TypeName, + TDDataSchema.TitleName, + TDDataSchema.DescriptionName, + TDDataSchema.AdditionalPropertiesName, + }; + if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, "a map", dataSchema.Value.AdditionalProperties!.TokenIndex)) + { + hasError = true; } } @@ -1718,18 +1928,24 @@ private bool TryValidateArrayDataSchema(ValueTracker dataSchema, Func supportedProperties = new() + { + TDDataSchema.TypeName, + TDDataSchema.TitleName, + TDDataSchema.DescriptionName, + TDDataSchema.ItemsName, + }; + if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, "an array schema")) + { + hasError = true; + } + return !hasError; } private bool TryValidateStringDataSchema(ValueTracker dataSchema, DataSchemaKind dataSchemaKind, Func? propertyApprover) where T : TDDataSchema, IDeserializable { - if (dataSchema.Value.Const != null && dataSchemaKind != DataSchemaKind.SchemaDefinition) - { - errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element or nested within a constant object definition.", dataSchema.Value.Const.TokenIndex); - return false; - } - bool hasError = false; if (dataSchema.Value.Enum?.Elements != null) @@ -1748,120 +1964,111 @@ private bool TryValidateStringDataSchema(ValueTracker dataSchema, DataSche } } - foreach (KeyValuePair propertyName in dataSchema.Value.PropertyNames) + HashSet supportedProperties = new() { - if (propertyApprover?.Invoke(propertyName.Key) != true && propertyName.Key != TDDataSchema.TypeName && propertyName.Key != TDDataSchema.TitleName && propertyName.Key != TDDataSchema.DescriptionName && propertyName.Key != TDDataSchema.EnumName) - { - if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) - { - errorReporter.ReportWarning($"Data schema has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); - } - else - { - errorReporter.ReportError($"Data schema defines an enumerated string, which does not support '{propertyName.Key}' property.", propertyName.Value); - hasError = true; - } - } + TDDataSchema.TypeName, + TDDataSchema.TitleName, + TDDataSchema.DescriptionName, + TDDataSchema.EnumName, + }; + if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, "an enumerated string", dataSchema.Value.Enum.TokenIndex)) + { + hasError = true; } } else { - List exclusiveProperties = new(); if (dataSchema.Value.Const != null) { - exclusiveProperties.Add(TDDataSchema.ConstName); - } - if (dataSchema.Value.Format != null) - { - exclusiveProperties.Add(TDDataSchema.FormatName); - } - if (dataSchema.Value.Pattern != null) - { - exclusiveProperties.Add(TDDataSchema.PatternName); - } - if (dataSchema.Value.ContentEncoding != null) - { - exclusiveProperties.Add(TDDataSchema.ContentEncodingName); - } - - if (exclusiveProperties.Count > 1) - { - errorReporter.ReportError($"Data schema string type cannot have more than one of the following properties: {string.Join(", ", exclusiveProperties)}.", dataSchema.TokenIndex); - hasError = true; - } - - if (dataSchema.Value.Const?.Value.Value != null) - { - if (dataSchema.Value.Title != null && !TitleRegex.IsMatch(dataSchema.Value.Title.Value.Value)) + if (dataSchemaKind != DataSchemaKind.SchemaDefinition) { - errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a 'service-desc' linked schema naming file", dataSchema.Value.Title.TokenIndex); + errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.Const.TokenIndex); + hasError = true; } - - if (dataSchema.Value.Const.Value.Value is not string) + else if (!TryValidateStringConst(dataSchema, dataSchema.Value.Const, dataSchema.Value.Const)) { - errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property value must be a string.", dataSchema.Value.Const.TokenIndex); hasError = true; } } - - if (dataSchema.Value.Format != null) + else { - string formatValue = dataSchema.Value.Format.Value.Value; - if (formatValue != TDValues.FormatDateTime && formatValue != TDValues.FormatDate && formatValue != TDValues.FormatTime && formatValue != TDValues.FormatUuid) + List exclusiveProperties = new(); + if (dataSchema.Value.Format != null) { - errorReporter.ReportError($"Data schema '{TDDataSchema.FormatName}' property has unsupported value '{formatValue}'; supported values are '{TDValues.FormatDateTime}', '{TDValues.FormatDate}', '{TDValues.FormatTime}', and '{TDValues.FormatUuid}'.", dataSchema.Value.Format.TokenIndex); - hasError = true; + exclusiveProperties.Add(TDDataSchema.FormatName); + } + if (dataSchema.Value.Pattern != null) + { + exclusiveProperties.Add(TDDataSchema.PatternName); + } + if (dataSchema.Value.ContentEncoding != null) + { + exclusiveProperties.Add(TDDataSchema.ContentEncodingName); } - } - if (dataSchema.Value.ContentEncoding != null) - { - string contentEncodingValue = dataSchema.Value.ContentEncoding.Value.Value; - if (contentEncodingValue != TDValues.ContentEncodingBase64) + if (exclusiveProperties.Count > 1) { - errorReporter.ReportError($"Data schema '{TDDataSchema.ContentEncodingName}' property has unsupported value '{contentEncodingValue}'; only supported value is '{TDValues.ContentEncodingBase64}'.", dataSchema.Value.ContentEncoding.TokenIndex); + errorReporter.ReportError($"Data schema string type cannot have more than one of the following properties: {string.Join(", ", exclusiveProperties)}.", dataSchema.TokenIndex); hasError = true; } - } - if (dataSchema.Value.Pattern != null) - { - string patternValue = dataSchema.Value.Pattern.Value.Value; - try + if (dataSchema.Value.Format != null) { - Regex patternRegex = new Regex(patternValue); - - if (patternRegex.IsMatch(AnArbitraryString)) - { - errorReporter.ReportWarning($"Data schema '{TDDataSchema.PatternName}' property value \"{patternValue}\" matches an arbitrary test string value, so no type restriction will be applied.", dataSchema.Value.Pattern.TokenIndex); - } - else if (!patternRegex.IsMatch(Iso8601DurationExample) && !patternRegex.IsMatch(DecimalExample)) + string formatValue = dataSchema.Value.Format.Value.Value; + if (formatValue != TDValues.FormatDateTime && formatValue != TDValues.FormatDate && formatValue != TDValues.FormatTime && formatValue != TDValues.FormatUuid) { - errorReporter.ReportError($"Data schema '{TDDataSchema.PatternName}' property value \"{patternValue}\" matches neither an ISO 8601 duration value (e.g., \"{Iso8601DurationExample}\") nor a decimal value (e.g., \"{DecimalExample}\"), so indended type is indeterminate.", dataSchema.Value.Pattern.TokenIndex); + errorReporter.ReportError($"Data schema '{TDDataSchema.FormatName}' property has unsupported value '{formatValue}'; supported values are '{TDValues.FormatDateTime}', '{TDValues.FormatDate}', '{TDValues.FormatTime}', and '{TDValues.FormatUuid}'.", dataSchema.Value.Format.TokenIndex); hasError = true; } } - catch (RegexParseException) + + if (dataSchema.Value.ContentEncoding != null) { - errorReporter.ReportError($"Data schema '{TDDataSchema.PatternName}' property has invalid regular expression pattern '{patternValue}'", dataSchema.Value.Pattern.TokenIndex); - hasError = true; + string contentEncodingValue = dataSchema.Value.ContentEncoding.Value.Value; + if (contentEncodingValue != TDValues.ContentEncodingBase64) + { + errorReporter.ReportError($"Data schema '{TDDataSchema.ContentEncodingName}' property has unsupported value '{contentEncodingValue}'; only supported value is '{TDValues.ContentEncodingBase64}'.", dataSchema.Value.ContentEncoding.TokenIndex); + hasError = true; + } } - } - foreach (KeyValuePair propertyName in dataSchema.Value.PropertyNames) - { - if (propertyApprover?.Invoke(propertyName.Key) != true && propertyName.Key != TDDataSchema.TypeName && propertyName.Key != TDDataSchema.TitleName && propertyName.Key != TDDataSchema.DescriptionName && propertyName.Key != TDDataSchema.ConstName && propertyName.Key != TDDataSchema.FormatName && propertyName.Key != TDDataSchema.ContentEncodingName && propertyName.Key != TDDataSchema.PatternName) + if (dataSchema.Value.Pattern != null) { - if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) + string patternValue = dataSchema.Value.Pattern.Value.Value; + try { - errorReporter.ReportWarning($"Data schema has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); + Regex patternRegex = new Regex(patternValue); + + if (patternRegex.IsMatch(AnArbitraryString)) + { + errorReporter.ReportWarning($"Data schema '{TDDataSchema.PatternName}' property value \"{patternValue}\" matches an arbitrary test string value, so no type restriction will be applied.", dataSchema.Value.Pattern.TokenIndex); + } + else if (!patternRegex.IsMatch(Iso8601DurationExample) && !patternRegex.IsMatch(DecimalExample)) + { + errorReporter.ReportError($"Data schema '{TDDataSchema.PatternName}' property value \"{patternValue}\" matches neither an ISO 8601 duration value (e.g., \"{Iso8601DurationExample}\") nor a decimal value (e.g., \"{DecimalExample}\"), so indended type is indeterminate.", dataSchema.Value.Pattern.TokenIndex); + hasError = true; + } } - else + catch (RegexParseException) { - errorReporter.ReportError($"Data schema defines a string type, which does not support '{propertyName.Key}' property.", propertyName.Value); + errorReporter.ReportError($"Data schema '{TDDataSchema.PatternName}' property has invalid regular expression pattern '{patternValue}'", dataSchema.Value.Pattern.TokenIndex); hasError = true; } } + + HashSet supportedProperties = new() + { + TDDataSchema.TypeName, + TDDataSchema.TitleName, + TDDataSchema.DescriptionName, + TDDataSchema.FormatName, + TDDataSchema.ContentEncodingName, + TDDataSchema.PatternName, + }; + if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, "a string schema")) + { + hasError = true; + } } } @@ -1873,58 +2080,37 @@ private bool TryValidateNumberDataSchema(ValueTracker dataSchema, DataSche { bool hasError = false; - if (dataSchema.Value.Const?.Value.Value != null && dataSchemaKind != DataSchemaKind.SchemaDefinition) - { - errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element or nested within a constant object definition.", dataSchema.Value.Const.TokenIndex); - return false; - } - if (dataSchema.Value.Minimum?.Value.Value != null && dataSchema.Value.Maximum?.Value.Value != null && dataSchema.Value.Maximum.Value.Value < dataSchema.Value.Minimum.Value.Value) { errorReporter.ReportError($"The '{TDDataSchema.MaximumName}' property value ({dataSchema.Value.Maximum.Value.Value}) cannot be less than the '{TDDataSchema.MinimumName}' property value ({dataSchema.Value.Minimum.Value.Value}).", dataSchema.Value.Maximum.TokenIndex, dataSchema.Value.Minimum.TokenIndex); hasError = true; } - if (dataSchema.Value.Const?.Value.Value != null) + if (dataSchema.Value.Const != null) { - if (dataSchema.Value.Title != null && !TitleRegex.IsMatch(dataSchema.Value.Title.Value.Value)) + if (dataSchemaKind != DataSchemaKind.SchemaDefinition) { - errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a 'service-desc' linked schema naming file", dataSchema.Value.Title.TokenIndex); - } - - if (dataSchema.Value.Const.Value.Value is double constValue) - { - if (dataSchema.Value.Minimum?.Value.Value != null && constValue < dataSchema.Value.Minimum.Value.Value) - { - errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property value ({constValue}) cannot be less than the '{TDDataSchema.MinimumName}' property value ({dataSchema.Value.Minimum.Value.Value}).", dataSchema.Value.Const.TokenIndex, dataSchema.Value.Minimum.TokenIndex); - hasError = true; - } - if (dataSchema.Value.Maximum?.Value.Value != null && constValue > dataSchema.Value.Maximum.Value.Value) - { - errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property value ({constValue}) cannot be greater than the '{TDDataSchema.MaximumName}' property value ({dataSchema.Value.Maximum.Value.Value}).", dataSchema.Value.Const.TokenIndex, dataSchema.Value.Maximum.TokenIndex); - hasError = true; - } + errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.Const.TokenIndex); + hasError = true; } - else + else if (!TryValidateNumberConst(dataSchema, dataSchema.Value.Const, dataSchema.Value.Const)) { - errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property value must be a number.", dataSchema.Value.Const.TokenIndex); hasError = true; } } - - foreach (KeyValuePair propertyName in dataSchema.Value.PropertyNames) + else { - if (propertyApprover?.Invoke(propertyName.Key) != true && propertyName.Key != TDDataSchema.TypeName && propertyName.Key != TDDataSchema.TitleName && propertyName.Key != TDDataSchema.DescriptionName && propertyName.Key != TDDataSchema.ConstName && propertyName.Key != TDDataSchema.MinimumName && propertyName.Key != TDDataSchema.MaximumName) + HashSet supportedProperties = new() { - if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) - { - errorReporter.ReportWarning($"Data schema has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); - } - else - { - errorReporter.ReportError($"Data schema defines a number type, which does not support '{propertyName.Key}' property.", propertyName.Value); - hasError = true; - } + TDDataSchema.TypeName, + TDDataSchema.TitleName, + TDDataSchema.DescriptionName, + TDDataSchema.MinimumName, + TDDataSchema.MaximumName, + }; + if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, "a number schema")) + { + hasError = true; } } @@ -1936,12 +2122,6 @@ private bool TryValidateIntegerDataSchema(ValueTracker dataSchema, DataSch { bool hasError = false; - if (dataSchema.Value.Const?.Value.Value != null && dataSchemaKind != DataSchemaKind.SchemaDefinition) - { - errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element or nested within a constant object definition.", dataSchema.Value.Const.TokenIndex); - return false; - } - if (dataSchema.Value.Minimum?.Value.Value != null && !double.IsInteger(dataSchema.Value.Minimum.Value.Value)) { errorReporter.ReportError($"The '{TDDataSchema.MinimumName}' property value must be an integer.", dataSchema.Value.Minimum.TokenIndex); @@ -1964,46 +2144,31 @@ private bool TryValidateIntegerDataSchema(ValueTracker dataSchema, DataSch hasError = true; } - if (dataSchema.Value.Const?.Value.Value != null) + if (dataSchema.Value.Const != null) { - if (dataSchema.Value.Title != null && !TitleRegex.IsMatch(dataSchema.Value.Title.Value.Value)) - { - errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a 'service-desc' linked schema naming file", dataSchema.Value.Title.TokenIndex); - } - - if (dataSchema.Value.Const.Value.Value is double constValue && double.IsInteger(constValue)) + if (dataSchemaKind != DataSchemaKind.SchemaDefinition) { - if (dataSchema.Value.Minimum?.Value.Value != null && constValue < dataSchema.Value.Minimum.Value.Value) - { - errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property value ({constValue}) cannot be less than the '{TDDataSchema.MinimumName}' property value ({dataSchema.Value.Minimum.Value.Value}).", dataSchema.Value.Const.TokenIndex, dataSchema.Value.Minimum.TokenIndex); - hasError = true; - } - if (dataSchema.Value.Maximum?.Value.Value != null && constValue > dataSchema.Value.Maximum.Value.Value) - { - errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property value ({constValue}) cannot be greater than the '{TDDataSchema.MaximumName}' property value ({dataSchema.Value.Maximum.Value.Value}).", dataSchema.Value.Const.TokenIndex, dataSchema.Value.Maximum.TokenIndex); - hasError = true; - } + errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.Const.TokenIndex); + hasError = true; } - else + else if (dataSchema.Value.Const != null && !TryValidateIntegerConst(dataSchema, dataSchema.Value.Const, dataSchema.Value.Const)) { - errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property value must be an integer.", dataSchema.Value.Const.TokenIndex); hasError = true; } } - - foreach (KeyValuePair propertyName in dataSchema.Value.PropertyNames) + else { - if (propertyApprover?.Invoke(propertyName.Key) != true && propertyName.Key != TDDataSchema.TypeName && propertyName.Key != TDDataSchema.TitleName && propertyName.Key != TDDataSchema.DescriptionName && propertyName.Key != TDDataSchema.ConstName && propertyName.Key != TDDataSchema.MinimumName && propertyName.Key != TDDataSchema.MaximumName) + HashSet supportedProperties = new() { - if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) - { - errorReporter.ReportWarning($"Data schema has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); - } - else - { - errorReporter.ReportError($"Data schema defines a integer type, which does not support '{propertyName.Key}' property.", propertyName.Value); - hasError = true; - } + TDDataSchema.TypeName, + TDDataSchema.TitleName, + TDDataSchema.DescriptionName, + TDDataSchema.MinimumName, + TDDataSchema.MaximumName, + }; + if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, "an integer schema")) + { + hasError = true; } } @@ -2013,41 +2178,31 @@ private bool TryValidateIntegerDataSchema(ValueTracker dataSchema, DataSch private bool TryValidateBooleanDataSchema(ValueTracker dataSchema, DataSchemaKind dataSchemaKind, Func? propertyApprover) where T : TDDataSchema, IDeserializable { - if (dataSchema.Value.Const != null && dataSchemaKind != DataSchemaKind.SchemaDefinition) - { - errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element or nested within a constant object definition.", dataSchema.Value.Const.TokenIndex); - return false; - } - bool hasError = false; - if (dataSchema.Value.Const?.Value.Value != null) + if (dataSchema.Value.Const != null) { - if (dataSchema.Value.Title != null && !TitleRegex.IsMatch(dataSchema.Value.Title.Value.Value)) + if (dataSchemaKind != DataSchemaKind.SchemaDefinition) { - errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a 'service-desc' linked schema naming file", dataSchema.Value.Title.TokenIndex); + errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.Const.TokenIndex); + hasError = true; } - - if (dataSchema.Value.Const.Value.Value is not bool) + else if (!TryValidateBooleanConst(dataSchema, dataSchema.Value.Const, dataSchema.Value.Const)) { - errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property value must be Boolean.", dataSchema.Value.Const.TokenIndex); hasError = true; } } - - foreach (KeyValuePair propertyName in dataSchema.Value.PropertyNames) + else { - if (propertyApprover?.Invoke(propertyName.Key) != true && propertyName.Key != TDDataSchema.TypeName && propertyName.Key != TDDataSchema.TitleName && propertyName.Key != TDDataSchema.DescriptionName && propertyName.Key != TDDataSchema.ConstName) + HashSet supportedProperties = new() { - if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) - { - errorReporter.ReportWarning($"Data schema has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); - } - else - { - errorReporter.ReportError($"Data schema defines a number type, which does not support '{propertyName.Key}' property.", propertyName.Value); - hasError = true; - } + TDDataSchema.TypeName, + TDDataSchema.TitleName, + TDDataSchema.DescriptionName, + }; + if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, "a Boolean schema")) + { + hasError = true; } } @@ -2063,25 +2218,18 @@ private bool TryValidateNullDataSchema(ValueTracker dataSchema, DataSchema return false; } - bool hasError = false; - - foreach (KeyValuePair propertyName in dataSchema.Value.PropertyNames) + HashSet supportedProperties = new() { - if (propertyApprover?.Invoke(propertyName.Key) != true && propertyName.Key != TDDataSchema.TypeName && propertyName.Key != TDDataSchema.TitleName && propertyName.Key != TDDataSchema.DescriptionName) - { - if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) - { - errorReporter.ReportWarning($"Data schema has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); - } - else - { - errorReporter.ReportError($"Data schema defines a null type, which does not support '{propertyName.Key}' property.", propertyName.Value); - hasError = true; - } - } + TDDataSchema.TypeName, + TDDataSchema.TitleName, + TDDataSchema.DescriptionName, + }; + if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, "a null schema")) + { + return false; } - return !hasError; + return true; } private enum DataSchemaKind diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs index 627dbbb89e..b813d4b575 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyGenerator.cs @@ -73,23 +73,31 @@ public static List GenerateEnvoys( private static void CollectNamedConstants(TDThing tdThing, SchemaNamer schemaNamer, Dictionary schemaConstants) { - IEnumerable>>? constDefs = tdThing.SchemaDefinitions?.Entries?.Where(d => d.Value.Value.Const?.Value != null && d.Value.Value.Type?.Value.Value != TDValues.TypeObject); - AddNamedConstants(schemaNamer.ConstantsSchema, "Global constants.", constDefs, schemaNamer, schemaConstants); + IEnumerable>> constDefs; + Dictionary> constValues; + + if (tdThing.SchemaDefinitions?.Entries != null) + { + constDefs = tdThing.SchemaDefinitions.Entries.Where(d => d.Value.Value.Const?.Value != null && d.Value.Value.Type?.Value.Value != TDValues.TypeObject); + constValues = constDefs.ToDictionary(d => d.Key, d => d.Value.Value.Const!); + AddNamedConstants(schemaNamer.ConstantsSchema, "Global constants.", constDefs, constValues, schemaNamer, schemaConstants); + } foreach (KeyValuePair> topLevelDef in tdThing.SchemaDefinitions?.Entries ?? new()) { - if (topLevelDef.Value.Value.Type?.Value.Value == TDValues.TypeObject && (bool?)topLevelDef.Value.Value.Const?.Value.Value == true) + if (topLevelDef.Value.Value.Properties?.Entries != null && topLevelDef.Value.Value.Const?.Value.ValueMap != null) { - constDefs = topLevelDef.Value.Value.Properties?.Entries?.Where(d => d.Value.Value.Const?.Value != null); + constDefs = topLevelDef.Value.Value.Properties.Entries; + constValues = topLevelDef.Value.Value.Const.Value.ValueMap!.Entries!; string schemaName = schemaNamer.ApplyBackupSchemaName(topLevelDef.Value.Value.Title?.Value.Value, topLevelDef.Key); - AddNamedConstants(schemaName, topLevelDef.Value.Value.Description?.Value.Value, constDefs!, schemaNamer, schemaConstants); + AddNamedConstants(schemaName, topLevelDef.Value.Value.Description?.Value.Value, constDefs!, constValues, schemaNamer, schemaConstants); } } } - private static void AddNamedConstants(string schemaName, string? description, IEnumerable>>? constDefs, SchemaNamer schemaNamer, Dictionary schemaConstants) + private static void AddNamedConstants(string schemaName, string? description, IEnumerable>> constDefs, Dictionary> constValues, SchemaNamer schemaNamer, Dictionary schemaConstants) { - if (constDefs?.Any() ?? false) + if (constDefs.Any()) { if (!schemaConstants.TryGetValue(schemaName, out ConstantsSpec? namedConstants)) { @@ -102,7 +110,7 @@ private static void AddNamedConstants(string schemaName, string? description, IE if (constDef.Value.Value.Type?.Value.Value == TDValues.TypeString || constDef.Value.Value.Type?.Value.Value == TDValues.TypeNumber || constDef.Value.Value.Type?.Value.Value == TDValues.TypeInteger || constDef.Value.Value.Type?.Value.Value == TDValues.TypeBoolean) { CodeName constName = new CodeName(schemaNamer.ChooseTitleOrName(constDef.Value.Value.Title?.Value.Value, constDef.Key)); - namedConstants.Constants[constName] = new TypedConstant(constDef.Value.Value.Type.Value.Value, constDef.Value.Value.Const!.Value!.Value, constDef.Value.Value.Description?.Value.Value); + namedConstants.Constants[constName] = new TypedConstant(constDef.Value.Value.Type.Value.Value, constValues[constDef.Key].Value.Value!, constDef.Value.Value.Description?.Value.Value); } } } diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/ObjectHolder.cs b/codegen2/src/Azure.Iot.Operations.TDParser/ObjectHolder.cs index 50ea1fb0af..1b6e1fc92f 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/ObjectHolder.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/ObjectHolder.cs @@ -6,7 +6,9 @@ public class ObjectHolder : IEquatable, IDeserializable { - public required object Value { get; set; } + public object? Value { get; set; } + + public MapTracker? ValueMap { get; set; } public virtual bool Equals(ObjectHolder? other) { @@ -14,15 +16,20 @@ public virtual bool Equals(ObjectHolder? other) { return false; } - else + if (Value != other.Value) + { + return false; + } + if (ValueMap != other.ValueMap) { - return Value == other.Value; + return false; } + return true; } public override int GetHashCode() { - return Value.GetHashCode(); + return (Value, ValueMap).GetHashCode(); } public static bool operator ==(ObjectHolder? left, ObjectHolder? right) @@ -66,6 +73,8 @@ public static ObjectHolder Deserialize(ref Utf8JsonReader reader) { switch (reader.TokenType) { + case JsonTokenType.StartObject: + return new ObjectHolder { ValueMap = MapTracker.Deserialize(ref reader, string.Empty) }; case JsonTokenType.String: return new ObjectHolder { Value = reader.GetString()! }; case JsonTokenType.Number: @@ -75,7 +84,7 @@ public static ObjectHolder Deserialize(ref Utf8JsonReader reader) case JsonTokenType.False: return new ObjectHolder { Value = false }; default: - throw new InvalidOperationException($"expected primitive value but found {reader.TokenType}"); + throw new InvalidOperationException($"expected primitive value or JSON object but found {reader.TokenType}"); } } diff --git a/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt b/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt index 960f19d642..0c04dee411 100644 --- a/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt +++ b/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt @@ -38,21 +38,20 @@ <# foreach (KeyValuePair namespacedEnum in this.namespacedEnums) { #> "<#=namespacedEnum.Key#>": { "type": "object", - "const": true, + "const": { +<# int ix2 = 1; foreach (DTEnumValueInfo enumValue in namespacedEnum.Value.EnumValues) { #> + "<#=enumValue.Name#>": <#=(ThingDescriber.GetPrimitiveType(namespacedEnum.Value.ValueSchema.Id) == "integer") ? enumValue.EnumValue : $"\"{enumValue.EnumValue}\""#><#=ix2 < namespacedEnum.Value.EnumValues.Count ? "," : ""#> +<# ix2++; } #> + }, <# if (namespacedEnum.Value.Description.Any()) { #> "description": "<#=namespacedEnum.Value.Description.First().Value#>", <# } #> "properties": { -<# int ix2 = 1; foreach (DTEnumValueInfo enumValue in namespacedEnum.Value.EnumValues) { #> +<# ix2 = 1; foreach (DTEnumValueInfo enumValue in namespacedEnum.Value.EnumValues) { #> "<#=enumValue.Name#>": { "type": "<#=ThingDescriber.GetPrimitiveType(namespacedEnum.Value.ValueSchema.Id)#>", <# if (enumValue.Description.Any()) { #> - "description": "<#=enumValue.Description.First().Value#>", -<# } #> -<# if (ThingDescriber.GetPrimitiveType(namespacedEnum.Value.ValueSchema.Id) == "integer") { #> - "const": <#=enumValue.EnumValue#> -<# } else { #> - "const": "<#=enumValue.EnumValue#>" + "description": "<#=enumValue.Description.First().Value#>" <# } #> }<#=ix2 < namespacedEnum.Value.EnumValues.Count ? "," : ""#> <# ix2++; } #> From 84a4a95d3c7510694777c17e583bbeb046f42793 Mon Sep 17 00:00:00 2001 From: Auto Gen Date: Mon, 22 Dec 2025 12:25:30 -0800 Subject: [PATCH 28/52] update csproj files with t4 generation instructions --- ...Azure.Iot.Operations.EnvoyGenerator.csproj | 25 +++++++++++++++++++ ...zure.Iot.Operations.SchemaGenerator.csproj | 25 +++++++++++++++++++ .../Azure.Iot.Operations.TypeGenerator.csproj | 25 +++++++++++++++++++ codegen2/src/Dtdl2Wot/Dtdl2Wot.csproj | 25 +++++++++++++++++++ 4 files changed, 100 insertions(+) diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/Azure.Iot.Operations.EnvoyGenerator.csproj b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/Azure.Iot.Operations.EnvoyGenerator.csproj index 28ecc28204..f1c534fd4f 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/Azure.Iot.Operations.EnvoyGenerator.csproj +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/Azure.Iot.Operations.EnvoyGenerator.csproj @@ -1,9 +1,32 @@  + + + + + + + + + + + + + + + + + + + + + 0.10.0 net9.0 enable + true + false @@ -307,4 +330,6 @@ + + diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/Azure.Iot.Operations.SchemaGenerator.csproj b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/Azure.Iot.Operations.SchemaGenerator.csproj index f3b821762b..7601fdfddc 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/Azure.Iot.Operations.SchemaGenerator.csproj +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/Azure.Iot.Operations.SchemaGenerator.csproj @@ -1,8 +1,31 @@  + + + + + + + + + + + + + + + + + + + + + net9.0 enable + true + false @@ -64,4 +87,6 @@ + + diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/Azure.Iot.Operations.TypeGenerator.csproj b/codegen2/src/Azure.Iot.Operations.TypeGenerator/Azure.Iot.Operations.TypeGenerator.csproj index f7f6180209..a567d97276 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/Azure.Iot.Operations.TypeGenerator.csproj +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/Azure.Iot.Operations.TypeGenerator.csproj @@ -1,9 +1,32 @@  + + + + + + + + + + + + + + + + + + + + + 0.10.0 net9.0 enable + true + false @@ -84,4 +107,6 @@ + + diff --git a/codegen2/src/Dtdl2Wot/Dtdl2Wot.csproj b/codegen2/src/Dtdl2Wot/Dtdl2Wot.csproj index 8fc14c3bd1..138889751e 100644 --- a/codegen2/src/Dtdl2Wot/Dtdl2Wot.csproj +++ b/codegen2/src/Dtdl2Wot/Dtdl2Wot.csproj @@ -1,9 +1,32 @@  + + + + + + + + + + + + + + + + + + + + + Exe net9.0 enable + true + false @@ -117,4 +140,6 @@ + + From 29acea8d14f1a91a47984dd62e667cd593457060 Mon Sep 17 00:00:00 2001 From: Auto Gen Date: Fri, 26 Dec 2025 11:39:43 -0800 Subject: [PATCH 29/52] add skeleton for ProtocolCompiler.UnitTests --- codegen2/codegen.sln | 17 + .../ErrorLog.cs | 4 +- .../ThingValidator.cs | 69 ++-- .../ArgBinder.cs | 1 + ...ure.Iot.Operations.ProtocolCompiler.csproj | 5 +- .../CommandHandler.cs | 381 +---------------- .../Program.cs | 11 +- ....Iot.Operations.ProtocolCompilerLib.csproj | 16 + .../CommandPerformer.cs | 388 ++++++++++++++++++ .../OptionContainer.cs | 2 +- ...erations.ProtocolCompiler.UnitTests.csproj | 33 ++ .../ProtocolCompilerTester.cs | 136 ++++++ .../TestCase.cs | 17 + .../TestCommandLine.cs | 44 ++ .../TestError.cs | 19 + .../SetColorInputArguments.schema.json | 14 + .../SetColorOutputArguments.schema.json | 14 + .../test-cases/failure/SampleTest.json | 25 ++ .../invalid/OneAction.TD.json | 50 +++ 19 files changed, 824 insertions(+), 422 deletions(-) create mode 100644 codegen2/src/Azure.Iot.Operations.ProtocolCompilerLib/Azure.Iot.Operations.ProtocolCompilerLib.csproj create mode 100644 codegen2/src/Azure.Iot.Operations.ProtocolCompilerLib/CommandPerformer.cs rename codegen2/src/{Azure.Iot.Operations.ProtocolCompiler => Azure.Iot.Operations.ProtocolCompilerLib}/OptionContainer.cs (97%) create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/Azure.Iot.Operations.ProtocolCompiler.UnitTests.csproj create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/ProtocolCompilerTester.cs create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/TestCase.cs create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/TestCommandLine.cs create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/TestError.cs create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/sandbox/SampleTest/SetColorInputArguments.schema.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/sandbox/SampleTest/SetColorOutputArguments.schema.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SampleTest.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalid/OneAction.TD.json diff --git a/codegen2/codegen.sln b/codegen2/codegen.sln index 7fc4b26712..8c6c630ea7 100644 --- a/codegen2/codegen.sln +++ b/codegen2/codegen.sln @@ -19,6 +19,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Azure.Iot.Operations.Protoc EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dtdl2Wot", "src\Dtdl2Wot\Dtdl2Wot.csproj", "{67B4CD3D-17A8-4D63-9996-79A424E628A1}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Azure.Iot.Operations.ProtocolCompilerLib", "src\Azure.Iot.Operations.ProtocolCompilerLib\Azure.Iot.Operations.ProtocolCompilerLib.csproj", "{F4163CB9-D895-4144-AEB5-CBDBC36B21D7}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Azure.Iot.Operations.ProtocolCompiler.UnitTests", "test\Azure.Iot.Operations.ProtocolCompiler.UnitTests\Azure.Iot.Operations.ProtocolCompiler.UnitTests.csproj", "{24D55C64-5869-C81B-611B-A84AB1D357C0}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -57,10 +63,21 @@ Global {67B4CD3D-17A8-4D63-9996-79A424E628A1}.Debug|Any CPU.Build.0 = Debug|Any CPU {67B4CD3D-17A8-4D63-9996-79A424E628A1}.Release|Any CPU.ActiveCfg = Release|Any CPU {67B4CD3D-17A8-4D63-9996-79A424E628A1}.Release|Any CPU.Build.0 = Release|Any CPU + {F4163CB9-D895-4144-AEB5-CBDBC36B21D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F4163CB9-D895-4144-AEB5-CBDBC36B21D7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F4163CB9-D895-4144-AEB5-CBDBC36B21D7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F4163CB9-D895-4144-AEB5-CBDBC36B21D7}.Release|Any CPU.Build.0 = Release|Any CPU + {24D55C64-5869-C81B-611B-A84AB1D357C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {24D55C64-5869-C81B-611B-A84AB1D357C0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {24D55C64-5869-C81B-611B-A84AB1D357C0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {24D55C64-5869-C81B-611B-A84AB1D357C0}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {24D55C64-5869-C81B-611B-A84AB1D357C0} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} + EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {DBD77462-D0B0-41D2-BC2B-EF17A519C667} EndGlobalSection diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs index d6d3a41760..49e845a213 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs @@ -14,6 +14,8 @@ public class ErrorLog private readonly Dictionary>> schemaNames; private readonly string defaultFolder; + public string Phase { get; set; } = "Initialization"; + public HashSet Warnings { get; init; } public HashSet Errors { get; init; } @@ -181,7 +183,7 @@ public void RegisterSchemaName(string name, string filename, string dirpath, int } } - public void AddError(ErrorLevel level, string message, string filename, int lineNumber, int cfLineNumber = -1, string crossRef = "") + public void AddError(ErrorLevel level, string message, string filename, int lineNumber, int cfLineNumber = 0, string crossRef = "") { ErrorRecord errorRecord = new(message, filename, lineNumber, cfLineNumber, crossRef); switch (level) diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs index 2f1797fa18..41e8518c86 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs @@ -1518,20 +1518,15 @@ private bool TryValidateReferenceDataSchema(ValueTracker dataSchema, Func< } } - foreach (KeyValuePair propertyName in dataSchema.Value.PropertyNames) + HashSet supportedProperties = new() { - if (propertyApprover?.Invoke(propertyName.Key) != true && propertyName.Key != "dtv:ref" && propertyName.Key != TDDataSchema.TitleName && propertyName.Key != TDDataSchema.DescriptionName) - { - if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) - { - errorReporter.ReportWarning($"Data schema has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); - } - else - { - errorReporter.ReportError($"Data schema has '{TDDataSchema.RefName}' property, which does not support '{propertyName.Key}' property.", propertyName.Value, tokenIndex); - hasError = true; - } - } + TDDataSchema.RefName, + TDDataSchema.TitleName, + TDDataSchema.DescriptionName, + }; + if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, propertyApprover, "a schema via a reference", tokenIndex)) + { + hasError = true; } return !hasError; @@ -1560,7 +1555,7 @@ private bool TryValidateStringConst(ValueTracker dataSchema, ValueTracker< TDDataSchema.DescriptionName, TDDataSchema.ConstName, }; - if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, "a constant string schema", constProperty.TokenIndex)) + if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, null, "a constant string schema", constProperty.TokenIndex)) { hasError = true; } @@ -1606,7 +1601,7 @@ private bool TryValidateNumberConst(ValueTracker dataSchema, ValueTracker< TDDataSchema.MaximumName, TDDataSchema.ConstName, }; - if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, "a constant number schema", constProperty.TokenIndex)) + if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, null, "a constant number schema", constProperty.TokenIndex)) { hasError = true; } @@ -1652,7 +1647,7 @@ private bool TryValidateIntegerConst(ValueTracker dataSchema, ValueTracker TDDataSchema.MaximumName, TDDataSchema.ConstName, }; - if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, "a constant integer schema", constProperty.TokenIndex)) + if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, null, "a constant integer schema", constProperty.TokenIndex)) { hasError = true; } @@ -1683,7 +1678,7 @@ private bool TryValidateBooleanConst(ValueTracker dataSchema, ValueTracker TDDataSchema.DescriptionName, TDDataSchema.ConstName, }; - if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, "a constant boolean schema", constProperty.TokenIndex)) + if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, null, "a constant boolean schema", constProperty.TokenIndex)) { hasError = true; } @@ -1691,13 +1686,13 @@ private bool TryValidateBooleanConst(ValueTracker dataSchema, ValueTracker return !hasError; } - private bool TryValidateResidualProperties(Dictionary propertyNames, HashSet supportedProperties, string schemaDescription, long cfTokenIndex = -1) + private bool TryValidateResidualProperties(Dictionary propertyNames, HashSet supportedProperties, Func? propertyApprover, string schemaDescription, long cfTokenIndex = -1) { bool hasError = false; foreach (KeyValuePair propertyName in propertyNames) { - if (!supportedProperties.Contains(propertyName.Key)) + if (propertyApprover?.Invoke(propertyName.Key) != true && !supportedProperties.Contains(propertyName.Key)) { if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) { @@ -1817,7 +1812,7 @@ private bool TryValidateObjectDataSchema(ValueTracker dataSchema, DataSche TDDataSchema.PropertiesName, TDDataSchema.ConstName, }; - if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, "a constant object", dataSchema.Value.Const.TokenIndex)) + if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, propertyApprover, "a constant object", dataSchema.Value.Const.TokenIndex)) { hasError = true; } @@ -1862,7 +1857,7 @@ private bool TryValidateObjectDataSchema(ValueTracker dataSchema, DataSche TDDataSchema.RequiredName, TDDataSchema.ErrorMessageName, }; - if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, "a structured object", dataSchema.Value.Properties.TokenIndex)) + if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, propertyApprover, "a structured object", dataSchema.Value.Properties.TokenIndex)) { hasError = true; } @@ -1887,7 +1882,7 @@ private bool TryValidateObjectDataSchema(ValueTracker dataSchema, DataSche TDDataSchema.DescriptionName, TDDataSchema.AdditionalPropertiesName, }; - if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, "a map", dataSchema.Value.AdditionalProperties!.TokenIndex)) + if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, propertyApprover, "a map", dataSchema.Value.AdditionalProperties!.TokenIndex)) { hasError = true; } @@ -1912,22 +1907,6 @@ private bool TryValidateArrayDataSchema(ValueTracker dataSchema, Func propertyName in dataSchema.Value.PropertyNames) - { - if (propertyApprover?.Invoke(propertyName.Key) != true && propertyName.Key != TDDataSchema.TypeName && propertyName.Key != TDDataSchema.TitleName && propertyName.Key != TDDataSchema.DescriptionName && propertyName.Key != TDDataSchema.ItemsName) - { - if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) - { - errorReporter.ReportWarning($"Data schema has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); - } - else - { - errorReporter.ReportError($"Data schema defines an array, which does not support '{propertyName.Key}' property.", propertyName.Value); - hasError = true; - } - } - } - HashSet supportedProperties = new() { TDDataSchema.TypeName, @@ -1935,7 +1914,7 @@ private bool TryValidateArrayDataSchema(ValueTracker dataSchema, Func(ValueTracker dataSchema, DataSche TDDataSchema.DescriptionName, TDDataSchema.EnumName, }; - if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, "an enumerated string", dataSchema.Value.Enum.TokenIndex)) + if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, propertyApprover, "an enumerated string", dataSchema.Value.Enum.TokenIndex)) { hasError = true; } @@ -2065,7 +2044,7 @@ private bool TryValidateStringDataSchema(ValueTracker dataSchema, DataSche TDDataSchema.ContentEncodingName, TDDataSchema.PatternName, }; - if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, "a string schema")) + if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, propertyApprover, "a string schema")) { hasError = true; } @@ -2108,7 +2087,7 @@ private bool TryValidateNumberDataSchema(ValueTracker dataSchema, DataSche TDDataSchema.MinimumName, TDDataSchema.MaximumName, }; - if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, "a number schema")) + if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, propertyApprover, "a number schema")) { hasError = true; } @@ -2166,7 +2145,7 @@ private bool TryValidateIntegerDataSchema(ValueTracker dataSchema, DataSch TDDataSchema.MinimumName, TDDataSchema.MaximumName, }; - if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, "an integer schema")) + if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, propertyApprover, "an integer schema")) { hasError = true; } @@ -2200,7 +2179,7 @@ private bool TryValidateBooleanDataSchema(ValueTracker dataSchema, DataSch TDDataSchema.TitleName, TDDataSchema.DescriptionName, }; - if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, "a Boolean schema")) + if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, propertyApprover, "a Boolean schema")) { hasError = true; } @@ -2224,7 +2203,7 @@ private bool TryValidateNullDataSchema(ValueTracker dataSchema, DataSchema TDDataSchema.TitleName, TDDataSchema.DescriptionName, }; - if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, "a null schema")) + if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, propertyApprover, "a null schema")) { return false; } diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/ArgBinder.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/ArgBinder.cs index eed9089c47..fdc0137341 100644 --- a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/ArgBinder.cs +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/ArgBinder.cs @@ -3,6 +3,7 @@ using System.CommandLine; using System.CommandLine.Binding; using System.IO; + using Azure.Iot.Operations.ProtocolCompilerLib; /// /// Custom arguemnt binder for CLI. diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/Azure.Iot.Operations.ProtocolCompiler.csproj b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/Azure.Iot.Operations.ProtocolCompiler.csproj index 8137cbe6d7..c0a2810ae8 100644 --- a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/Azure.Iot.Operations.ProtocolCompiler.csproj +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/Azure.Iot.Operations.ProtocolCompiler.csproj @@ -12,10 +12,7 @@ - - - - + diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs index 626fe331be..70deec1b8c 100644 --- a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/CommandHandler.cs @@ -2,19 +2,9 @@ { using System; using System.Collections.Generic; - using System.ComponentModel; - using System.Diagnostics; - using System.Diagnostics.CodeAnalysis; - using System.IO; using System.Linq; - using System.Text; - using System.Text.RegularExpressions; using Azure.Iot.Operations.CodeGeneration; - using Azure.Iot.Operations.EnvoyGenerator; - using Azure.Iot.Operations.TDParser; - using Azure.Iot.Operations.TDParser.Model; - using Azure.Iot.Operations.TypeGenerator; - using Azure.Iot.Operations.SchemaGenerator; + using Azure.Iot.Operations.ProtocolCompilerLib; internal class CommandHandler { @@ -32,375 +22,38 @@ internal class CommandHandler public static int GenerateCode(OptionContainer options) { - try + ErrorLog errorLog = CommandPerformer.GenerateCode(options, (string msg, bool noNewline) => { - WarnOnSuspiciousOptions(options); - - if (!TryConfirmValidOptions(options)) - { - return 1; - } - - string projectName = LegalizeProjectName(options.OutputDir.Name); - (TargetLanguage targetLanguage, string srcSubdir) = LanguageMap[options.Language.ToLowerInvariant()]; - - ErrorLog errorLog = new(options.WorkingDir.FullName); - - List parsedThings = ParseThings(options.ThingFiles, errorLog, out HashSet serializationFormats); - - if (errorLog.HasErrors) - { - DisplayErrors("Parsing", errorLog); - DisplayWarnings(errorLog); - return 1; - } - - Dictionary> generatedSchemas = SchemaGenerator.GenerateSchemas(parsedThings, projectName, options.WorkingDir); - - errorLog.CheckForDuplicatesInThings(); - if (errorLog.HasErrors) - { - DisplayErrors("Schema generation", errorLog); - DisplayWarnings(errorLog); - return 1; - } - - foreach (List schemas in generatedSchemas.Values) - { - WriteItems(schemas, options.WorkingDir); - } - - if (targetLanguage == TargetLanguage.None) - { - Console.WriteLine("No code generation requested; exiting after schema generation."); - return 0; - } - - FileInfo[] schemaFiles = options.SchemaFiles.SelectMany(fs => Directory.GetFiles(Path.GetDirectoryName(fs) ?? string.Empty, Path.GetFileName(fs)), (_, f) => new FileInfo(f)).ToArray(); - if (schemaFiles.Length > 0) - { - ImportSchemas(schemaFiles, generatedSchemas); - } - - string? typeNameInfoText = options.TypeNamerFile?.OpenText()?.ReadToEnd(); - TypeNamer typeNamer = new TypeNamer(typeNameInfoText); - - List generatedTypes = new(); - foreach (KeyValuePair> schemaSet in generatedSchemas) + if (noNewline) { - Dictionary schemaTextsByName = schemaSet.Value.ToDictionary(s => Path.GetFullPath(Path.Combine(options.WorkingDir.FullName, s.FolderPath, s.FileName)).Replace('\\', '/'), s => s.Content); - TypeGenerator typeGenerator = new TypeGenerator(schemaSet.Key, targetLanguage, typeNamer, errorLog); - generatedTypes.AddRange(typeGenerator.GenerateTypes(schemaTextsByName, new CodeName(options.GenNamespace), projectName, srcSubdir)); + Console.Write(msg); } - - errorLog.CheckForDuplicatesInSchemas(); - if (errorLog.HasErrors) + else { - DisplayErrors("Type generation", errorLog); - DisplayWarnings(errorLog); - return 1; + Console.WriteLine(msg); } + }); - WriteItems(generatedTypes, options.OutputDir); - - List typeNames = generatedTypes.Select(gt => Path.GetFileNameWithoutExtension(gt.FileName)).ToList(); - - string? sdkPath = options.SdkPath != null ? Path.GetRelativePath(options.OutputDir.FullName, options.SdkPath) : null; - - serializationFormats.UnionWith(generatedSchemas.Keys); - - List generatedEnvoys = EnvoyGenerator.GenerateEnvoys( - parsedThings, - serializationFormats.ToList(), - targetLanguage, - options.GenNamespace, - projectName, - sdkPath, - typeNames, - srcSubdir, - generateClient: !options.ServerOnly, - generateServer: !options.ClientOnly, - generateProject: !options.NoProj, - defaultImpl: options.DefaultImpl); - WriteItems(generatedEnvoys, options.OutputDir); - - if (targetLanguage == TargetLanguage.Rust) - { - GeneratedItem? cargoInfo = generatedEnvoys.FirstOrDefault(e => e.FileName.Equals("Cargo.toml", StringComparison.OrdinalIgnoreCase)); - if (cargoInfo != null) - { - string projectFolder = Path.Combine(options.OutputDir.FullName, cargoInfo.FolderPath); - try - { - RunCargo($"fmt --manifest-path {Path.Combine(projectFolder, "Cargo.toml")}", display: true); - RunCargo("install --locked cargo-machete@0.7.0", display: false); - RunCargo($"machete --fix {projectFolder}", display: true); - } - catch (Win32Exception) - { - Console.WriteLine("cargo tool not found; install per instructions: https://doc.rust-lang.org/cargo/getting-started/installation.html"); - } - } - } - - DisplayWarnings(errorLog); - } - catch (Exception ex) + if (errorLog.HasErrors) { - Console.ForegroundColor = ErrorColor; - Console.WriteLine($"Code generation failed with exception: {ex.Message}"); - Console.ResetColor(); + DisplayErrors(errorLog); + DisplayWarnings(errorLog); return 1; } - - return 0; - } - - private static void RunCargo(string args, bool display) - { - if (display) - { - Console.WriteLine($"cargo {args}"); - } - - using (Process cargo = new Process()) - { - cargo.StartInfo.FileName = "cargo"; - cargo.StartInfo.Arguments = args; - cargo.StartInfo.UseShellExecute = false; - cargo.StartInfo.RedirectStandardOutput = true; - cargo.Start(); - cargo.WaitForExit(); - } - } - - private static List ParseThings(FileInfo[] thingFiles, ErrorLog errorLog, out HashSet serializationFormats) - { - List parsedThings = new(); - serializationFormats = new HashSet(); - - foreach (FileInfo thingFile in thingFiles) - { - Console.Write($"Parsing thing description file: {thingFile.Name} ..."); - - using (StreamReader thingReader = thingFile.OpenText()) - { - string thingText = thingReader.ReadToEnd(); - byte[] thingBytes = Encoding.UTF8.GetBytes(thingText); - ErrorReporter errorReporter = new ErrorReporter(errorLog, thingFile.FullName, thingBytes); - ThingValidator thingValidator = new ThingValidator(errorReporter); - - if (TryGetThings(errorReporter, thingBytes, out List? things)) - { - int thingCount = 0; - foreach (TDThing thing in things) - { - if (thingValidator.TryValidateThng(thing, serializationFormats)) - { - ValueTracker? schemaNamesFilename = thing.Links?.Elements?.FirstOrDefault(l => l.Value.Rel?.Value.Value == TDValues.RelationSchemaNaming)?.Value.Href; - if (TryGetSchemaNamer(errorReporter, thingFile.DirectoryName!, schemaNamesFilename, out SchemaNamer? schemaNamer)) - { - thingCount++; - parsedThings.Add(new ParsedThing(thing, thingFile.Name, thingFile.DirectoryName!, schemaNamer, errorReporter)); - } - } - } - - Console.WriteLine($" {thingCount} {(thingCount == 1 ? "TD" : "TDs")} validly parsed"); - } - } - } - - return parsedThings; - } - - private static bool TryGetSchemaNamer(ErrorReporter errorReporter, string folderPath, ValueTracker? namerFilename, [NotNullWhen(true)] out SchemaNamer? schemaNamer) - { - if (namerFilename == null) - { - schemaNamer = new SchemaNamer(); - return true; - } - - FileInfo namerFile = new FileInfo(Path.Combine(folderPath, namerFilename.Value.Value)); - if (!namerFile.Exists) - { - errorReporter.ReportError($"Could not find schema naming file '{namerFilename.Value.Value}'.", namerFilename.TokenIndex); - - schemaNamer = null; - return false; - } - - string schemaNameInfoText = namerFile.OpenText().ReadToEnd(); - - try - { - schemaNamer = new SchemaNamer(schemaNameInfoText); - return true; - } - catch (Exception ex) - { - errorReporter.ReportError($"Failed to parse schema naming file '{namerFilename.Value.Value}': {ex.Message}", namerFilename.TokenIndex); - schemaNamer = null; - return false; - } - } - - private static bool TryGetThings(ErrorReporter errorReporter, byte[] thingBytes, [NotNullWhen(true)] out List? things) - { - bool hasError = false; - - try - { - things = TDParser.Parse(thingBytes); - } - catch (Exception ex) - { - errorReporter.ReportJsonException(ex); - things = null; - return false; - } - - foreach (TDThing thing in things) - { - foreach (ITraversable item in thing.Traverse()) - { - if (item is ISourceTracker tracker && tracker.DeserializingFailed) - { - errorReporter.ReportError($"TD deserialization error: {tracker.DeserializationError ?? string.Empty}.", tracker.TokenIndex); - hasError = true; - } - - if (item is ValueTracker dataSchema && dataSchema.Value?.Ref != null) - { - errorReporter.RegisterReferenceFromThing(dataSchema.Value.Ref.TokenIndex, dataSchema.Value.Ref.Value.Value); - } - } - } - - return !hasError; - } - - private static void WriteItems(List generatedItems, DirectoryInfo destDir) - { - foreach (GeneratedItem genItem in generatedItems) - { - DirectoryInfo folderPath = new DirectoryInfo(Path.Combine(destDir.FullName, genItem.FolderPath)); - if (!folderPath.Exists) - { - folderPath.Create(); - } - - string filePath = Path.Combine(folderPath.FullName, genItem.FileName); - File.WriteAllText(filePath, genItem.Content); - Console.WriteLine($" Generated {filePath}"); - } - } - - private static void ImportSchemas(FileInfo[] extSchemaFiles, Dictionary> generatedSchemas) - { - foreach (FileInfo schemaFile in extSchemaFiles) - { - SerializationFormat format = schemaFile.Name switch - { - string n when n.EndsWith(".json", StringComparison.OrdinalIgnoreCase) => SerializationFormat.Json, - _ => SerializationFormat.None, - }; - - if (!generatedSchemas.TryGetValue(format, out List? schemas)) - { - schemas = new(); - generatedSchemas[format] = schemas; - } - - schemas.Add(new GeneratedItem(schemaFile.OpenText().ReadToEnd(), schemaFile.Name, schemaFile.Directory!.FullName)); - } - } - - private static string LegalizeProjectName(string fsName) - { - return string.Join('.', fsName.Split('.', StringSplitOptions.RemoveEmptyEntries).Select(s => (char.IsNumber(s[0]) ? "_" : "") + Regex.Replace(s, "[^a-zA-Z0-9]+", "_", RegexOptions.CultureInvariant))); - } - - private static bool TryConfirmValidOptions(OptionContainer options) - { - bool anyThingFiles = options.ThingFiles.Length > 0; - bool anySchemaFiles = options.SchemaFiles.Any(fs => Directory.GetFiles(Path.GetDirectoryName(fs) ?? string.Empty, Path.GetFileName(fs)).Any()); - - if (!anyThingFiles && !anySchemaFiles) - { - Console.ForegroundColor = ErrorColor; - Console.WriteLine($"No Thing Description files specified, and no schema files {(options.SchemaFiles.Length > 0 ? "found" : "specified")}."); - Console.WriteLine("Use option --help for CLI usage and options."); - Console.ResetColor(); - return false; - } - - if (!SupportedLanguages.Contains(options.Language)) - { - string langCondition = string.IsNullOrEmpty(options.Language) ? "language not specified" : $"language '{options.Language}' not recognized"; - Console.ForegroundColor = ErrorColor; - Console.WriteLine($"{langCondition}; language must be {string.Join(" or ", SupportedLanguages.Select(l => $"'{l}'"))} (use 'none' for no code generation)"); - Console.ResetColor(); - return false; - } - - if (options.ClientOnly && options.ServerOnly) - { - Console.ForegroundColor = ErrorColor; - Console.WriteLine("options --clientOnly and --serverOnly are mutually exclusive"); - Console.ResetColor(); - return false; - } - - if (options.ThingFiles.Any(mf => !mf.Exists)) - { - Console.ForegroundColor = ErrorColor; - Console.WriteLine("All Thing Description files must exist. Non-existent files specified:"); - foreach (FileInfo f in options.ThingFiles.Where(tf => !tf.Exists)) - { - Console.WriteLine($" {f.FullName}"); - } - Console.ResetColor(); - return false; - } - - return true; - } - - private static void WarnOnSuspiciousOptions(OptionContainer options) - { - if (!options.WorkingDir.Exists) - { - WarnOnSuspiciousOption("workingDir", options.WorkingDir.Name); - } - - if (!options.OutputDir.Exists) + else { - WarnOnSuspiciousOption("outDir", options.OutputDir.Name); - } - - WarnOnSuspiciousOption("namespace", options.GenNamespace); - WarnOnSuspiciousOption("sdkPath", options.SdkPath); - } - - private static void WarnOnSuspiciousOption(string optionName, string? pathName) - { - if (pathName != null && pathName.StartsWith("--")) - { - Console.ForegroundColor = WarningColor; - Console.WriteLine($"Warning: {optionName} \"{pathName}\" looks like a flag. Did you forget to specify a value?"); - Console.ResetColor(); + DisplayWarnings(errorLog); + return 0; } } - private static void DisplayErrors(string generationPhase, ErrorLog errorLog) + private static void DisplayErrors(ErrorLog errorLog) { if (errorLog.Errors.Count > 0 || errorLog.FatalError != null) { Console.ForegroundColor = ErrorColor; Console.WriteLine(); - Console.WriteLine($"{generationPhase} FAILED with the following errors:"); + Console.WriteLine($"{errorLog.Phase} FAILED with the following errors:"); if (errorLog.FatalError != null) { Console.WriteLine($" FATAL: {FormatErrorRecord(errorLog.FatalError)}"); @@ -413,7 +66,6 @@ private static void DisplayErrors(string generationPhase, ErrorLog errorLog) } } - private static void DisplayWarnings(ErrorLog errorLog) { if (errorLog.Warnings.Count > 0) @@ -432,7 +84,8 @@ private static string FormatErrorRecord(ErrorRecord error) { string cfLineInfo = error.CfLineNumber > 0 ? $", cf. Line: {error.CfLineNumber}" : string.Empty; string lineInfo = error.LineNumber > 0 ? $", Line: {error.LineNumber}" : string.Empty; - return $"{error.Message} (File: {error.Filename}{lineInfo}{cfLineInfo})"; + string fileInfo = error.Filename != string.Empty ? $" (File: {error.Filename}{lineInfo}{cfLineInfo})" : string.Empty; + return $"{error.Message}{fileInfo}"; } } } diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/Program.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/Program.cs index efcd3d19b4..0923c80714 100644 --- a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/Program.cs +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/Program.cs @@ -3,13 +3,10 @@ using System; using System.CommandLine; using System.IO; + using Azure.Iot.Operations.ProtocolCompilerLib; internal class Program { - private static readonly string DefaultOutDir = "."; - private static readonly string DefaultWorkingDir = "schemas"; - private static readonly string DefaultNamespace = "Generated"; - static void Main(string[] args) { var thingFilesOption = new Option( @@ -29,19 +26,19 @@ static void Main(string[] args) var outDirOption = new Option( name: "--outDir", - getDefaultValue: () => new DirectoryInfo(DefaultOutDir), + getDefaultValue: () => new DirectoryInfo(CommandPerformer.DefaultOutDir), description: "Directory for receiving generated code") { ArgumentHelpName = "DIRPATH" }; var workingDirOption = new Option( name: "--workingDir", - getDefaultValue: () => DefaultWorkingDir, + getDefaultValue: () => CommandPerformer.DefaultWorkingDir, description: "Directory for storing temporary files (relative to outDir unless path is rooted)") { ArgumentHelpName = "DIRPATH" }; var namespaceOption = new Option( name: "--namespace", - getDefaultValue: () => DefaultNamespace, + getDefaultValue: () => CommandPerformer.DefaultNamespace, description: "Namespace for generated code") { ArgumentHelpName = "NAMESPACE" }; diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompilerLib/Azure.Iot.Operations.ProtocolCompilerLib.csproj b/codegen2/src/Azure.Iot.Operations.ProtocolCompilerLib/Azure.Iot.Operations.ProtocolCompilerLib.csproj new file mode 100644 index 0000000000..d849e95466 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompilerLib/Azure.Iot.Operations.ProtocolCompilerLib.csproj @@ -0,0 +1,16 @@ + + + + net9.0 + enable + + + + + + + + + + + diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompilerLib/CommandPerformer.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompilerLib/CommandPerformer.cs new file mode 100644 index 0000000000..9b6082d607 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompilerLib/CommandPerformer.cs @@ -0,0 +1,388 @@ +namespace Azure.Iot.Operations.ProtocolCompilerLib +{ + using System; + using System.Collections.Generic; + using System.ComponentModel; + using System.Diagnostics; + using System.Diagnostics.CodeAnalysis; + using System.IO; + using System.Linq; + using System.Text; + using System.Text.RegularExpressions; + using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.EnvoyGenerator; + using Azure.Iot.Operations.TDParser; + using Azure.Iot.Operations.TDParser.Model; + using Azure.Iot.Operations.TypeGenerator; + using Azure.Iot.Operations.SchemaGenerator; + + public static class CommandPerformer + { + public const string DefaultOutDir = "."; + public const string DefaultWorkingDir = "schemas"; + public const string DefaultNamespace = "Generated"; + + private static readonly Dictionary LanguageMap = new() + { + { "csharp", (TargetLanguage.CSharp, "") }, + { "rust", (TargetLanguage.Rust, "src") }, + { "none", (TargetLanguage.None, "") }, + }; + + public static readonly string[] SupportedLanguages = LanguageMap.Keys.ToArray(); + + public static ErrorLog GenerateCode(OptionContainer options, Action statusReceiver, bool suppressExternalTools = false) + { + ErrorLog errorLog = new(options.WorkingDir.FullName); + + try + { + WarnOnSuspiciousOptions(options, errorLog); + ValidateOptions(options, errorLog); + if (errorLog.HasErrors) + { + return errorLog; + } + + string projectName = LegalizeProjectName(options.OutputDir.Name); + (TargetLanguage targetLanguage, string srcSubdir) = LanguageMap[options.Language.ToLowerInvariant()]; + + errorLog.Phase = "Parsing"; + List parsedThings = ParseThings(options.ThingFiles, errorLog, out HashSet serializationFormats, statusReceiver); + + if (errorLog.HasErrors) + { + return errorLog; + } + + errorLog.Phase = "Schema generation"; + Dictionary> generatedSchemas = SchemaGenerator.GenerateSchemas(parsedThings, projectName, options.WorkingDir); + + errorLog.CheckForDuplicatesInThings(); + if (errorLog.HasErrors) + { + return errorLog; + } + + foreach (List schemas in generatedSchemas.Values) + { + WriteItems(schemas, options.WorkingDir, statusReceiver); + } + + if (targetLanguage == TargetLanguage.None) + { + statusReceiver?.Invoke("No code generation requested; exiting after schema generation.", false); + return errorLog; + } + + FileInfo[] schemaFiles = options.SchemaFiles.SelectMany(fs => Directory.GetFiles(Path.GetDirectoryName(fs) ?? string.Empty, Path.GetFileName(fs)), (_, f) => new FileInfo(f)).ToArray(); + if (schemaFiles.Length > 0) + { + ImportSchemas(schemaFiles, generatedSchemas); + } + + string? typeNameInfoText = options.TypeNamerFile?.OpenText()?.ReadToEnd(); + TypeNamer typeNamer = new TypeNamer(typeNameInfoText); + + errorLog.Phase = "Type generation"; + List generatedTypes = new(); + foreach (KeyValuePair> schemaSet in generatedSchemas) + { + Dictionary schemaTextsByName = schemaSet.Value.ToDictionary(s => Path.GetFullPath(Path.Combine(options.WorkingDir.FullName, s.FolderPath, s.FileName)).Replace('\\', '/'), s => s.Content); + TypeGenerator typeGenerator = new TypeGenerator(schemaSet.Key, targetLanguage, typeNamer, errorLog); + generatedTypes.AddRange(typeGenerator.GenerateTypes(schemaTextsByName, new CodeName(options.GenNamespace), projectName, srcSubdir)); + } + + errorLog.CheckForDuplicatesInSchemas(); + if (errorLog.HasErrors) + { + return errorLog; + } + + WriteItems(generatedTypes, options.OutputDir, statusReceiver); + + List typeNames = generatedTypes.Select(gt => Path.GetFileNameWithoutExtension(gt.FileName)).ToList(); + + string? sdkPath = options.SdkPath != null ? Path.GetRelativePath(options.OutputDir.FullName, options.SdkPath) : null; + + serializationFormats.UnionWith(generatedSchemas.Keys); + + errorLog.Phase = "Envoy generation"; + List generatedEnvoys = EnvoyGenerator.GenerateEnvoys( + parsedThings, + serializationFormats.ToList(), + targetLanguage, + options.GenNamespace, + projectName, + sdkPath, + typeNames, + srcSubdir, + generateClient: !options.ServerOnly, + generateServer: !options.ClientOnly, + generateProject: !options.NoProj, + defaultImpl: options.DefaultImpl); + WriteItems(generatedEnvoys, options.OutputDir, statusReceiver); + + if (targetLanguage == TargetLanguage.Rust && !suppressExternalTools) + { + GeneratedItem? cargoInfo = generatedEnvoys.FirstOrDefault(e => e.FileName.Equals("Cargo.toml", StringComparison.OrdinalIgnoreCase)); + if (cargoInfo != null) + { + string projectFolder = Path.Combine(options.OutputDir.FullName, cargoInfo.FolderPath); + try + { + RunCargo($"fmt --manifest-path {Path.Combine(projectFolder, "Cargo.toml")}", display: true); + RunCargo("install --locked cargo-machete@0.7.0", display: false); + RunCargo($"machete --fix {projectFolder}", display: true); + } + catch (Win32Exception) + { + Console.WriteLine("cargo tool not found; install per instructions: https://doc.rust-lang.org/cargo/getting-started/installation.html"); + } + } + } + } + catch (Exception ex) + { + AddUnlocatableError($"Exception: {ex.Message}", errorLog); + return errorLog; + } + + return errorLog; + } + + private static void RunCargo(string args, bool display) + { + if (display) + { + Console.WriteLine($"cargo {args}"); + } + + using (Process cargo = new Process()) + { + cargo.StartInfo.FileName = "cargo"; + cargo.StartInfo.Arguments = args; + cargo.StartInfo.UseShellExecute = false; + cargo.StartInfo.RedirectStandardOutput = true; + cargo.Start(); + cargo.WaitForExit(); + } + } + + private static List ParseThings(FileInfo[] thingFiles, ErrorLog errorLog, out HashSet serializationFormats, Action statusReceiver) + { + List parsedThings = new(); + serializationFormats = new HashSet(); + + foreach (FileInfo thingFile in thingFiles) + { + statusReceiver.Invoke($"Parsing thing description file: {thingFile.Name} ...", true); + + using (StreamReader thingReader = thingFile.OpenText()) + { + string thingText = thingReader.ReadToEnd(); + byte[] thingBytes = Encoding.UTF8.GetBytes(thingText); + ErrorReporter errorReporter = new ErrorReporter(errorLog, thingFile.FullName, thingBytes); + ThingValidator thingValidator = new ThingValidator(errorReporter); + + if (TryGetThings(errorReporter, thingBytes, out List? things)) + { + int thingCount = 0; + foreach (TDThing thing in things) + { + if (thingValidator.TryValidateThng(thing, serializationFormats)) + { + ValueTracker? schemaNamesFilename = thing.Links?.Elements?.FirstOrDefault(l => l.Value.Rel?.Value.Value == TDValues.RelationSchemaNaming)?.Value.Href; + if (TryGetSchemaNamer(errorReporter, thingFile.DirectoryName!, schemaNamesFilename, out SchemaNamer? schemaNamer)) + { + thingCount++; + parsedThings.Add(new ParsedThing(thing, thingFile.Name, thingFile.DirectoryName!, schemaNamer, errorReporter)); + } + } + } + + statusReceiver.Invoke($" {thingCount} {(thingCount == 1 ? "TD" : "TDs")} validly parsed", false); + } + } + } + + return parsedThings; + } + + private static bool TryGetSchemaNamer(ErrorReporter errorReporter, string folderPath, ValueTracker? namerFilename, [NotNullWhen(true)] out SchemaNamer? schemaNamer) + { + if (namerFilename == null) + { + schemaNamer = new SchemaNamer(); + return true; + } + + FileInfo namerFile = new FileInfo(Path.Combine(folderPath, namerFilename.Value.Value)); + if (!namerFile.Exists) + { + errorReporter.ReportError($"Could not find schema naming file '{namerFilename.Value.Value}'.", namerFilename.TokenIndex); + + schemaNamer = null; + return false; + } + + string schemaNameInfoText = namerFile.OpenText().ReadToEnd(); + + try + { + schemaNamer = new SchemaNamer(schemaNameInfoText); + return true; + } + catch (Exception ex) + { + errorReporter.ReportError($"Failed to parse schema naming file '{namerFilename.Value.Value}': {ex.Message}", namerFilename.TokenIndex); + schemaNamer = null; + return false; + } + } + + private static bool TryGetThings(ErrorReporter errorReporter, byte[] thingBytes, [NotNullWhen(true)] out List? things) + { + bool hasError = false; + + try + { + things = TDParser.Parse(thingBytes); + } + catch (Exception ex) + { + errorReporter.ReportJsonException(ex); + things = null; + return false; + } + + foreach (TDThing thing in things) + { + foreach (ITraversable item in thing.Traverse()) + { + if (item is ISourceTracker tracker && tracker.DeserializingFailed) + { + errorReporter.ReportError($"TD deserialization error: {tracker.DeserializationError ?? string.Empty}.", tracker.TokenIndex); + hasError = true; + } + + if (item is ValueTracker dataSchema && dataSchema.Value?.Ref != null) + { + errorReporter.RegisterReferenceFromThing(dataSchema.Value.Ref.TokenIndex, dataSchema.Value.Ref.Value.Value); + } + } + } + + return !hasError; + } + + private static void WriteItems(List generatedItems, DirectoryInfo destDir, Action statusReceiver) + { + foreach (GeneratedItem genItem in generatedItems) + { + DirectoryInfo folderPath = new DirectoryInfo(Path.Combine(destDir.FullName, genItem.FolderPath)); + if (!folderPath.Exists) + { + folderPath.Create(); + } + + string filePath = Path.Combine(folderPath.FullName, genItem.FileName); + File.WriteAllText(filePath, genItem.Content); + statusReceiver.Invoke($" Generated {filePath}", false); + } + } + + private static void ImportSchemas(FileInfo[] extSchemaFiles, Dictionary> generatedSchemas) + { + foreach (FileInfo schemaFile in extSchemaFiles) + { + SerializationFormat format = schemaFile.Name switch + { + string n when n.EndsWith(".json", StringComparison.OrdinalIgnoreCase) => SerializationFormat.Json, + _ => SerializationFormat.None, + }; + + if (!generatedSchemas.TryGetValue(format, out List? schemas)) + { + schemas = new(); + generatedSchemas[format] = schemas; + } + + schemas.Add(new GeneratedItem(schemaFile.OpenText().ReadToEnd(), schemaFile.Name, schemaFile.Directory!.FullName)); + } + } + + private static string LegalizeProjectName(string fsName) + { + return string.Join('.', fsName.Split('.', StringSplitOptions.RemoveEmptyEntries).Select(s => (char.IsNumber(s[0]) ? "_" : "") + Regex.Replace(s, "[^a-zA-Z0-9]+", "_", RegexOptions.CultureInvariant))); + } + + private static void ValidateOptions(OptionContainer options, ErrorLog errorLog) + { + bool anyThingFiles = options.ThingFiles.Length > 0; + bool anySchemaFiles = options.SchemaFiles.Any(fs => Directory.GetFiles(Path.GetDirectoryName(fs) ?? string.Empty, Path.GetFileName(fs)).Any()); + + if (!anyThingFiles && !anySchemaFiles) + { + AddUnlocatableError($"No Thing Description files specified, and no schema files {(options.SchemaFiles.Length > 0 ? "found" : "specified")}. Use option --help for CLI usage and options.", errorLog); + return; + } + + if (!SupportedLanguages.Contains(options.Language)) + { + string langCondition = string.IsNullOrEmpty(options.Language) ? "language not specified" : $"language '{options.Language}' not recognized"; + AddUnlocatableError($"{langCondition}; language must be {string.Join(" or ", SupportedLanguages.Select(l => $"'{l}'"))} (use 'none' for no code generation)", errorLog); + return; + } + + if (options.ClientOnly && options.ServerOnly) + { + AddUnlocatableError("options --clientOnly and --serverOnly are mutually exclusive", errorLog); + return; + } + + if (options.ThingFiles.Any(mf => !mf.Exists)) + { + foreach (FileInfo f in options.ThingFiles.Where(tf => !tf.Exists)) + { + AddUnlocatableError($"Non-existent Thing Description file: {f.FullName}", errorLog); + } + return; + } + } + + private static void WarnOnSuspiciousOptions(OptionContainer options, ErrorLog errorLog) + { + if (!options.WorkingDir.Exists) + { + WarnOnSuspiciousOption("workingDir", options.WorkingDir.Name, errorLog); + } + + if (!options.OutputDir.Exists) + { + WarnOnSuspiciousOption("outDir", options.OutputDir.Name, errorLog); + } + + WarnOnSuspiciousOption("namespace", options.GenNamespace, errorLog); + WarnOnSuspiciousOption("sdkPath", options.SdkPath, errorLog); + } + + private static void WarnOnSuspiciousOption(string optionName, string? pathName, ErrorLog errorLog) + { + if (pathName != null && pathName.StartsWith("--")) + { + AddUnlocatableWarning($"{optionName} \"{pathName}\" looks like a flag. Did you forget to specify a value?", errorLog); + } + } + + private static void AddUnlocatableError(string message, ErrorLog errorLog) + { + errorLog.AddError(ErrorLevel.Error, message, string.Empty, 0); + } + + private static void AddUnlocatableWarning(string message, ErrorLog errorLog) + { + errorLog.AddError(ErrorLevel.Warning, message, string.Empty, 0); + } + } +} diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/OptionContainer.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompilerLib/OptionContainer.cs similarity index 97% rename from codegen2/src/Azure.Iot.Operations.ProtocolCompiler/OptionContainer.cs rename to codegen2/src/Azure.Iot.Operations.ProtocolCompilerLib/OptionContainer.cs index 47fbfcd2e0..220367226a 100644 --- a/codegen2/src/Azure.Iot.Operations.ProtocolCompiler/OptionContainer.cs +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompilerLib/OptionContainer.cs @@ -1,4 +1,4 @@ -namespace Azure.Iot.Operations.ProtocolCompiler +namespace Azure.Iot.Operations.ProtocolCompilerLib { using System.IO; diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/Azure.Iot.Operations.ProtocolCompiler.UnitTests.csproj b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/Azure.Iot.Operations.ProtocolCompiler.UnitTests.csproj new file mode 100644 index 0000000000..1307cfa6ad --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/Azure.Iot.Operations.ProtocolCompiler.UnitTests.csproj @@ -0,0 +1,33 @@ + + + + net9.0 + enable + enable + + false + true + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + + + + + diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/ProtocolCompilerTester.cs b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/ProtocolCompilerTester.cs new file mode 100644 index 0000000000..c7cb5d60e7 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/ProtocolCompilerTester.cs @@ -0,0 +1,136 @@ +namespace Azure.Iot.Operations.ProtocolCompiler.UnitTests +{ + using System.Globalization; + using Xunit; + using System.Diagnostics; + using System.Buffers; + using System.IO; + using System.Text.Json; + using Azure.Iot.Operations.CodeGeneration; + using Azure.Iot.Operations.ProtocolCompilerLib; + + public class ProtocolCompilerTester + { + private const string basePath = "../../.."; + private const string testCasesPath = $"{basePath}/test-cases"; + private const string successCasesPath = $"{testCasesPath}/success"; + private const string failureCasesPath = $"{testCasesPath}/failure"; + private const string tdPath = $"{basePath}/thing-descriptions"; + private const string schemasPath = $"{basePath}/schemas"; + private const string namerPath = $"{basePath}/name-config"; + private const string sandboxPath = $"{basePath}/sandbox"; + + static ProtocolCompilerTester() + { + } + + public static IEnumerable GetFailureTestCases() + { + foreach (string testCasePath in Directory.GetFiles(failureCasesPath, @"*.json")) + { + string testCaseName = Path.GetFileNameWithoutExtension(testCasePath); + using (StreamReader streamReader = File.OpenText($"{failureCasesPath}/{testCaseName}.json")) + { + TestCase? testCase = JsonSerializer.Deserialize(streamReader.ReadToEnd()); + Assert.False(testCase == null, $"Test case '{testCaseName}' descriptor failed to deserialize"); + Assert.False(testCase.Success, $"Test case '{testCaseName}' is in failure folder but is marked as success."); + Assert.False(testCase.Errors.Length == 0, $"Test case '{testCaseName}' is marked as failure but descriptor contains no 'errors' elements."); + yield return new object[] { testCaseName, testCase.CommandLine, testCase.Errors }; + } + } + } + + [Theory] + [MemberData(nameof(GetFailureTestCases))] + public void TestProtocolCompilerFailures(string testCaseName, TestCommandLine commandLine, TestError[] errors) + { + OptionContainer options = GetOptionContainer(testCaseName, commandLine); + + ErrorLog errorLog = CommandPerformer.GenerateCode(options, (_, _) => { }, suppressExternalTools: true); + + if (errorLog.HasErrors) + { + foreach (ErrorRecord errorRecord in errorLog.Errors) + { + TestError? expectedError = GetBestMatchingExpectedError(errorRecord, errors); + if (expectedError != null) + { + Assert.Equal(expectedError.Filename, errorRecord.Filename); + Assert.Equal(expectedError.LineNumber, errorRecord.LineNumber); + Assert.Equal(expectedError.CfLineNumber, errorRecord.CfLineNumber); + Assert.Equal(expectedError.CrossRef, errorRecord.CrossRef); + } + else + { + Assert.Fail($"Test case '{testCaseName}' returned unexpected error: '{errorRecord.Message}', file: {errorRecord.Filename}, line: {errorRecord.LineNumber}, cfLine: {errorRecord.CfLineNumber}, crossRef: '{errorRecord.CrossRef}'"); + } + } + } + else + { + Assert.Fail($"Test case '{testCaseName}' was expected to fail but returned no errors."); + } + } + + private static TestError? GetBestMatchingExpectedError(ErrorRecord errorRecord, TestError[] errors) + { + List plausibleErrors = errors.Where(e => e.Filename == errorRecord.Filename && Math.Abs(e.LineNumber - errorRecord.LineNumber) < 2).ToList(); + if (plausibleErrors.Count == 0) + { + return null; + } + + // TODO left off here + return null; + } + + private static OptionContainer GetOptionContainer(string testCaseName, TestCommandLine commandLine) + { + string testCaseSandboxPath = $"{sandboxPath}/{testCaseName}"; + + if (commandLine.ThingFiles.Any(tf => Path.IsPathRooted(tf))) + { + Assert.Fail($"Test case '{testCaseName}' specifies absolute path for thing file, which is not supported in test."); + } + if (commandLine.SchemaFiles.Any(sf => Path.IsPathRooted(sf))) + { + Assert.Fail($"Test case '{testCaseName}' specifies absolute path for schema file, which is not supported in test."); + } + if (commandLine.TypeNamerFile != null && Path.IsPathRooted(commandLine.TypeNamerFile)) + { + Assert.Fail($"Test case '{testCaseName}' specifies absolute path for type namer file, which is not supported in test."); + } + if (commandLine.OutputDir != null && Path.IsPathRooted(commandLine.OutputDir)) + { + Assert.Fail($"Test case '{testCaseName}' specifies absolute path for output directory, which is not supported in test."); + } + if (commandLine.WorkingDir != null && Path.IsPathRooted(commandLine.WorkingDir)) + { + Assert.Fail($"Test case '{testCaseName}' specifies absolute path for working directory, which is not supported in test."); + } + + FileInfo[] thingFiles = commandLine.ThingFiles.Select(tf => new FileInfo(Path.GetFullPath($"{tdPath}/{tf}"))).ToArray(); + string[] schemaFiles = commandLine.SchemaFiles.Select(tf => Path.GetFullPath($"{schemasPath}/{tf}")).ToArray(); + FileInfo? typeNamerFile = commandLine.TypeNamerFile != null ? new FileInfo(Path.GetFullPath($"{namerPath}/{commandLine.TypeNamerFile}")) : null; + DirectoryInfo outputDir = new DirectoryInfo(commandLine.OutputDir != null ? Path.GetFullPath($"{testCaseSandboxPath}/{commandLine.OutputDir}") : $"{testCaseSandboxPath}/{CommandPerformer.DefaultOutDir}"); + DirectoryInfo workingDir = new DirectoryInfo(commandLine.WorkingDir != null ? Path.GetFullPath($"{outputDir}/{commandLine.WorkingDir}") : $"{outputDir}/{CommandPerformer.DefaultWorkingDir}"); + string genNamespace = commandLine.GenNamespace ?? CommandPerformer.DefaultNamespace; + + return new OptionContainer + { + ThingFiles = thingFiles, + SchemaFiles = schemaFiles, + TypeNamerFile = typeNamerFile, + OutputDir = outputDir, + WorkingDir = workingDir, + GenNamespace = genNamespace, + SdkPath = commandLine.SdkPath, + Language = commandLine.Language ?? "none", + ClientOnly = commandLine.ClientOnly, + ServerOnly = commandLine.ServerOnly, + NoProj = commandLine.NoProj, + DefaultImpl = commandLine.DefaultImpl + }; + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/TestCase.cs b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/TestCase.cs new file mode 100644 index 0000000000..534b4a00d7 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/TestCase.cs @@ -0,0 +1,17 @@ +namespace Azure.Iot.Operations.ProtocolCompiler.UnitTests +{ + using System.Collections.Generic; + using System.Text.Json.Serialization; + + public class TestCase + { + [JsonPropertyName("success")] + public bool Success { get; set; } + + [JsonPropertyName("commandLine")] + public TestCommandLine CommandLine { get; set; } = new(); + + [JsonPropertyName("errors")] + public TestError[] Errors { get; set; } = []; + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/TestCommandLine.cs b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/TestCommandLine.cs new file mode 100644 index 0000000000..cd0dfad7f6 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/TestCommandLine.cs @@ -0,0 +1,44 @@ +namespace Azure.Iot.Operations.ProtocolCompiler.UnitTests +{ + using System.Collections.Generic; + using System.Text.Json.Serialization; + + public class TestCommandLine + { + [JsonPropertyName("thingFiles")] + public string[] ThingFiles { get; set; } = []; + + [JsonPropertyName("schemas")] + public string[] SchemaFiles { get; set; } = []; + + [JsonPropertyName("typeNamer")] + public string? TypeNamerFile { get; set; } + + [JsonPropertyName("outDir")] + public string? OutputDir { get; set; } + + [JsonPropertyName("workingDir")] + public string? WorkingDir { get; set; } + + [JsonPropertyName("namespaace")] + public string? GenNamespace { get; set; } + + [JsonPropertyName("sdkPath")] + public string? SdkPath { get; set; } + + [JsonPropertyName("lang")] + public string? Language { get; set; } + + [JsonPropertyName("clientOnly")] + public bool ClientOnly { get; set; } + + [JsonPropertyName("serverOnly")] + public bool ServerOnly { get; set; } + + [JsonPropertyName("noProj")] + public bool NoProj { get; set; } + + [JsonPropertyName("defaultImpl")] + public bool DefaultImpl { get; set; } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/TestError.cs b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/TestError.cs new file mode 100644 index 0000000000..afaf71bcfa --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/TestError.cs @@ -0,0 +1,19 @@ +namespace Azure.Iot.Operations.ProtocolCompiler.UnitTests +{ + using System.Text.Json.Serialization; + + public class TestError + { + [JsonPropertyName("filename")] + public string Filename { get; set; } = string.Empty; + + [JsonPropertyName("line")] + public int LineNumber { get; set; } = 0; + + [JsonPropertyName("cfLine")] + public int CfLineNumber { get; set; } = 0; + + [JsonPropertyName("crossRef")] + public string CrossRef { get; set; } = string.Empty; + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/sandbox/SampleTest/SetColorInputArguments.schema.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/sandbox/SampleTest/SetColorInputArguments.schema.json new file mode 100644 index 0000000000..caa8eb10a8 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/sandbox/SampleTest/SetColorInputArguments.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "SetColorInputArguments", + "description": "Input arguments for action 'setColor'", + "type": "object", + "additionalProperties": false, + "required": [ "newColor" ], + "properties": { + "newColor": { + "description": "The 'newColor' Field.", + "type": "string" + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/sandbox/SampleTest/SetColorOutputArguments.schema.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/sandbox/SampleTest/SetColorOutputArguments.schema.json new file mode 100644 index 0000000000..f63e5a425c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/sandbox/SampleTest/SetColorOutputArguments.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "SetColorOutputArguments", + "description": "Output arguments for action 'setColor'", + "type": "object", + "additionalProperties": false, + "required": [ "oldColor" ], + "properties": { + "oldColor": { + "description": "The 'oldColor' Field.", + "type": "string" + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SampleTest.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SampleTest.json new file mode 100644 index 0000000000..df05047cbe --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SampleTest.json @@ -0,0 +1,25 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalid/OneAction.TD.json" ], + "schemas": [ ], + "typeNamer": null, + "outDir": "", + "workingDir": "", + "namespaace": "", + "sdkPath": null, + "lang": "none", + "clientOnly": false, + "serverOnly": false, + "noProj": false, + "defaultImpl": false + }, + "errors": [ + { + "filename": "OneAction.TD.json", + "line": 32, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalid/OneAction.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalid/OneAction.TD.json new file mode 100644 index 0000000000..ab11e2712b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalid/OneAction.TD.json @@ -0,0 +1,50 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:OneAction;1", + "title": "OneAction", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "setColor": { + "input": { + "type": "object", + "required": [ "newColor" ], + "properties": { + "newColor": { + "type": "string" + } + } + }, + "output": { + "type": "object", + "required": [ "oldColor" ], + "properties": { + "oldColor": { + "type": "foobar" + } + } + }, + "forms": [ + { + "href": "dtmi:jsonTest:TelemetryAndCommand:_contents:__setColor;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/setColor", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} From 8f4d2b16d2eb5f63d4a0bbbb2377953ce7e417a2 Mon Sep 17 00:00:00 2001 From: "John (JD) Douceur" Date: Fri, 26 Dec 2025 12:31:25 -0800 Subject: [PATCH 30/52] Revert "update csproj files with t4 generation instructions" This reverts commit 84a4a95d3c7510694777c17e583bbeb046f42793. --- ...Azure.Iot.Operations.EnvoyGenerator.csproj | 25 ------------------- ...zure.Iot.Operations.SchemaGenerator.csproj | 25 ------------------- .../Azure.Iot.Operations.TypeGenerator.csproj | 25 ------------------- codegen2/src/Dtdl2Wot/Dtdl2Wot.csproj | 25 ------------------- 4 files changed, 100 deletions(-) diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/Azure.Iot.Operations.EnvoyGenerator.csproj b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/Azure.Iot.Operations.EnvoyGenerator.csproj index f1c534fd4f..28ecc28204 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/Azure.Iot.Operations.EnvoyGenerator.csproj +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/Azure.Iot.Operations.EnvoyGenerator.csproj @@ -1,32 +1,9 @@  - - - - - - - - - - - - - - - - - - - - - 0.10.0 net9.0 enable - true - false @@ -330,6 +307,4 @@ - - diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/Azure.Iot.Operations.SchemaGenerator.csproj b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/Azure.Iot.Operations.SchemaGenerator.csproj index 7601fdfddc..f3b821762b 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/Azure.Iot.Operations.SchemaGenerator.csproj +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/Azure.Iot.Operations.SchemaGenerator.csproj @@ -1,31 +1,8 @@  - - - - - - - - - - - - - - - - - - - - - net9.0 enable - true - false @@ -87,6 +64,4 @@ - - diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/Azure.Iot.Operations.TypeGenerator.csproj b/codegen2/src/Azure.Iot.Operations.TypeGenerator/Azure.Iot.Operations.TypeGenerator.csproj index a567d97276..f7f6180209 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/Azure.Iot.Operations.TypeGenerator.csproj +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/Azure.Iot.Operations.TypeGenerator.csproj @@ -1,32 +1,9 @@  - - - - - - - - - - - - - - - - - - - - - 0.10.0 net9.0 enable - true - false @@ -107,6 +84,4 @@ - - diff --git a/codegen2/src/Dtdl2Wot/Dtdl2Wot.csproj b/codegen2/src/Dtdl2Wot/Dtdl2Wot.csproj index 138889751e..8fc14c3bd1 100644 --- a/codegen2/src/Dtdl2Wot/Dtdl2Wot.csproj +++ b/codegen2/src/Dtdl2Wot/Dtdl2Wot.csproj @@ -1,32 +1,9 @@  - - - - - - - - - - - - - - - - - - - - - Exe net9.0 enable - true - false @@ -140,6 +117,4 @@ - - From 79fb4f47306135ffe248e6c4aa7f912071e9d6cf Mon Sep 17 00:00:00 2001 From: "John (JD) Douceur" Date: Fri, 26 Dec 2025 16:17:28 -0800 Subject: [PATCH 31/52] add programmatic error condition --- .../ErrorCondition.cs | 20 ++ .../ErrorLog.cs | 20 +- .../ErrorRecord.cs | 2 +- .../ErrorReporter.cs | 14 +- .../ThingSupport.cs | 2 +- .../ThingValidator.cs | 288 +++++++++--------- .../CommandPerformer.cs | 22 +- .../EnumSpec.cs | 4 +- .../ObjectSpec.cs | 2 +- .../SchemaGenerator.cs | 12 +- .../JsonSchemaStandardizer.cs | 90 +++--- .../ProtocolCompilerTester.cs | 30 +- .../TestError.cs | 4 + .../test-cases/failure/SampleTest.json | 1 + 14 files changed, 279 insertions(+), 232 deletions(-) create mode 100644 codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorCondition.cs diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorCondition.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorCondition.cs new file mode 100644 index 0000000000..a262c756a1 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorCondition.cs @@ -0,0 +1,20 @@ +namespace Azure.Iot.Operations.CodeGeneration +{ + public enum ErrorCondition + { + None, + Duplication, + ElementMissing, + ElementsPlural, + ItemNotFound, + JsonInvalid, + PropertyMissing, + PropertyEmpty, + PropertyInvalid, + PropertyUnsupported, + PropertyUnsupportedValue, + TypeMismatch, + Unusable, + ValuesInconsistent, + } +} diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs index 49e845a213..a5cd5ac75c 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs @@ -47,7 +47,7 @@ public void CheckForDuplicatesInThings() { foreach (var (filename, lineNumber) in idSites) { - AddError(ErrorLevel.Error, $"Duplicate use of '{TDThing.IdName}' value '{id}' across TDs.", filename, lineNumber, crossRef: id); + AddError(ErrorLevel.Error, ErrorCondition.Duplication, $"Duplicate use of '{TDThing.IdName}' value '{id}' across TDs.", filename, lineNumber, crossRef: id); } } } @@ -58,7 +58,7 @@ public void CheckForDuplicatesInThings() { foreach (var (filename, lineNumber) in nameSites) { - AddError(ErrorLevel.Error, $"Duplicate use of generated name '{name}' across Thing Descriptions.", filename, lineNumber, crossRef: name); + AddError(ErrorLevel.Error, ErrorCondition.Duplication, $"Duplicate use of generated name '{name}' across Thing Descriptions.", filename, lineNumber, crossRef: name); } } } @@ -82,7 +82,7 @@ public void CheckForDuplicatesInThings() citation = $" (in model as \"{reference.Value}\")"; } - AddError(ErrorLevel.Error, $"{description} '{topic}' used by multiple affordances{citation}.", reference.Filename, reference.LineNumber, crossRef: topic); + AddError(ErrorLevel.Error, ErrorCondition.Duplication, $"{description} '{topic}' used by multiple affordances{citation}.", reference.Filename, reference.LineNumber, crossRef: topic); } } } @@ -96,7 +96,7 @@ public void CheckForDuplicatesInSchemas() { foreach (var (filename, lineNumber) in nameSites) { - AddError(ErrorLevel.Error, $"Duplicate use of generated name '{name}' across schema definitions.", filename, lineNumber, crossRef: name); + AddError(ErrorLevel.Error, ErrorCondition.Duplication, $"Duplicate use of generated name '{name}' across schema definitions.", filename, lineNumber, crossRef: name); } } } @@ -183,9 +183,9 @@ public void RegisterSchemaName(string name, string filename, string dirpath, int } } - public void AddError(ErrorLevel level, string message, string filename, int lineNumber, int cfLineNumber = 0, string crossRef = "") + public void AddError(ErrorLevel level, ErrorCondition condition, string message, string filename, int lineNumber, int cfLineNumber = 0, string crossRef = "") { - ErrorRecord errorRecord = new(message, filename, lineNumber, cfLineNumber, crossRef); + ErrorRecord errorRecord = new(condition, message, filename, lineNumber, cfLineNumber, crossRef); switch (level) { case ErrorLevel.Warning: @@ -206,12 +206,12 @@ public void AddReferenceError(string refPath, string description, string reason, { foreach (ValueReference reference in references) { - AddError(ErrorLevel.Error, $"External schema reference \"{reference.Value}\" not resolvable; {reason}", reference.Filename, reference.LineNumber); + AddError(ErrorLevel.Error, ErrorCondition.ItemNotFound, $"External schema reference \"{reference.Value}\" not resolvable; {reason}", reference.Filename, reference.LineNumber); } } else { - AddError(ErrorLevel.Error, $"{description} \"{refValue}\" not resolvable; {reason}", filename, lineNumber); + AddError(ErrorLevel.Error, ErrorCondition.ItemNotFound, $"{description} \"{refValue}\" not resolvable; {reason}", filename, lineNumber); } } @@ -222,12 +222,12 @@ public void AddReferenceTypeError(string refPath, string description, string fil { foreach (ValueReference reference in typedReferences) { - AddError(ErrorLevel.Error, $"External schema reference \"{reference.Value}\" is expected to define a schema of type \"{refType}\", but it defines a schema of type \"{actualType}\"", reference.Filename, reference.LineNumber); + AddError(ErrorLevel.Error, ErrorCondition.TypeMismatch, $"External schema reference \"{reference.Value}\" is expected to define a schema of type \"{refType}\", but it defines a schema of type \"{actualType}\"", reference.Filename, reference.LineNumber); } } else { - AddError(ErrorLevel.Error, $"{description} \"{refValue}\" is expected to define a schema of type \"{refType}\", but it defines a schema of type \"{actualType}\"", filename, lineNumber); + AddError(ErrorLevel.Error, ErrorCondition.TypeMismatch, $"{description} \"{refValue}\" is expected to define a schema of type \"{refType}\", but it defines a schema of type \"{actualType}\"", filename, lineNumber); } } } diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorRecord.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorRecord.cs index 825294ef8b..586e8a4806 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorRecord.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorRecord.cs @@ -1,4 +1,4 @@ namespace Azure.Iot.Operations.CodeGeneration { - public record ErrorRecord(string Message, string Filename, int LineNumber, int CfLineNumber, string CrossRef); + public record ErrorRecord(ErrorCondition Condition, string Message, string Filename, int LineNumber, int CfLineNumber, string CrossRef); } diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs index abc1a4d586..9faec33079 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs @@ -54,19 +54,19 @@ public void RegisterSchemaName(string name, long byteIndex) this.errorLog.RegisterSchemaName(name, this.filename, this.basePath, GetLineNumber(byteIndex)); } - public void ReportError(string message, long byteIndex, long cfByteIndex = -1, ErrorLevel level = ErrorLevel.Error) + public void ReportError(ErrorCondition condition, string message, long byteIndex, long cfByteIndex = -1, ErrorLevel level = ErrorLevel.Error) { - this.errorLog.AddError(level, message, this.filename, GetLineNumber(byteIndex), GetLineNumber(cfByteIndex)); + this.errorLog.AddError(level, condition, message, this.filename, GetLineNumber(byteIndex), GetLineNumber(cfByteIndex)); } public void ReportWarning(string message, long byteIndex, long cfByteIndex = -1) { - ReportError(message, byteIndex, cfByteIndex, ErrorLevel.Warning); + ReportError(ErrorCondition.None, message, byteIndex, cfByteIndex, ErrorLevel.Warning); } - public void ReportFatal(string message, long byteIndex, long cfByteIndex = -1) + public void ReportFatal(ErrorCondition condition, string message, long byteIndex, long cfByteIndex = -1) { - ReportError(message, byteIndex, cfByteIndex, ErrorLevel.Fatal); + ReportError(condition, message, byteIndex, cfByteIndex, ErrorLevel.Fatal); } public void ReportReferenceError(string description, string reason, string refValue, long byteIndex) @@ -89,11 +89,11 @@ public void ReportJsonException(Exception ex) string innerMessage = match.Groups[1].Captures[0].Value; string message = $"JSON syntax error: {innerMessage}."; int lineNumber = int.Parse(match.Groups[2].Captures[0].Value) + 1; - this.errorLog.AddError(ErrorLevel.Fatal, message, this.filename, lineNumber); + this.errorLog.AddError(ErrorLevel.Fatal, ErrorCondition.JsonInvalid, message, this.filename, lineNumber); } else { - this.errorLog.AddError(ErrorLevel.Fatal, ex.Message, this.filename, -1); + this.errorLog.AddError(ErrorLevel.Fatal, ErrorCondition.JsonInvalid, ex.Message, this.filename, -1); } } diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingSupport.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingSupport.cs index 7699cca9b9..2a9b326461 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingSupport.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingSupport.cs @@ -58,7 +58,7 @@ public static SerializationFormat ContentTypeToFormat(ErrorReporter errorReporte if (format == SerializationFormat.None) { - errorReporter.ReportError($"Unsupported content type '{contentType.Value.Value}'.", contentType.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupportedValue, $"Unsupported content type '{contentType.Value.Value}'.", contentType.TokenIndex); } return format; diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs index 41e8518c86..b4bd54b093 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs @@ -195,7 +195,7 @@ private bool TryValidateRootForms(ArrayTracker? forms, MapTracker? readAllOp = aggregateOps.FirstOrDefault(op => op.Value.Value == TDValues.OpReadAllProps); if (writeMultiOp != null && readAllOp == null) { - errorReporter.ReportError($"'{TDThing.FormsName}' array contains '{TDForm.OpName}' property with value '{TDValues.OpWriteMultProps}' but no '{TDForm.OpName}' property with value '{TDValues.OpReadAllProps}'.", writeMultiOp.TokenIndex, forms.TokenIndex); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"'{TDThing.FormsName}' array contains '{TDForm.OpName}' property with value '{TDValues.OpWriteMultProps}' but no '{TDForm.OpName}' property with value '{TDValues.OpReadAllProps}'.", writeMultiOp.TokenIndex, forms.TokenIndex); return false; } @@ -212,7 +212,7 @@ private bool TryValidateCrossFormConsistency(ArrayTracker? rootForms, Ma { if (!(action.Value.Value.Forms?.Elements?.Any(f => f.Value.Topic != null) ?? false)) { - errorReporter.ReportError($"Action '{action.Key}' has no '{TDAction.FormsName}' element with a '{TDForm.TopicName}' property, so it cannot be invoked.", action.Value.TokenIndex); + errorReporter.ReportError(ErrorCondition.Unusable, $"Action '{action.Key}' has no '{TDAction.FormsName}' element with a '{TDForm.TopicName}' property, so it cannot be invoked.", action.Value.TokenIndex); hasError = true; } } @@ -235,7 +235,7 @@ private bool TryValidateCrossFormConsistency(ArrayTracker? rootForms, Ma { if (properties?.Entries == null || properties.Entries.Count == 0) { - errorReporter.ReportError($"Root-level form has '{TDForm.OpName}' property with value '{TDValues.OpReadAllProps}' to read the aggregation of all properties, but Thing Description has no properties defined.", + errorReporter.ReportError(ErrorCondition.Unusable, $"Root-level form has '{TDForm.OpName}' property with value '{TDValues.OpReadAllProps}' to read the aggregation of all properties, but Thing Description has no properties defined.", readAllForm.Value.Op!.Elements!.First(op => op.Value.Value == TDValues.OpReadAllProps).TokenIndex, properties?.TokenIndex ?? -1); hasError = true; @@ -252,7 +252,7 @@ private bool TryValidateCrossFormConsistency(ArrayTracker? rootForms, Ma { if (properties?.Entries == null || properties.Entries.Count(p => p.Value.Value.ReadOnly?.Value.Value != true && p.Value.Value.Forms!.Elements!.Any(f => f.Value.Op?.Elements?.Any(op => op.Value.Value == TDValues.OpWriteProp) ?? true)) == 0) { - errorReporter.ReportError($"Root-level form has '{TDForm.OpName}' property with value '{TDValues.OpWriteMultProps}' to write a selected aggregation of writable properties, but Thing Description has no writable properties.", + errorReporter.ReportError(ErrorCondition.Unusable, $"Root-level form has '{TDForm.OpName}' property with value '{TDValues.OpWriteMultProps}' to write a selected aggregation of writable properties, but Thing Description has no writable properties.", writeMultiForm.Value.Op!.Elements!.First(op => op.Value.Value == TDValues.OpWriteMultProps).TokenIndex, properties?.TokenIndex ?? -1); hasError = true; @@ -279,14 +279,14 @@ private bool TryValidateCrossFormConsistency(ArrayTracker? rootForms, Ma { if (readAllForm == null) { - errorReporter.ReportError($"Property '{prop.Key}' has '{TDProperty.FormsName}' element with no '{TDForm.TopicName}' property, so it cannot be read individually; however, there is no root-level form with an '{TDForm.OpName}' property that has value '{TDValues.OpReadAllProps}', so this property also cannot be read in aggregate.", + errorReporter.ReportError(ErrorCondition.Unusable, $"Property '{prop.Key}' has '{TDProperty.FormsName}' element with no '{TDForm.TopicName}' property, so it cannot be read individually; however, there is no root-level form with an '{TDForm.OpName}' property that has value '{TDValues.OpReadAllProps}', so this property also cannot be read in aggregate.", form.TokenIndex, rootForms?.TokenIndex ?? -1); hasError = true; } else if (propFormHasAdditionalResponses && !aggregateReadHasAdditionalResponses && !aggregateWriteHasAdditionalResponses) { - errorReporter.ReportError($"Property '{prop.Key}' has '{TDProperty.FormsName}' element with no '{TDForm.TopicName}' property, so its '{TDForm.AdditionalResponsesName}' value cannot be returned on an individual read or write, nor can it be returned on an aggregate read or write because no root-level form with '{TDForm.OpName}' value of '{TDValues.OpReadAllProps}' or '{TDValues.OpWriteMultProps}' has an '{TDForm.AdditionalResponsesName}' value.", + errorReporter.ReportError(ErrorCondition.Unusable, $"Property '{prop.Key}' has '{TDProperty.FormsName}' element with no '{TDForm.TopicName}' property, so its '{TDForm.AdditionalResponsesName}' value cannot be returned on an individual read or write, nor can it be returned on an aggregate read or write because no root-level form with '{TDForm.OpName}' value of '{TDValues.OpReadAllProps}' or '{TDValues.OpWriteMultProps}' has an '{TDForm.AdditionalResponsesName}' value.", form.TokenIndex, rootForms?.TokenIndex ?? -1); hasError = true; @@ -297,14 +297,14 @@ private bool TryValidateCrossFormConsistency(ArrayTracker? rootForms, Ma { if (readAllForm == null) { - errorReporter.ReportError($"Property '{prop.Key}' has '{TDProperty.FormsName}' element with '{TDForm.OpName}' value of '{TDValues.OpReadProp}' but no '{TDForm.TopicName}' property, so it cannot be read individually; however, there is no root-level form with an '{TDForm.OpName}' property that has value '{TDValues.OpReadAllProps}', so this property also cannot be read in aggregate.", + errorReporter.ReportError(ErrorCondition.Unusable, $"Property '{prop.Key}' has '{TDProperty.FormsName}' element with '{TDForm.OpName}' value of '{TDValues.OpReadProp}' but no '{TDForm.TopicName}' property, so it cannot be read individually; however, there is no root-level form with an '{TDForm.OpName}' property that has value '{TDValues.OpReadAllProps}', so this property also cannot be read in aggregate.", form.TokenIndex, rootForms?.TokenIndex ?? -1); hasError = true; } else if (propFormHasAdditionalResponses && !aggregateReadHasAdditionalResponses) { - errorReporter.ReportError($"Property '{prop.Key}' has '{TDProperty.FormsName}' element with '{TDForm.OpName}' value of '{TDValues.OpReadProp}' but no '{TDForm.TopicName}' property, so its '{TDForm.AdditionalResponsesName}' value cannot be returned on an individual read, nor can it be returned on an aggregate read because the root-level form with '{TDForm.OpName}' value of '{TDValues.OpReadAllProps}' has no '{TDForm.AdditionalResponsesName}' value.", + errorReporter.ReportError(ErrorCondition.Unusable, $"Property '{prop.Key}' has '{TDProperty.FormsName}' element with '{TDForm.OpName}' value of '{TDValues.OpReadProp}' but no '{TDForm.TopicName}' property, so its '{TDForm.AdditionalResponsesName}' value cannot be returned on an individual read, nor can it be returned on an aggregate read because the root-level form with '{TDForm.OpName}' value of '{TDValues.OpReadAllProps}' has no '{TDForm.AdditionalResponsesName}' value.", form.TokenIndex, readAllForm.TokenIndex); hasError = true; @@ -315,14 +315,14 @@ private bool TryValidateCrossFormConsistency(ArrayTracker? rootForms, Ma { if (writeMultiForm == null) { - errorReporter.ReportError($"Property '{prop.Key}' has '{TDProperty.FormsName}' element with '{TDForm.OpName}' value of '{TDValues.OpWriteProp}' but no '{TDForm.TopicName}' property, so it cannot be written individually; however, there is no root-level form with an '{TDForm.OpName}' property that has value '{TDValues.OpWriteMultProps}', so this property also cannot be written in aggregate.", + errorReporter.ReportError(ErrorCondition.Unusable, $"Property '{prop.Key}' has '{TDProperty.FormsName}' element with '{TDForm.OpName}' value of '{TDValues.OpWriteProp}' but no '{TDForm.TopicName}' property, so it cannot be written individually; however, there is no root-level form with an '{TDForm.OpName}' property that has value '{TDValues.OpWriteMultProps}', so this property also cannot be written in aggregate.", form.TokenIndex, rootForms?.TokenIndex ?? -1); hasError = true; } else if (propFormHasAdditionalResponses && (writeMultiForm.Value.AdditionalResponses?.Elements?.Count ?? 0) == 0) { - errorReporter.ReportError($"Property '{prop.Key}' has '{TDProperty.FormsName}' element with '{TDForm.OpName}' value of '{TDValues.OpWriteProp}' but no '{TDForm.TopicName}' property, so its '{TDForm.AdditionalResponsesName}' value cannot be returned on an individual write, nor can it be returned on an aggregate write because the root-level form with '{TDForm.OpName}' value of '{TDValues.OpWriteMultProps}' has no '{TDForm.AdditionalResponsesName}' value.", + errorReporter.ReportError(ErrorCondition.Unusable, $"Property '{prop.Key}' has '{TDProperty.FormsName}' element with '{TDForm.OpName}' value of '{TDValues.OpWriteProp}' but no '{TDForm.TopicName}' property, so its '{TDForm.AdditionalResponsesName}' value cannot be returned on an individual write, nor can it be returned on an aggregate write because the root-level form with '{TDForm.OpName}' value of '{TDValues.OpWriteMultProps}' has no '{TDForm.AdditionalResponsesName}' value.", form.TokenIndex, writeMultiForm.TokenIndex); hasError = true; @@ -346,7 +346,7 @@ private bool TryValidateCrossFormConsistency(ArrayTracker? rootForms, Ma { if (subAllForm != null) { - errorReporter.ReportError($"Root-level form has '{TDForm.OpName}' property with value '{TDValues.OpSubAllEvents}' to subscribe to the aggregation of all events, but Thing Description has no events defined.", + errorReporter.ReportError(ErrorCondition.Unusable, $"Root-level form has '{TDForm.OpName}' property with value '{TDValues.OpSubAllEvents}' to subscribe to the aggregation of all events, but Thing Description has no events defined.", subAllForm.Value.Op!.Elements!.First(op => op.Value.Value == TDValues.OpSubAllEvents).TokenIndex, events?.TokenIndex ?? -1); hasError = true; @@ -358,7 +358,7 @@ private bool TryValidateCrossFormConsistency(ArrayTracker? rootForms, Ma { if (!(evt.Value.Value.Forms?.Elements?.Any(f => f.Value.Topic != null) ?? false)) { - errorReporter.ReportError($"Event '{evt.Key}' has no '{TDEvent.FormsName}' element with a '{TDForm.TopicName}' property, so it cannot be subscribed individually; however, there is no root-level form with an '{TDForm.OpName}' property that has value '{TDValues.OpSubAllEvents}', so this event also cannot be subscribed in aggregate.", + errorReporter.ReportError(ErrorCondition.Unusable, $"Event '{evt.Key}' has no '{TDEvent.FormsName}' element with a '{TDForm.TopicName}' property, so it cannot be subscribed individually; however, there is no root-level form with an '{TDForm.OpName}' property that has value '{TDValues.OpSubAllEvents}', so this event also cannot be subscribed in aggregate.", evt.Value.TokenIndex, rootForms?.TokenIndex ?? -1); hasError = true; @@ -375,7 +375,7 @@ private bool TryValidateContext(ArrayTracker? context) if (context?.Elements == null) { - errorReporter.ReportError($"Thing Description is missing required '{TDThing.ContextName}' property.", -1); + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Thing Description is missing required '{TDThing.ContextName}' property.", -1); return false; } @@ -407,7 +407,7 @@ private bool TryValidateContext(ArrayTracker? context) } else if (localContext.Value.Value.Value != AioContextUriBase) { - errorReporter.ReportError($"Local {TDThing.ContextName} term \"{localContext.Key}\" has incorrect URI value \"{localContext.Value.Value.Value}\".", contextSpecifier.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Local {TDThing.ContextName} term \"{localContext.Key}\" has incorrect URI value \"{localContext.Value.Value.Value}\".", contextSpecifier.TokenIndex); hasError = true; } else @@ -420,13 +420,13 @@ private bool TryValidateContext(ArrayTracker? context) if (!tdContextPresent) { - errorReporter.ReportError($"Thing Description is missing required '{TDThing.ContextName}' remote URI \"{TdContextUri}\".", context.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Thing Description is missing required '{TDThing.ContextName}' remote URI \"{TdContextUri}\".", context.TokenIndex); hasError = true; } if (!aioContextPresent) { - errorReporter.ReportError($"Thing Description is missing required '{TDThing.ContextName}' local term \"{AioContextPrefix}\" with URI value \"{AioContextUriBase}\".", context.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Thing Description is missing required '{TDThing.ContextName}' local term \"{AioContextPrefix}\" with URI value \"{AioContextUriBase}\".", context.TokenIndex); hasError = true; } @@ -437,19 +437,19 @@ private bool TryValidateId(ValueTracker? id, ValueTracker c is < '!' or > '~')) { - errorReporter.ReportError($"Thing Description '{TDThing.IdName}' property value \"{id.Value.Value}\" contains invalid character(s); only printable ASCII characters not including space are allowed.", id.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Thing Description '{TDThing.IdName}' property value \"{id.Value.Value}\" contains invalid character(s); only printable ASCII characters not including space are allowed.", id.TokenIndex); return false; } @@ -457,13 +457,13 @@ private bool TryValidateId(ValueTracker? id, ValueTracker c is '+' or '#' or '{' or '}')) { - errorReporter.ReportError($"Thing Description '{TDThing.IdName}' property value \"{id.Value.Value}\" contains invalid character(s); only printable ASCII characters not including space, '\"', '+', '#', '{{', or '}}' are allowed when TD includes a topic that contains token '{{{MqttTopicTokens.ModelId}}}'.", id.TokenIndex, modelIdTopic.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Thing Description '{TDThing.IdName}' property value \"{id.Value.Value}\" contains invalid character(s); only printable ASCII characters not including space, '\"', '+', '#', '{{', or '}}' are allowed when TD includes a topic that contains token '{{{MqttTopicTokens.ModelId}}}'.", id.TokenIndex, modelIdTopic.TokenIndex); return false; } if (id.Value.Value.StartsWith('/') || id.Value.Value.EndsWith('/') || id.Value.Value.Contains("//")) { - errorReporter.ReportError($"Thing Description '{TDThing.IdName}' property value \"{id.Value.Value}\" must not start with, end with, or contain more than one successive '/' when TD includes a topic that contains token '{{{MqttTopicTokens.ModelId}}}'.", id.TokenIndex, modelIdTopic.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Thing Description '{TDThing.IdName}' property value \"{id.Value.Value}\" must not start with, end with, or contain more than one successive '/' when TD includes a topic that contains token '{{{MqttTopicTokens.ModelId}}}'.", id.TokenIndex, modelIdTopic.TokenIndex); return false; } } @@ -477,19 +477,19 @@ private bool TryValidateTitle(ValueTracker? title) { if (title == null) { - errorReporter.ReportError($"Thing Description is missing required '{TDThing.TitleName}' property.", -1); + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Thing Description is missing required '{TDThing.TitleName}' property.", -1); return false; } if (string.IsNullOrWhiteSpace(title.Value.Value)) { - errorReporter.ReportError($"Thing Description '{TDThing.TitleName}' property has empty value.", title.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Thing Description '{TDThing.TitleName}' property has empty value.", title.TokenIndex); return false; } if (!TitleRegex.IsMatch(title.Value.Value)) { - errorReporter?.ReportError($"Thing Description '{TDThing.TitleName}' property value \"{title.Value.Value}\" does not conform to codegen type naming rules -- it must start with an uppercase letter and contain only alphanumeric characters", title.TokenIndex); + errorReporter?.ReportError(ErrorCondition.PropertyInvalid, $"Thing Description '{TDThing.TitleName}' property value \"{title.Value.Value}\" does not conform to codegen type naming rules -- it must start with an uppercase letter and contain only alphanumeric characters", title.TokenIndex); return false; } @@ -523,28 +523,28 @@ private bool TryValidateLinks(ArrayTracker? links) if (link.Value.Href == null) { - errorReporter.ReportError($"Link element with {TDLink.RelName}='{LinkRelSchemaNamer}' is missing required '{TDLink.HrefName}' property.", link.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Link element with {TDLink.RelName}='{LinkRelSchemaNamer}' is missing required '{TDLink.HrefName}' property.", link.TokenIndex); hasError = true; } else if (string.IsNullOrWhiteSpace(link.Value.Href.Value.Value)) { - errorReporter.ReportError($"Link element with {TDLink.RelName}='{LinkRelSchemaNamer}' has empty '{TDLink.HrefName}' property value.", link.Value.Href.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Link element with {TDLink.RelName}='{LinkRelSchemaNamer}' has empty '{TDLink.HrefName}' property value.", link.Value.Href.TokenIndex); hasError = true; } if (link.Value.Type == null) { - errorReporter.ReportError($"Link element with {TDLink.RelName}='{LinkRelSchemaNamer}' is missing required '{TDLink.TypeName}' property.", link.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Link element with {TDLink.RelName}='{LinkRelSchemaNamer}' is missing required '{TDLink.TypeName}' property.", link.TokenIndex); hasError = true; } else if (string.IsNullOrWhiteSpace(link.Value.Type.Value.Value)) { - errorReporter.ReportError($"Link element with {TDLink.RelName}='{LinkRelSchemaNamer}' has empty '{TDLink.TypeName}' property value.", link.Value.Type.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Link element with {TDLink.RelName}='{LinkRelSchemaNamer}' has empty '{TDLink.TypeName}' property value.", link.Value.Type.TokenIndex); hasError = true; } else if (link.Value.Type.Value.Value != TDValues.ContentTypeJson) { - errorReporter.ReportError($"Link element with {TDLink.RelName}='{LinkRelSchemaNamer}' has '{TDLink.TypeName}' property with unsupported value '{link.Value.Type.Value.Value}'.", link.Value.Type.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupportedValue, $"Link element with {TDLink.RelName}='{LinkRelSchemaNamer}' has '{TDLink.TypeName}' property with unsupported value '{link.Value.Type.Value.Value}'.", link.Value.Type.TokenIndex); hasError = true; } @@ -558,7 +558,7 @@ private bool TryValidateLinks(ArrayTracker? links) } else { - errorReporter.ReportError($"Link has '{propertyName.Key}' property, which is not supported.", propertyName.Value); + errorReporter.ReportError(ErrorCondition.PropertyUnsupported, $"Link has '{propertyName.Key}' property, which is not supported.", propertyName.Value); hasError = true; } } @@ -567,7 +567,7 @@ private bool TryValidateLinks(ArrayTracker? links) if (relSchemaNamerCount > 1) { - errorReporter.ReportError($"Thing Description has multiple links with '{TDLink.RelName}' property value '{LinkRelSchemaNamer}'; only one is allowed.", links.TokenIndex); + errorReporter.ReportError(ErrorCondition.Duplication, $"Thing Description has multiple links with '{TDLink.RelName}' property value '{LinkRelSchemaNamer}'; only one is allowed.", links.TokenIndex); hasError = true; } @@ -622,7 +622,7 @@ private bool TryValidateAction(string name, ValueTracker action, MapTr { if (action.Value.Forms == null) { - errorReporter.ReportError($"Action '{name}' element is missing required '{TDAction.FormsName}' property.", action.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Action '{name}' element is missing required '{TDAction.FormsName}' property.", action.TokenIndex); contentType = null; return false; } @@ -653,7 +653,7 @@ private bool TryValidateAction(string name, ValueTracker action, MapTr } else { - errorReporter.ReportError($"Action '{name}' has '{propertyName.Key}' property, which is not supported.", propertyName.Value); + errorReporter.ReportError(ErrorCondition.PropertyUnsupported, $"Action '{name}' has '{propertyName.Key}' property, which is not supported.", propertyName.Value); hasError = true; } } @@ -670,7 +670,7 @@ private bool TryValidateActionDataSchema(ValueTracker dataSchema, string p bool isReference = dataSchema.Value.Ref != null; if (!isStructuredObject && !isNull && !isReference) { - errorReporter.ReportError($"'{TDThing.ActionsName}' element '{propertyName}' property must have a schema of (or a reference to) a structured object type, or no schema at all via a '{TDDataSchema.TypeName}' value of '{TDValues.TypeNull}'.", dataSchema.TokenIndex); + errorReporter.ReportError(ErrorCondition.TypeMismatch, $"'{TDThing.ActionsName}' element '{propertyName}' property must have a schema of (or a reference to) a structured object type, or no schema at all via a '{TDDataSchema.TypeName}' value of '{TDValues.TypeNull}'.", dataSchema.TokenIndex); return false; } @@ -705,7 +705,7 @@ private bool TryValidateProperty(string name, ValueTracker property, { if (property.Value.Forms == null) { - errorReporter.ReportError($"Property '{name}' element is missing required '{TDProperty.FormsName}' property.", property.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Property '{name}' element is missing required '{TDProperty.FormsName}' property.", property.TokenIndex); contentType = null; return false; } @@ -741,12 +741,12 @@ private bool TryValidatePropertyForms(string name, ArrayTracker forms, M { if (isReadOnly) { - errorReporter.ReportError($"'{TDProperty.FormsName}' array contains '{TDForm.OpName}' property with value '{TDValues.OpWriteProp}' but the property has '{TDProperty.ReadOnlyName}' true.", writeOp.TokenIndex, readOnly?.TokenIndex ?? -1); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"'{TDProperty.FormsName}' array contains '{TDForm.OpName}' property with value '{TDValues.OpWriteProp}' but the property has '{TDProperty.ReadOnlyName}' true.", writeOp.TokenIndex, readOnly?.TokenIndex ?? -1); hasError = true; } if (readOp == null) { - errorReporter.ReportError($"'{TDProperty.FormsName}' array contains '{TDForm.OpName}' property with value '{TDValues.OpWriteProp}' but no '{TDForm.OpName}' property with value '{TDValues.OpReadProp}'.", writeOp.TokenIndex, forms.TokenIndex); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"'{TDProperty.FormsName}' array contains '{TDForm.OpName}' property with value '{TDValues.OpWriteProp}' but no '{TDForm.OpName}' property with value '{TDValues.OpReadProp}'.", writeOp.TokenIndex, forms.TokenIndex); hasError = true; } else @@ -755,7 +755,7 @@ private bool TryValidatePropertyForms(string name, ArrayTracker forms, M bool hasTopicalReadForm = forms.Elements!.Any(form => form.Value.Topic != null && (form.Value.Op?.Elements?.Any(op => op.Value.Value == TDValues.OpReadProp) ?? false)); if (topicalWriteForm != null && !hasTopicalReadForm) { - errorReporter.ReportError($"'{TDProperty.FormsName}' array contains entry with '{TDForm.TopicName}' property and '{TDForm.OpName}' property with value '{TDValues.OpWriteProp}' but no entry with '{TDForm.TopicName}' property and '{TDForm.OpName}' property with value '{TDValues.OpReadProp}'.", topicalWriteForm.TokenIndex, forms.TokenIndex); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"'{TDProperty.FormsName}' array contains entry with '{TDForm.TopicName}' property and '{TDForm.OpName}' property with value '{TDValues.OpWriteProp}' but no entry with '{TDForm.TopicName}' property and '{TDForm.OpName}' property with value '{TDValues.OpReadProp}'.", topicalWriteForm.TokenIndex, forms.TokenIndex); hasError = true; } } @@ -768,7 +768,7 @@ private bool TryValidatePropertyForms(string name, ArrayTracker forms, M } else if (readOnly.Value.Value == false) { - errorReporter.ReportError($"Property '{name}' is effectively read-only because the only '{TDForm.OpName}' value in '{TDProperty.FormsName}' is '{TDValues.OpReadProp}'; however, the property has a '{TDProperty.ReadOnlyName}' property with value false.", readOp.TokenIndex, readOnly.TokenIndex); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"Property '{name}' is effectively read-only because the only '{TDForm.OpName}' value in '{TDProperty.FormsName}' is '{TDValues.OpReadProp}'; however, the property has a '{TDProperty.ReadOnlyName}' property with value false.", readOp.TokenIndex, readOnly.TokenIndex); hasError = true; } } @@ -804,7 +804,7 @@ private bool TryValidateEvent(string name, ValueTracker evt, MapTracker { if (evt.Value.Forms == null) { - errorReporter.ReportError($"Event '{name}' element is missing required '{TDEvent.FormsName}' property.", evt.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Event '{name}' element is missing required '{TDEvent.FormsName}' property.", evt.TokenIndex); contentType = null; return false; } @@ -830,7 +830,7 @@ private bool TryValidateEvent(string name, ValueTracker evt, MapTracker } else { - errorReporter.ReportError($"Event '{name}' has '{propertyName.Key}' property, which is not supported.", propertyName.Value); + errorReporter.ReportError(ErrorCondition.PropertyUnsupported, $"Event '{name}' has '{propertyName.Key}' property, which is not supported.", propertyName.Value); hasError = true; } } @@ -845,7 +845,7 @@ private bool TryValidateForms(ArrayTracker forms, FormsKind formsKind, M if (forms.Elements!.Count == 0) { - errorReporter.ReportError($"Property '{TDEvent.FormsName}' array value contains no elements; at least one form is required.", forms.TokenIndex); + errorReporter.ReportError(ErrorCondition.ElementMissing, $"Property '{TDEvent.FormsName}' array value contains no elements; at least one form is required.", forms.TokenIndex); return false; } @@ -863,7 +863,7 @@ private bool TryValidateForms(ArrayTracker forms, FormsKind formsKind, M { if (formContentType.Value.Value != contentType.Value.Value) { - errorReporter.ReportError($"'{TDThing.FormsName}' array contains forms with different '{TDForm.ContentTypeName}' property values '{contentType.Value.Value}' and '{formContentType.Value.Value}'.", contentType.TokenIndex, formContentType.TokenIndex); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"'{TDThing.FormsName}' array contains forms with different '{TDForm.ContentTypeName}' property values '{contentType.Value.Value}' and '{formContentType.Value.Value}'.", contentType.TokenIndex, formContentType.TokenIndex); hasError = true; } } @@ -882,7 +882,7 @@ private bool TryValidateForms(ArrayTracker forms, FormsKind formsKind, M ValueTracker? oplessForm = forms.Elements.FirstOrDefault(f => f.Value.Op == null); if (oplessForm != null && forms.Elements.Count > 1) { - errorReporter.ReportError($"'{TDThing.FormsName}' array contains a form with no '{TDForm.OpName}' property, so it must be the only form in the array.", oplessForm.TokenIndex, forms.TokenIndex); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"'{TDThing.FormsName}' array contains a form with no '{TDForm.OpName}' property, so it must be the only form in the array.", oplessForm.TokenIndex, forms.TokenIndex); return false; } @@ -890,7 +890,7 @@ private bool TryValidateForms(ArrayTracker forms, FormsKind formsKind, M foreach (IGrouping> dupOpGroup in aggregateOps.GroupBy(op => op.Value.Value).Where(g => g.Count() > 1)) { - errorReporter.ReportError($"'{TDThing.FormsName}' array contains '{TDForm.OpName}' properties that duplicate value '{dupOpGroup.Key}'.", dupOpGroup.First().TokenIndex, dupOpGroup.Skip(1).First().TokenIndex); + errorReporter.ReportError(ErrorCondition.Duplication, $"'{TDThing.FormsName}' array contains '{TDForm.OpName}' properties that duplicate value '{dupOpGroup.Key}'.", dupOpGroup.First().TokenIndex, dupOpGroup.Skip(1).First().TokenIndex); hasError = true; } @@ -903,12 +903,12 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map if (form.Value.Href == null) { - errorReporter.ReportError($"Form is missing required '{TDForm.HrefName}' property.", form.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Form is missing required '{TDForm.HrefName}' property.", form.TokenIndex); hasError = true; } else if (string.IsNullOrWhiteSpace(form.Value.Href.Value.Value)) { - errorReporter.ReportError($"Form '{TDForm.HrefName}' property has empty value.", form.Value.Href.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Form '{TDForm.HrefName}' property has empty value.", form.Value.Href.TokenIndex); hasError = true; } @@ -916,13 +916,13 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map { if (formsKind == FormsKind.Root) { - errorReporter.ReportError($"Root-level form is missing required '{TDForm.OpName}' property.", form.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Root-level form is missing required '{TDForm.OpName}' property.", form.TokenIndex); hasError = true; } } else if (form.Value.Op.Elements.Count == 0) { - errorReporter.ReportError($"Form '{TDForm.OpName}' property has no values.", form.Value.Op.TokenIndex); + errorReporter.ReportError(ErrorCondition.ElementMissing, $"Form '{TDForm.OpName}' property has no values.", form.Value.Op.TokenIndex); hasError = true; } @@ -932,7 +932,7 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map { if (form.Value.ContentType.Value.Value != TDValues.ContentTypeJson && form.Value.ContentType.Value.Value != TDValues.ContentTypeRaw && form.Value.ContentType.Value.Value != TDValues.ContentTypeCustom) { - errorReporter.ReportError($"Form '{TDForm.ContentTypeName}' property has unsupported value '{form.Value.ContentType.Value.Value}'; for '{TDThing.ActionsName}' and '{TDThing.EventsName}' forms, supported values are '{TDValues.ContentTypeJson}', '{TDValues.ContentTypeRaw}', and '{TDValues.ContentTypeCustom}' (empty string).", form.Value.ContentType.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupportedValue, $"Form '{TDForm.ContentTypeName}' property has unsupported value '{form.Value.ContentType.Value.Value}'; for '{TDThing.ActionsName}' and '{TDThing.EventsName}' forms, supported values are '{TDValues.ContentTypeJson}', '{TDValues.ContentTypeRaw}', and '{TDValues.ContentTypeCustom}' (empty string).", form.Value.ContentType.TokenIndex); hasError = true; } } @@ -941,7 +941,7 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map if (form.Value.ContentType.Value.Value != TDValues.ContentTypeJson) { string adjective = form.Value.ContentType.Value.Value == TDValues.ContentTypeRaw || form.Value.ContentType.Value.Value == TDValues.ContentTypeCustom ? "disallowed" : "unsupported"; - errorReporter.ReportError($"Form '{TDForm.ContentTypeName}' property has {adjective} value '{form.Value.ContentType.Value.Value}'; for '{TDThing.PropertiesName}' and root-level forms, only '{TDValues.ContentTypeJson}' is supported.", form.Value.ContentType.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupportedValue, $"Form '{TDForm.ContentTypeName}' property has {adjective} value '{form.Value.ContentType.Value.Value}'; for '{TDThing.PropertiesName}' and root-level forms, only '{TDValues.ContentTypeJson}' is supported.", form.Value.ContentType.TokenIndex); hasError = true; } } @@ -951,17 +951,17 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map { if (formsKind == FormsKind.Root && !(form.Value.Op?.Elements?.Any(op => op.Value.Value == TDValues.OpSubAllEvents) ?? false)) { - errorReporter.ReportError($"'{TDForm.ServiceGroupIdName}' property is not allowed in root-level '{TDThing.FormsName}' property without an '{TDForm.OpName}' property value of '{TDValues.OpSubAllEvents}'.", form.Value.ServiceGroupId.TokenIndex); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"'{TDForm.ServiceGroupIdName}' property is not allowed in root-level '{TDThing.FormsName}' property without an '{TDForm.OpName}' property value of '{TDValues.OpSubAllEvents}'.", form.Value.ServiceGroupId.TokenIndex); hasError = true; } else if (formsKind == FormsKind.Property) { - errorReporter.ReportError($"'{TDForm.ServiceGroupIdName}' property is not allowed in '{TDProperty.FormsName}' property of a '{TDThing.PropertiesName}' element.", form.Value.ServiceGroupId.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupported, $"'{TDForm.ServiceGroupIdName}' property is not allowed in '{TDProperty.FormsName}' property of a '{TDThing.PropertiesName}' element.", form.Value.ServiceGroupId.TokenIndex); hasError = true; } else if (string.IsNullOrWhiteSpace(form.Value.ServiceGroupId.Value.Value)) { - errorReporter.ReportError($"Form '{TDForm.ServiceGroupIdName}' property has empty value.", form.Value.ServiceGroupId.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Form '{TDForm.ServiceGroupIdName}' property has empty value.", form.Value.ServiceGroupId.TokenIndex); hasError = true; } } @@ -976,7 +976,7 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map { if (string.IsNullOrWhiteSpace(op.Value.Value)) { - errorReporter.ReportError($"Form '{TDForm.OpName}' property has empty value.", op.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Form '{TDForm.OpName}' property has empty value.", op.TokenIndex); hasError = true; continue; } @@ -986,28 +986,28 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map case FormsKind.Root: if (op.Value.Value != TDValues.OpReadAllProps && op.Value.Value != TDValues.OpWriteMultProps && op.Value.Value != TDValues.OpSubAllEvents) { - errorReporter.ReportError($"Form '{TDForm.OpName}' property has unsupported value '{op.Value.Value}' for a root-level form; supported values are '{TDValues.OpReadAllProps}', '{TDValues.OpWriteMultProps}', and '{TDValues.OpSubAllEvents}'.", op.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupportedValue, $"Form '{TDForm.OpName}' property has unsupported value '{op.Value.Value}' for a root-level form; supported values are '{TDValues.OpReadAllProps}', '{TDValues.OpWriteMultProps}', and '{TDValues.OpSubAllEvents}'.", op.TokenIndex); hasError = true; } break; case FormsKind.Property: if (op.Value.Value != TDValues.OpReadProp && op.Value.Value != TDValues.OpWriteProp) { - errorReporter.ReportError($"Form '{TDForm.OpName}' property has unsupported value '{op.Value.Value}' for a property form; supported values are '{TDValues.OpReadProp}' and '{TDValues.OpWriteProp}'.", op.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupportedValue, $"Form '{TDForm.OpName}' property has unsupported value '{op.Value.Value}' for a property form; supported values are '{TDValues.OpReadProp}' and '{TDValues.OpWriteProp}'.", op.TokenIndex); hasError = true; } break; case FormsKind.Action: if (op.Value.Value != TDValues.OpInvokeAction) { - errorReporter.ReportError($"Form '{TDForm.OpName}' property has unsupported value '{op.Value.Value}' for an action form; only supported value is '{TDValues.OpInvokeAction}'.", op.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupportedValue, $"Form '{TDForm.OpName}' property has unsupported value '{op.Value.Value}' for an action form; only supported value is '{TDValues.OpInvokeAction}'.", op.TokenIndex); hasError = true; } break; case FormsKind.Event: if (op.Value.Value != TDValues.OpSubEvent) { - errorReporter.ReportError($"Form '{TDForm.OpName}' property has unsupported value '{op.Value.Value}' for an event form; only supported value is '{TDValues.OpSubEvent}'.", op.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupportedValue, $"Form '{TDForm.OpName}' property has unsupported value '{op.Value.Value}' for an event form; only supported value is '{TDValues.OpSubEvent}'.", op.TokenIndex); hasError = true; } break; @@ -1022,7 +1022,7 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map { foreach (IGrouping> dupOpGroup in form.Value.Op.Elements.GroupBy(op => op.Value.Value).Where(g => g.Count() > 1)) { - errorReporter.ReportError($"Form '{TDForm.OpName}' property has duplicate value '{dupOpGroup.Key}'.", form.Value.Op.TokenIndex); + errorReporter.ReportError(ErrorCondition.Duplication, $"Form '{TDForm.OpName}' property has duplicate value '{dupOpGroup.Key}'.", form.Value.Op.TokenIndex); hasError = true; } @@ -1030,12 +1030,12 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map { if (hasOpRead && hasOpSub) { - errorReporter.ReportError($"A single form '{TDForm.OpName}' property cannot contain both '{TDValues.OpReadAllProps}' and '{TDValues.OpSubAllEvents}' values.", form.Value.Op.TokenIndex); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"A single form '{TDForm.OpName}' property cannot contain both '{TDValues.OpReadAllProps}' and '{TDValues.OpSubAllEvents}' values.", form.Value.Op.TokenIndex); hasError = true; } if (hasOpWrite && hasOpSub) { - errorReporter.ReportError($"Form '{TDForm.OpName}' property cannot contain both '{TDValues.OpWriteMultProps}' and '{TDValues.OpSubAllEvents}' values.", form.Value.Op.TokenIndex); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"Form '{TDForm.OpName}' property cannot contain both '{TDValues.OpWriteMultProps}' and '{TDValues.OpSubAllEvents}' values.", form.Value.Op.TokenIndex); hasError = true; } } @@ -1045,7 +1045,7 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map { if (formsKind == FormsKind.Root) { - errorReporter.ReportError($"Root-level form is missing required '{TDForm.TopicName}' property.", form.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Root-level form is missing required '{TDForm.TopicName}' property.", form.TokenIndex); hasError = true; } } @@ -1058,7 +1058,7 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map if (form.Value.ContentType == null) { - errorReporter.ReportError($"Form missing '{TDForm.ContentTypeName}' property, which is required when '{TDForm.TopicName}' property present.", form.TokenIndex, form.Value.Topic.TokenIndex); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"Form missing '{TDForm.ContentTypeName}' property, which is required when '{TDForm.TopicName}' property present.", form.TokenIndex, form.Value.Topic.TokenIndex); hasError = true; } } @@ -1067,27 +1067,27 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map { if (formsKind != FormsKind.Action) { - errorReporter.ReportError($"Form '{TDForm.HeaderCodeName}' property is permitted only in action forms.", form.Value.HeaderCode.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupported, $"Form '{TDForm.HeaderCodeName}' property is permitted only in action forms.", form.Value.HeaderCode.TokenIndex); hasError = true; } else if (string.IsNullOrWhiteSpace(form.Value.HeaderCode.Value.Value)) { - errorReporter.ReportError($"Form '{TDForm.HeaderCodeName}' property has empty value.", form.Value.HeaderCode.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Form '{TDForm.HeaderCodeName}' property has empty value.", form.Value.HeaderCode.TokenIndex); hasError = true; } else if (schemaDefinitions?.Entries == null) { - errorReporter.ReportError($"Form '{TDForm.HeaderCodeName}' property must refer to key in '{TDThing.SchemaDefinitionsName}' property, but TD has no '{TDThing.SchemaDefinitionsName}' property.", form.Value.HeaderCode.TokenIndex); + errorReporter.ReportError(ErrorCondition.ItemNotFound, $"Form '{TDForm.HeaderCodeName}' property must refer to key in '{TDThing.SchemaDefinitionsName}' property, but TD has no '{TDThing.SchemaDefinitionsName}' property.", form.Value.HeaderCode.TokenIndex); hasError = true; } else if (!schemaDefinitions.Entries.TryGetValue(form.Value.HeaderCode.Value.Value, out ValueTracker? dataSchema)) { - errorReporter.ReportError($"Form '{TDForm.HeaderCodeName}' property refers to non-existent key '{form.Value.HeaderCode.Value.Value}' in '{TDThing.SchemaDefinitionsName}' property.", form.Value.HeaderCode.TokenIndex, schemaDefinitions.TokenIndex); + errorReporter.ReportError(ErrorCondition.ItemNotFound, $"Form '{TDForm.HeaderCodeName}' property refers to non-existent key '{form.Value.HeaderCode.Value.Value}' in '{TDThing.SchemaDefinitionsName}' property.", form.Value.HeaderCode.TokenIndex, schemaDefinitions.TokenIndex); hasError = true; } else if (dataSchema.Value.Type?.Value.Value != TDValues.TypeString || dataSchema.Value.Enum == null) { - errorReporter.ReportError($"Form '{TDForm.HeaderCodeName}' property refers to '{TDThing.SchemaDefinitionsName}' key '{form.Value.HeaderCode.Value.Value}', but this is not a string enum.", form.Value.HeaderCode.TokenIndex, dataSchema.TokenIndex); + errorReporter.ReportError(ErrorCondition.TypeMismatch, $"Form '{TDForm.HeaderCodeName}' property refers to '{TDThing.SchemaDefinitionsName}' key '{form.Value.HeaderCode.Value.Value}', but this is not a string enum.", form.Value.HeaderCode.TokenIndex, dataSchema.TokenIndex); hasError = true; } } @@ -1096,12 +1096,12 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map { if (formsKind == FormsKind.Event) { - errorReporter.ReportError($"Form '{TDForm.AdditionalResponsesName}' property is not permitted in an event form.", form.Value.AdditionalResponses.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupported, $"Form '{TDForm.AdditionalResponsesName}' property is not permitted in an event form.", form.Value.AdditionalResponses.TokenIndex); hasError = true; } else if (formsKind == FormsKind.Root && !form.Value.Op!.Elements!.Any(op => op.Value.Value == TDValues.OpReadAllProps || op.Value.Value == TDValues.OpWriteMultProps)) { - errorReporter.ReportError($"Form '{TDForm.AdditionalResponsesName}' property is not permitted in a root form without an '{TDForm.OpName}' property value of '{TDValues.OpReadAllProps}' or '{TDValues.OpWriteMultProps}'.", form.Value.AdditionalResponses.TokenIndex, form.Value.Op.TokenIndex); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"Form '{TDForm.AdditionalResponsesName}' property is not permitted in a root form without an '{TDForm.OpName}' property value of '{TDValues.OpReadAllProps}' or '{TDValues.OpWriteMultProps}'.", form.Value.AdditionalResponses.TokenIndex, form.Value.Op.TokenIndex); hasError = true; } else if (!TryValidateSchemaReferences(form.Value.AdditionalResponses, formsKind, TDForm.AdditionalResponsesName, schemaDefinitions)) @@ -1114,7 +1114,7 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map { if (formsKind != FormsKind.Action) { - errorReporter.ReportError($"Form '{TDForm.HeaderInfoName}' property is permitted only in an action form.", form.Value.HeaderInfo.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupported, $"Form '{TDForm.HeaderInfoName}' property is permitted only in an action form.", form.Value.HeaderInfo.TokenIndex); hasError = true; } else if (!TryValidateSchemaReferences(form.Value.HeaderInfo, formsKind, TDForm.HeaderInfoName, schemaDefinitions)) @@ -1133,7 +1133,7 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map } else { - errorReporter.ReportError($"Form has '{propertyName.Key}' property, which is not supported.", propertyName.Value); + errorReporter.ReportError(ErrorCondition.PropertyUnsupported, $"Form has '{propertyName.Key}' property, which is not supported.", propertyName.Value); hasError = true; } } @@ -1159,13 +1159,13 @@ private bool TryValidateTopic(ValueTracker topic, FormsKind formsK if (topic.Value.Value.Length == 0) { - errorReporter.ReportError($"Form '{TDForm.TopicName}' property has empty value.", topic.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Form '{TDForm.TopicName}' property has empty value.", topic.TokenIndex); return false; } if (topic.Value.Value.StartsWith('$')) { - errorReporter.ReportError($"Form '{TDForm.TopicName}' property value starts with reserved character '$'.", topic.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Form '{TDForm.TopicName}' property value starts with reserved character '$'.", topic.TokenIndex); hasError = true; } @@ -1174,7 +1174,7 @@ private bool TryValidateTopic(ValueTracker topic, FormsKind formsK { if (level.Length == 0) { - errorReporter.ReportError($"Form '{TDForm.TopicName}' property has value containing empty topic level.", topic.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Form '{TDForm.TopicName}' property has value containing empty topic level.", topic.TokenIndex); hasError = true; } else if (level.StartsWith('{') && level.EndsWith('}')) @@ -1182,7 +1182,7 @@ private bool TryValidateTopic(ValueTracker topic, FormsKind formsK string token = level[1..^1]; if (token.Length == 0) { - errorReporter.ReportError($"Form '{TDForm.TopicName}' property has value containing empty token '{{}}'.", topic.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Form '{TDForm.TopicName}' property has value containing empty token '{{}}'.", topic.TokenIndex); hasError = true; } else if (token.StartsWith("ex:")) @@ -1190,12 +1190,12 @@ private bool TryValidateTopic(ValueTracker topic, FormsKind formsK string exToken = token[3..]; if (exToken.Length == 0) { - errorReporter.ReportError($"Form '{TDForm.TopicName}' property has value containing empty custom token '{{ex:}}'.", topic.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Form '{TDForm.TopicName}' property has value containing empty custom token '{{ex:}}'.", topic.TokenIndex); hasError = true; } else if (!exToken.All(c => char.IsAsciiLetter(c))) { - errorReporter.ReportError($"Form '{TDForm.TopicName}' property has value containing custom token '{{{token}}}' that contains invalid character(s); only ASCII letters are allowed after the 'ex:' prefix.", topic.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Form '{TDForm.TopicName}' property has value containing custom token '{{{token}}}' that contains invalid character(s); only ASCII letters are allowed after the 'ex:' prefix.", topic.TokenIndex); hasError = true; } } @@ -1215,7 +1215,7 @@ private bool TryValidateTopic(ValueTracker topic, FormsKind formsK case FormsKind.Action: if (token != MqttTopicTokens.ActionInvokerId && token != MqttTopicTokens.ActionExecutorId) { - errorReporter.ReportError($"Form '{TDForm.TopicName}' property has value containing token '{{{token}}}' that does not start with 'ex:' and that is not valid in an action topic; only '{{{MqttTopicTokens.ModelId}}}', '{{{MqttTopicTokens.ActionInvokerId}}}', and '{{{MqttTopicTokens.ActionExecutorId}}}' are allowed.", topic.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Form '{TDForm.TopicName}' property has value containing token '{{{token}}}' that does not start with 'ex:' and that is not valid in an action topic; only '{{{MqttTopicTokens.ModelId}}}', '{{{MqttTopicTokens.ActionInvokerId}}}', and '{{{MqttTopicTokens.ActionExecutorId}}}' are allowed.", topic.TokenIndex); hasError = true; } break; @@ -1226,14 +1226,14 @@ private bool TryValidateTopic(ValueTracker topic, FormsKind formsK } else if (token != MqttTopicTokens.PropertyConsumerId && token != MqttTopicTokens.PropertyMaintainerId) { - errorReporter.ReportError($"Form '{TDForm.TopicName}' property has value containing token '{{{token}}}' that does not start with 'ex:' and that is not valid in a property topic; only '{{{MqttTopicTokens.ModelId}}}', '{{{MqttTopicTokens.PropertyAction}}}', '{{{MqttTopicTokens.PropertyConsumerId}}}', and '{{{MqttTopicTokens.PropertyMaintainerId}}}' are allowed.", topic.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Form '{TDForm.TopicName}' property has value containing token '{{{token}}}' that does not start with 'ex:' and that is not valid in a property topic; only '{{{MqttTopicTokens.ModelId}}}', '{{{MqttTopicTokens.PropertyAction}}}', '{{{MqttTopicTokens.PropertyConsumerId}}}', and '{{{MqttTopicTokens.PropertyMaintainerId}}}' are allowed.", topic.TokenIndex); hasError = true; } break; case FormsKind.Event: if (token != MqttTopicTokens.EventSenderId) { - errorReporter.ReportError($"Form '{TDForm.TopicName}' property has value containing token '{{{token}}}' that does not start with 'ex:' and that is not valid in an event topic; only '{{{MqttTopicTokens.ModelId}}}' and '{{{MqttTopicTokens.EventSenderId}}}' are allowed.", topic.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Form '{TDForm.TopicName}' property has value containing token '{{{token}}}' that does not start with 'ex:' and that is not valid in an event topic; only '{{{MqttTopicTokens.ModelId}}}' and '{{{MqttTopicTokens.EventSenderId}}}' are allowed.", topic.TokenIndex); hasError = true; } break; @@ -1245,7 +1245,7 @@ private bool TryValidateTopic(ValueTracker topic, FormsKind formsK { if (level.Any(c => c is < '!' or > '~' or '+' or '#' or '{' or '}')) { - errorReporter.ReportError($"Form '{TDForm.TopicName}' property has value containing non-token topic level '{level}' that contains invalid character(s); only printable ASCII characters not including space, '\"', '+', '#', '{{', or '}}' are allowed.", topic.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Form '{TDForm.TopicName}' property has value containing non-token topic level '{level}' that contains invalid character(s); only printable ASCII characters not including space, '\"', '+', '#', '{{', or '}}' are allowed.", topic.TokenIndex); hasError = true; } } @@ -1282,7 +1282,7 @@ private bool TryValidateTopic(ValueTracker topic, FormsKind formsK { if ((hasOpRead && hasOpWrite) || (!hasOpRead && !hasOpWrite && !isReadOnly)) { - errorReporter.ReportError($"Form '{TDForm.TopicName}' property value is missing required '{{{MqttTopicTokens.PropertyAction}}}' token for a property form that supports both read and write operations.", topic.TokenIndex); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"Form '{TDForm.TopicName}' property value is missing required '{{{MqttTopicTokens.PropertyAction}}}' token for a property form that supports both read and write operations.", topic.TokenIndex); hasError = true; } else @@ -1313,7 +1313,7 @@ private bool TryValidateSchemaReferences(ArrayTracker schemaR if (schemaReferences.Elements.Count > 1) { - errorReporter.ReportError($"No more than one element is permitted in '{propertyName}' array.", schemaReferences.TokenIndex); + errorReporter.ReportError(ErrorCondition.ElementsPlural, $"No more than one element is permitted in '{propertyName}' array.", schemaReferences.TokenIndex); hasError = true; } @@ -1328,18 +1328,18 @@ private bool TryValidateSchemaReference(ValueTracker schemaRe { if (parentPropName == TDForm.HeaderInfoName) { - errorReporter.ReportError($"'{parentPropName}' element is missing required '{TDSchemaReference.ContentTypeName}' property.", schemaReference.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"'{parentPropName}' element is missing required '{TDSchemaReference.ContentTypeName}' property.", schemaReference.TokenIndex); hasError = true; } } else if (string.IsNullOrWhiteSpace(schemaReference.Value.ContentType.Value.Value)) { - errorReporter.ReportError($"'{parentPropName}' element has empty '{TDSchemaReference.ContentTypeName}' property value.", schemaReference.Value.ContentType.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"'{parentPropName}' element has empty '{TDSchemaReference.ContentTypeName}' property value.", schemaReference.Value.ContentType.TokenIndex); hasError = true; } else if (schemaReference.Value.ContentType.Value.Value != TDValues.ContentTypeJson) { - errorReporter.ReportError($"'{parentPropName}' element has '{TDSchemaReference.ContentTypeName}' property with unsupported value '{schemaReference.Value.ContentType.Value.Value}'.", schemaReference.Value.ContentType.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupportedValue, $"'{parentPropName}' element has '{TDSchemaReference.ContentTypeName}' property with unsupported value '{schemaReference.Value.ContentType.Value.Value}'.", schemaReference.Value.ContentType.TokenIndex); hasError = true; } @@ -1347,13 +1347,13 @@ private bool TryValidateSchemaReference(ValueTracker schemaRe { if (parentPropName == TDForm.AdditionalResponsesName) { - errorReporter.ReportError($"'{parentPropName}' element is missing required '{TDSchemaReference.SuccessName}' property.", schemaReference.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"'{parentPropName}' element is missing required '{TDSchemaReference.SuccessName}' property.", schemaReference.TokenIndex); hasError = true; } } else if (schemaReference.Value.Success.Value.Value == true) { - errorReporter.ReportError($"'{parentPropName}' element has '{TDSchemaReference.SuccessName}' property value of true, which is not supported.", schemaReference.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupportedValue, $"'{parentPropName}' element has '{TDSchemaReference.SuccessName}' property value of true, which is not supported.", schemaReference.TokenIndex); hasError = true; } @@ -1361,38 +1361,38 @@ private bool TryValidateSchemaReference(ValueTracker schemaRe { if (formsKind != FormsKind.Root) { - errorReporter.ReportError($"'{parentPropName}' element is missing '{TDSchemaReference.SchemaName}' property, which is required except within root-level '{TDThing.FormsName}' elements.", schemaReference.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"'{parentPropName}' element is missing '{TDSchemaReference.SchemaName}' property, which is required except within root-level '{TDThing.FormsName}' elements.", schemaReference.TokenIndex); hasError = true; } } else if (formsKind == FormsKind.Root) { - errorReporter.ReportError($"'{parentPropName}' element has '{TDSchemaReference.SchemaName}' property, which is not allowed within root-level '{TDThing.FormsName}' element because schema is automatically composed from schema definitions in affordance '{TDThing.FormsName}' elements.", schemaReference.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupported, $"'{parentPropName}' element has '{TDSchemaReference.SchemaName}' property, which is not allowed within root-level '{TDThing.FormsName}' element because schema is automatically composed from schema definitions in affordance '{TDThing.FormsName}' elements.", schemaReference.TokenIndex); hasError = true; } else if (string.IsNullOrWhiteSpace(schemaReference.Value.Schema.Value.Value)) { - errorReporter.ReportError($"'{parentPropName}' element '{TDSchemaReference.SchemaName}' property has empty value.", schemaReference.Value.Schema.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"'{parentPropName}' element '{TDSchemaReference.SchemaName}' property has empty value.", schemaReference.Value.Schema.TokenIndex); hasError = true; } else if (schemaDefinitions?.Entries == null) { - errorReporter.ReportError($"'{parentPropName}' element '{TDSchemaReference.SchemaName}' property must refer to key in '{TDThing.SchemaDefinitionsName}' property, but TD has no '{TDThing.SchemaDefinitionsName}' property.", schemaReference.Value.Schema.TokenIndex); + errorReporter.ReportError(ErrorCondition.ItemNotFound, $"'{parentPropName}' element '{TDSchemaReference.SchemaName}' property must refer to key in '{TDThing.SchemaDefinitionsName}' property, but TD has no '{TDThing.SchemaDefinitionsName}' property.", schemaReference.Value.Schema.TokenIndex); hasError = true; } else if (!schemaDefinitions.Entries.TryGetValue(schemaReference.Value.Schema.Value.Value, out ValueTracker? dataSchema)) { - errorReporter.ReportError($"'{parentPropName}' element '{TDSchemaReference.SchemaName}' property refers to non-existent key '{schemaReference.Value.Schema.Value.Value}' in '{TDThing.SchemaDefinitionsName}' property.", schemaReference.Value.Schema.TokenIndex, schemaDefinitions.TokenIndex); + errorReporter.ReportError(ErrorCondition.ItemNotFound, $"'{parentPropName}' element '{TDSchemaReference.SchemaName}' property refers to non-existent key '{schemaReference.Value.Schema.Value.Value}' in '{TDThing.SchemaDefinitionsName}' property.", schemaReference.Value.Schema.TokenIndex, schemaDefinitions.TokenIndex); hasError = true; } else if (dataSchema.Value.Type?.Value.Value != TDValues.TypeObject) { - errorReporter.ReportError($"'{parentPropName}' element '{TDSchemaReference.SchemaName}' property refers to '{TDThing.SchemaDefinitionsName}' key '{schemaReference.Value.Schema.Value.Value}', but this is not a structured object definition.", schemaReference.Value.Schema.TokenIndex, dataSchema.TokenIndex); + errorReporter.ReportError(ErrorCondition.TypeMismatch, $"'{parentPropName}' element '{TDSchemaReference.SchemaName}' property refers to '{TDThing.SchemaDefinitionsName}' key '{schemaReference.Value.Schema.Value.Value}', but this is not a structured object definition.", schemaReference.Value.Schema.TokenIndex, dataSchema.TokenIndex); hasError = true; } else if (dataSchema.Value.Properties == null) { - errorReporter.ReportError($"'{parentPropName}' element '{TDSchemaReference.SchemaName}' property refers to '{TDThing.SchemaDefinitionsName}' key '{schemaReference.Value.Schema.Value.Value}', but this defines a map, whereas a structured object is required.", schemaReference.Value.Schema.TokenIndex, dataSchema.TokenIndex); + errorReporter.ReportError(ErrorCondition.TypeMismatch, $"'{parentPropName}' element '{TDSchemaReference.SchemaName}' property refers to '{TDThing.SchemaDefinitionsName}' key '{schemaReference.Value.Schema.Value.Value}', but this defines a map, whereas a structured object is required.", schemaReference.Value.Schema.TokenIndex, dataSchema.TokenIndex); hasError = true; } @@ -1406,7 +1406,7 @@ private bool TryValidateSchemaReference(ValueTracker schemaRe } else { - errorReporter.ReportError($"Schema reference has '{propertyName.Key}' property, which is not supported.", propertyName.Value); + errorReporter.ReportError(ErrorCondition.PropertyUnsupported, $"Schema reference has '{propertyName.Key}' property, which is not supported.", propertyName.Value); hasError = true; } } @@ -1420,19 +1420,19 @@ private bool TryValidateDataSchema(ValueTracker dataSchema, Func(ValueTracker dataSchema, Func(ValueTracker dataSchema, Func(ValueTracker dataSchema, Func(ValueTracker dataSchema, Func< if (string.IsNullOrWhiteSpace(refValue)) { - errorReporter.ReportError($"Data schema '{TDDataSchema.RefName}' property has empty value.", tokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Data schema '{TDDataSchema.RefName}' property has empty value.", tokenIndex); hasError = true; } else if (!RefCharRegex.IsMatch(refValue)) { - errorReporter.ReportError($"Data schema '{TDDataSchema.RefName}' property value \"{refValue}\" contains one or more illegal characters.", tokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Data schema '{TDDataSchema.RefName}' property value \"{refValue}\" contains one or more illegal characters.", tokenIndex); hasError = true; } else if (refValue.StartsWith('#')) { - errorReporter.ReportError($"Data schema '{TDDataSchema.RefName}' property value \"{refValue}\" may not begin with a '#' character.", tokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Data schema '{TDDataSchema.RefName}' property value \"{refValue}\" may not begin with a '#' character.", tokenIndex); hasError = true; } else @@ -1513,7 +1513,7 @@ private bool TryValidateReferenceDataSchema(ValueTracker dataSchema, Func< bool hasPathSegs = refValue.Contains('/') && refValue.IndexOf('/') < (refValue.Contains('#') ? refValue.IndexOf('#') : refValue.Length); if (!isRelative && hasPathSegs) { - errorReporter.ReportError($"Data schema '{TDDataSchema.RefName}' property value \"{refValue}\" must be relative (start with \"./\" or \"../\") if it has any path segments.", tokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Data schema '{TDDataSchema.RefName}' property value \"{refValue}\" must be relative (start with \"./\" or \"../\") if it has any path segments.", tokenIndex); hasError = true; } } @@ -1544,7 +1544,7 @@ private bool TryValidateStringConst(ValueTracker dataSchema, ValueTracker< if (constValue.Value.Value is not string) { - errorReporter.ReportError($"The specified constant value must be a string.", constValue.TokenIndex, dataSchema.Value.Type!.TokenIndex); + errorReporter.ReportError(ErrorCondition.TypeMismatch, $"The specified constant value must be a string.", constValue.TokenIndex, dataSchema.Value.Type!.TokenIndex); hasError = true; } @@ -1577,18 +1577,18 @@ private bool TryValidateNumberConst(ValueTracker dataSchema, ValueTracker< { if (dataSchema.Value.Minimum?.Value.Value != null && numValue < dataSchema.Value.Minimum.Value.Value) { - errorReporter.ReportError($"The specified constant value ({numValue}) cannot be less than the '{TDDataSchema.MinimumName}' property value ({dataSchema.Value.Minimum.Value.Value}).", constValue.TokenIndex, dataSchema.Value.Minimum.TokenIndex); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"The specified constant value ({numValue}) cannot be less than the '{TDDataSchema.MinimumName}' property value ({dataSchema.Value.Minimum.Value.Value}).", constValue.TokenIndex, dataSchema.Value.Minimum.TokenIndex); hasError = true; } if (dataSchema.Value.Maximum?.Value.Value != null && numValue > dataSchema.Value.Maximum.Value.Value) { - errorReporter.ReportError($"The specified constant value ({numValue}) cannot be greater than the '{TDDataSchema.MaximumName}' property value ({dataSchema.Value.Maximum.Value.Value}).", constValue.TokenIndex, dataSchema.Value.Maximum.TokenIndex); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"The specified constant value ({numValue}) cannot be greater than the '{TDDataSchema.MaximumName}' property value ({dataSchema.Value.Maximum.Value.Value}).", constValue.TokenIndex, dataSchema.Value.Maximum.TokenIndex); hasError = true; } } else { - errorReporter.ReportError($"The specified constant value must be a number.", constValue.TokenIndex, dataSchema.Value.Type!.TokenIndex); + errorReporter.ReportError(ErrorCondition.TypeMismatch, $"The specified constant value must be a number.", constValue.TokenIndex, dataSchema.Value.Type!.TokenIndex); hasError = true; } @@ -1623,18 +1623,18 @@ private bool TryValidateIntegerConst(ValueTracker dataSchema, ValueTracker { if (dataSchema.Value.Minimum?.Value.Value != null && numValue < dataSchema.Value.Minimum.Value.Value) { - errorReporter.ReportError($"The specified constant value ({numValue}) cannot be less than the '{TDDataSchema.MinimumName}' property value ({dataSchema.Value.Minimum.Value.Value}).", constValue.TokenIndex, dataSchema.Value.Minimum.TokenIndex); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"The specified constant value ({numValue}) cannot be less than the '{TDDataSchema.MinimumName}' property value ({dataSchema.Value.Minimum.Value.Value}).", constValue.TokenIndex, dataSchema.Value.Minimum.TokenIndex); hasError = true; } if (dataSchema.Value.Maximum?.Value.Value != null && numValue > dataSchema.Value.Maximum.Value.Value) { - errorReporter.ReportError($"The specified constant value ({numValue}) cannot be greater than the '{TDDataSchema.MaximumName}' property value ({dataSchema.Value.Maximum.Value.Value}).", constValue.TokenIndex, dataSchema.Value.Maximum.TokenIndex); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"The specified constant value ({numValue}) cannot be greater than the '{TDDataSchema.MaximumName}' property value ({dataSchema.Value.Maximum.Value.Value}).", constValue.TokenIndex, dataSchema.Value.Maximum.TokenIndex); hasError = true; } } else { - errorReporter.ReportError($"The specified constant value must be an integer.", constValue.TokenIndex, dataSchema.Value.Type!.TokenIndex); + errorReporter.ReportError(ErrorCondition.TypeMismatch, $"The specified constant value must be an integer.", constValue.TokenIndex, dataSchema.Value.Type!.TokenIndex); hasError = true; } @@ -1667,7 +1667,7 @@ private bool TryValidateBooleanConst(ValueTracker dataSchema, ValueTracker if (constValue.Value.Value is not bool) { - errorReporter.ReportError($"The specified constant value must be Boolean.", constValue.TokenIndex, dataSchema.Value.Type!.TokenIndex); + errorReporter.ReportError(ErrorCondition.TypeMismatch, $"The specified constant value must be Boolean.", constValue.TokenIndex, dataSchema.Value.Type!.TokenIndex); hasError = true; } @@ -1700,7 +1700,7 @@ private bool TryValidateResidualProperties(Dictionary propertyName } else { - errorReporter.ReportError($"Data schema defines {schemaDescription}; property '{propertyName.Key}' is not supported.", propertyName.Value, cfTokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupported, $"Data schema defines {schemaDescription}; property '{propertyName.Key}' is not supported.", propertyName.Value, cfTokenIndex); hasError = true; } } @@ -1714,13 +1714,13 @@ private bool TryValidateObjectDataSchema(ValueTracker dataSchema, DataSche { if (dataSchema.Value.Properties?.Entries == null && dataSchema.Value.AdditionalProperties == null) { - errorReporter.ReportError($"Data schema with '{TDDataSchema.TypeName}' of '{TDValues.TypeObject}' must have either '{TDDataSchema.PropertiesName}' or 'dtv:additionalProperties' property.", dataSchema.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Data schema with '{TDDataSchema.TypeName}' of '{TDValues.TypeObject}' must have either '{TDDataSchema.PropertiesName}' or 'dtv:additionalProperties' property.", dataSchema.TokenIndex); return false; } if (dataSchema.Value.Properties?.Entries != null && dataSchema.Value.AdditionalProperties != null) { - errorReporter.ReportError($"Data schema with '{TDDataSchema.TypeName}' of '{TDValues.TypeObject}' cannot have both '{TDDataSchema.PropertiesName}' and 'dtv:additionalProperties' properties.", dataSchema.Value.Properties.TokenIndex, dataSchema.Value.AdditionalProperties.TokenIndex); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"Data schema with '{TDDataSchema.TypeName}' of '{TDValues.TypeObject}' cannot have both '{TDDataSchema.PropertiesName}' and 'dtv:additionalProperties' properties.", dataSchema.Value.Properties.TokenIndex, dataSchema.Value.AdditionalProperties.TokenIndex); return false; } @@ -1731,12 +1731,12 @@ private bool TryValidateObjectDataSchema(ValueTracker dataSchema, DataSche { if (dataSchemaKind != DataSchemaKind.SchemaDefinition) { - errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.Const.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupported, $"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.Const.TokenIndex); hasError = true; } else if (dataSchema.Value.Const.Value.ValueMap?.Entries == null) { - errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property value must be an object.", dataSchema.Value.Const.TokenIndex, dataSchema.Value.Type!.TokenIndex); + errorReporter.ReportError(ErrorCondition.TypeMismatch, $"The '{TDDataSchema.ConstName}' property value must be an object.", dataSchema.Value.Const.TokenIndex, dataSchema.Value.Type!.TokenIndex); hasError = true; } else @@ -1745,7 +1745,7 @@ private bool TryValidateObjectDataSchema(ValueTracker dataSchema, DataSche { if (property.Value.Value.Type == null) { - errorReporter.ReportError($"Data schema property '{property.Key}' is missing '{TDDataSchema.TypeName}' property, which is required in an object definition that specifies a constant value.", property.Value.TokenIndex, dataSchema.Value.Const.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Data schema property '{property.Key}' is missing '{TDDataSchema.TypeName}' property, which is required in an object definition that specifies a constant value.", property.Value.TokenIndex, dataSchema.Value.Const.TokenIndex); hasError = true; } else if (dataSchema.Value.Const.Value.ValueMap.Entries!.TryGetValue(property.Key, out ValueTracker? constValue)) @@ -1777,14 +1777,14 @@ private bool TryValidateObjectDataSchema(ValueTracker dataSchema, DataSche } break; default: - errorReporter.ReportError($"Data schema property '{property.Key}' value must specify a '{TDDataSchema.TypeName}' value of '{TDValues.TypeString}', '{TDValues.TypeNumber}', '{TDValues.TypeInteger}', or '{TDValues.TypeBoolean}' because the object definition specifies a constant value.", property.Value.Value.Type.TokenIndex, dataSchema.Value.Const.TokenIndex); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"Data schema property '{property.Key}' value must specify a '{TDDataSchema.TypeName}' value of '{TDValues.TypeString}', '{TDValues.TypeNumber}', '{TDValues.TypeInteger}', or '{TDValues.TypeBoolean}' because the object definition specifies a constant value.", property.Value.Value.Type.TokenIndex, dataSchema.Value.Const.TokenIndex); hasError = true; break; } } else { - errorReporter.ReportError($"Data schema '{TDDataSchema.PropertiesName}' value has property named '{property.Key}' that has no value in '{TDDataSchema.ConstName}' elements.", property.Value.TokenIndex, dataSchema.Value.Const.Value.ValueMap.TokenIndex); + errorReporter.ReportError(ErrorCondition.ItemNotFound, $"Data schema '{TDDataSchema.PropertiesName}' value has property named '{property.Key}' that has no value in '{TDDataSchema.ConstName}' elements.", property.Value.TokenIndex, dataSchema.Value.Const.Value.ValueMap.TokenIndex); hasError = true; } } @@ -1793,7 +1793,7 @@ private bool TryValidateObjectDataSchema(ValueTracker dataSchema, DataSche { if (!dataSchema.Value.Properties.Entries.ContainsKey(constValue.Key)) { - errorReporter.ReportError($"Data schema '{TDDataSchema.ConstName}' value has property named '{constValue.Key}' that has no type definition in '{TDDataSchema.PropertiesName}' elements.", constValue.Value.TokenIndex, dataSchema.Value.Properties.TokenIndex); + errorReporter.ReportError(ErrorCondition.ItemNotFound, $"Data schema '{TDDataSchema.ConstName}' value has property named '{constValue.Key}' that has no type definition in '{TDDataSchema.PropertiesName}' elements.", constValue.Value.TokenIndex, dataSchema.Value.Properties.TokenIndex); hasError = true; } } @@ -1833,7 +1833,7 @@ private bool TryValidateObjectDataSchema(ValueTracker dataSchema, DataSche { if (!dataSchema.Value.Properties.Entries.ContainsKey(requiredProperty.Value.Value)) { - errorReporter.ReportError($"Data schema '{TDDataSchema.RequiredName}' property names non-existent property '{requiredProperty.Value.Value}'.", requiredProperty.TokenIndex, dataSchema.Value.Properties.TokenIndex); + errorReporter.ReportError(ErrorCondition.ItemNotFound, $"Data schema '{TDDataSchema.RequiredName}' property names non-existent property '{requiredProperty.Value.Value}'.", requiredProperty.TokenIndex, dataSchema.Value.Properties.TokenIndex); hasError = true; } } @@ -1843,7 +1843,7 @@ private bool TryValidateObjectDataSchema(ValueTracker dataSchema, DataSche { if (dataSchemaKind != DataSchemaKind.SchemaDefinition) { - errorReporter.ReportError($"The '{TDDataSchema.ErrorMessageName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.ErrorMessage.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupported, $"The '{TDDataSchema.ErrorMessageName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.ErrorMessage.TokenIndex); hasError = true; } } @@ -1896,7 +1896,7 @@ private bool TryValidateArrayDataSchema(ValueTracker dataSchema, Func(ValueTracker dataSchema, DataSche { if (!EnumValueRegex.IsMatch(enumValue.Value.Value)) { - errorReporter.ReportError($"Data schema '{TDDataSchema.EnumName}' property has value \"{enumValue.Value.Value}\" that does not conform to codegen enum member naming rules -- it must start with a letter and contain only alphanumeric characters and underscores", enumValue.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Data schema '{TDDataSchema.EnumName}' property has value \"{enumValue.Value.Value}\" that does not conform to codegen enum member naming rules -- it must start with a letter and contain only alphanumeric characters and underscores", enumValue.TokenIndex); hasError = true; } } @@ -1961,7 +1961,7 @@ private bool TryValidateStringDataSchema(ValueTracker dataSchema, DataSche { if (dataSchemaKind != DataSchemaKind.SchemaDefinition) { - errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.Const.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupported, $"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.Const.TokenIndex); hasError = true; } else if (!TryValidateStringConst(dataSchema, dataSchema.Value.Const, dataSchema.Value.Const)) @@ -1987,7 +1987,7 @@ private bool TryValidateStringDataSchema(ValueTracker dataSchema, DataSche if (exclusiveProperties.Count > 1) { - errorReporter.ReportError($"Data schema string type cannot have more than one of the following properties: {string.Join(", ", exclusiveProperties)}.", dataSchema.TokenIndex); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"Data schema string type cannot have more than one of the following properties: {string.Join(", ", exclusiveProperties)}.", dataSchema.TokenIndex); hasError = true; } @@ -1996,7 +1996,7 @@ private bool TryValidateStringDataSchema(ValueTracker dataSchema, DataSche string formatValue = dataSchema.Value.Format.Value.Value; if (formatValue != TDValues.FormatDateTime && formatValue != TDValues.FormatDate && formatValue != TDValues.FormatTime && formatValue != TDValues.FormatUuid) { - errorReporter.ReportError($"Data schema '{TDDataSchema.FormatName}' property has unsupported value '{formatValue}'; supported values are '{TDValues.FormatDateTime}', '{TDValues.FormatDate}', '{TDValues.FormatTime}', and '{TDValues.FormatUuid}'.", dataSchema.Value.Format.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupportedValue, $"Data schema '{TDDataSchema.FormatName}' property has unsupported value '{formatValue}'; supported values are '{TDValues.FormatDateTime}', '{TDValues.FormatDate}', '{TDValues.FormatTime}', and '{TDValues.FormatUuid}'.", dataSchema.Value.Format.TokenIndex); hasError = true; } } @@ -2006,7 +2006,7 @@ private bool TryValidateStringDataSchema(ValueTracker dataSchema, DataSche string contentEncodingValue = dataSchema.Value.ContentEncoding.Value.Value; if (contentEncodingValue != TDValues.ContentEncodingBase64) { - errorReporter.ReportError($"Data schema '{TDDataSchema.ContentEncodingName}' property has unsupported value '{contentEncodingValue}'; only supported value is '{TDValues.ContentEncodingBase64}'.", dataSchema.Value.ContentEncoding.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupportedValue, $"Data schema '{TDDataSchema.ContentEncodingName}' property has unsupported value '{contentEncodingValue}'; only supported value is '{TDValues.ContentEncodingBase64}'.", dataSchema.Value.ContentEncoding.TokenIndex); hasError = true; } } @@ -2024,13 +2024,13 @@ private bool TryValidateStringDataSchema(ValueTracker dataSchema, DataSche } else if (!patternRegex.IsMatch(Iso8601DurationExample) && !patternRegex.IsMatch(DecimalExample)) { - errorReporter.ReportError($"Data schema '{TDDataSchema.PatternName}' property value \"{patternValue}\" matches neither an ISO 8601 duration value (e.g., \"{Iso8601DurationExample}\") nor a decimal value (e.g., \"{DecimalExample}\"), so indended type is indeterminate.", dataSchema.Value.Pattern.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Data schema '{TDDataSchema.PatternName}' property value \"{patternValue}\" matches neither an ISO 8601 duration value (e.g., \"{Iso8601DurationExample}\") nor a decimal value (e.g., \"{DecimalExample}\"), so indended type is indeterminate.", dataSchema.Value.Pattern.TokenIndex); hasError = true; } } catch (RegexParseException) { - errorReporter.ReportError($"Data schema '{TDDataSchema.PatternName}' property has invalid regular expression pattern '{patternValue}'", dataSchema.Value.Pattern.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Data schema '{TDDataSchema.PatternName}' property has invalid regular expression pattern '{patternValue}'", dataSchema.Value.Pattern.TokenIndex); hasError = true; } } @@ -2061,7 +2061,7 @@ private bool TryValidateNumberDataSchema(ValueTracker dataSchema, DataSche if (dataSchema.Value.Minimum?.Value.Value != null && dataSchema.Value.Maximum?.Value.Value != null && dataSchema.Value.Maximum.Value.Value < dataSchema.Value.Minimum.Value.Value) { - errorReporter.ReportError($"The '{TDDataSchema.MaximumName}' property value ({dataSchema.Value.Maximum.Value.Value}) cannot be less than the '{TDDataSchema.MinimumName}' property value ({dataSchema.Value.Minimum.Value.Value}).", dataSchema.Value.Maximum.TokenIndex, dataSchema.Value.Minimum.TokenIndex); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"The '{TDDataSchema.MaximumName}' property value ({dataSchema.Value.Maximum.Value.Value}) cannot be less than the '{TDDataSchema.MinimumName}' property value ({dataSchema.Value.Minimum.Value.Value}).", dataSchema.Value.Maximum.TokenIndex, dataSchema.Value.Minimum.TokenIndex); hasError = true; } @@ -2069,7 +2069,7 @@ private bool TryValidateNumberDataSchema(ValueTracker dataSchema, DataSche { if (dataSchemaKind != DataSchemaKind.SchemaDefinition) { - errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.Const.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupported, $"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.Const.TokenIndex); hasError = true; } else if (!TryValidateNumberConst(dataSchema, dataSchema.Value.Const, dataSchema.Value.Const)) @@ -2103,12 +2103,12 @@ private bool TryValidateIntegerDataSchema(ValueTracker dataSchema, DataSch if (dataSchema.Value.Minimum?.Value.Value != null && !double.IsInteger(dataSchema.Value.Minimum.Value.Value)) { - errorReporter.ReportError($"The '{TDDataSchema.MinimumName}' property value must be an integer.", dataSchema.Value.Minimum.TokenIndex); + errorReporter.ReportError(ErrorCondition.TypeMismatch, $"The '{TDDataSchema.MinimumName}' property value must be an integer.", dataSchema.Value.Minimum.TokenIndex); hasError = true; } if (dataSchema.Value.Maximum?.Value.Value != null && !double.IsInteger(dataSchema.Value.Maximum.Value.Value)) { - errorReporter.ReportError($"The '{TDDataSchema.MaximumName}' property value must be an integer.", dataSchema.Value.Maximum.TokenIndex); + errorReporter.ReportError(ErrorCondition.TypeMismatch, $"The '{TDDataSchema.MaximumName}' property value must be an integer.", dataSchema.Value.Maximum.TokenIndex); hasError = true; } @@ -2119,7 +2119,7 @@ private bool TryValidateIntegerDataSchema(ValueTracker dataSchema, DataSch if (dataSchema.Value.Minimum?.Value.Value != null && dataSchema.Value.Maximum?.Value.Value != null && dataSchema.Value.Maximum.Value.Value < dataSchema.Value.Minimum.Value.Value) { - errorReporter.ReportError($"The '{TDDataSchema.MaximumName}' property value ({dataSchema.Value.Maximum.Value.Value}) cannot be less than the '{TDDataSchema.MinimumName}' property value ({dataSchema.Value.Minimum.Value.Value}).", dataSchema.Value.Maximum.TokenIndex, dataSchema.Value.Minimum.TokenIndex); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"The '{TDDataSchema.MaximumName}' property value ({dataSchema.Value.Maximum.Value.Value}) cannot be less than the '{TDDataSchema.MinimumName}' property value ({dataSchema.Value.Minimum.Value.Value}).", dataSchema.Value.Maximum.TokenIndex, dataSchema.Value.Minimum.TokenIndex); hasError = true; } @@ -2127,7 +2127,7 @@ private bool TryValidateIntegerDataSchema(ValueTracker dataSchema, DataSch { if (dataSchemaKind != DataSchemaKind.SchemaDefinition) { - errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.Const.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupported, $"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.Const.TokenIndex); hasError = true; } else if (dataSchema.Value.Const != null && !TryValidateIntegerConst(dataSchema, dataSchema.Value.Const, dataSchema.Value.Const)) @@ -2163,7 +2163,7 @@ private bool TryValidateBooleanDataSchema(ValueTracker dataSchema, DataSch { if (dataSchemaKind != DataSchemaKind.SchemaDefinition) { - errorReporter.ReportError($"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.Const.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupported, $"The '{TDDataSchema.ConstName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.Const.TokenIndex); hasError = true; } else if (!TryValidateBooleanConst(dataSchema, dataSchema.Value.Const, dataSchema.Value.Const)) @@ -2193,7 +2193,7 @@ private bool TryValidateNullDataSchema(ValueTracker dataSchema, DataSchema { if (dataSchemaKind != DataSchemaKind.Action && dataSchemaKind != DataSchemaKind.Event) { - errorReporter.ReportError($"A '{TDDataSchema.TypeName}' property value of '{TDValues.TypeNull}' is permitted only in the '{TDAction.InputName}' or '{TDAction.OutputName}' property value of an '{TDThing.ActionsName}' element or in the '{TDEvent.DataName}' property value of an '{TDThing.EventsName}' element.", dataSchema.Value.Type!.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupported, $"A '{TDDataSchema.TypeName}' property value of '{TDValues.TypeNull}' is permitted only in the '{TDAction.InputName}' or '{TDAction.OutputName}' property value of an '{TDThing.ActionsName}' element or in the '{TDEvent.DataName}' property value of an '{TDThing.EventsName}' element.", dataSchema.Value.Type!.TokenIndex); return false; } diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompilerLib/CommandPerformer.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompilerLib/CommandPerformer.cs index 9b6082d607..48bd2cbacd 100644 --- a/codegen2/src/Azure.Iot.Operations.ProtocolCompilerLib/CommandPerformer.cs +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompilerLib/CommandPerformer.cs @@ -144,7 +144,7 @@ public static ErrorLog GenerateCode(OptionContainer options, Action 0 ? "found" : "specified")}. Use option --help for CLI usage and options.", errorLog); + AddUnlocatableError(ErrorCondition.ElementMissing, $"No Thing Description files specified, and no schema files {(options.SchemaFiles.Length > 0 ? "found" : "specified")}. Use option --help for CLI usage and options.", errorLog); return; } if (!SupportedLanguages.Contains(options.Language)) { string langCondition = string.IsNullOrEmpty(options.Language) ? "language not specified" : $"language '{options.Language}' not recognized"; - AddUnlocatableError($"{langCondition}; language must be {string.Join(" or ", SupportedLanguages.Select(l => $"'{l}'"))} (use 'none' for no code generation)", errorLog); + AddUnlocatableError(ErrorCondition.PropertyUnsupportedValue, $"{langCondition}; language must be {string.Join(" or ", SupportedLanguages.Select(l => $"'{l}'"))} (use 'none' for no code generation)", errorLog); return; } if (options.ClientOnly && options.ServerOnly) { - AddUnlocatableError("options --clientOnly and --serverOnly are mutually exclusive", errorLog); + AddUnlocatableError(ErrorCondition.ValuesInconsistent, "options --clientOnly and --serverOnly are mutually exclusive", errorLog); return; } @@ -345,7 +345,7 @@ private static void ValidateOptions(OptionContainer options, ErrorLog errorLog) { foreach (FileInfo f in options.ThingFiles.Where(tf => !tf.Exists)) { - AddUnlocatableError($"Non-existent Thing Description file: {f.FullName}", errorLog); + AddUnlocatableError(ErrorCondition.ItemNotFound, $"Non-existent Thing Description file: {f.FullName}", errorLog); } return; } @@ -375,14 +375,14 @@ private static void WarnOnSuspiciousOption(string optionName, string? pathName, } } - private static void AddUnlocatableError(string message, ErrorLog errorLog) + private static void AddUnlocatableError(ErrorCondition condition, string message, ErrorLog errorLog) { - errorLog.AddError(ErrorLevel.Error, message, string.Empty, 0); + errorLog.AddError(ErrorLevel.Error, condition, message, string.Empty, 0); } private static void AddUnlocatableWarning(string message, ErrorLog errorLog) { - errorLog.AddError(ErrorLevel.Warning, message, string.Empty, 0); + errorLog.AddError(ErrorLevel.Warning, ErrorCondition.None, message, string.Empty, 0); } } } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EnumSpec.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EnumSpec.cs index cc8f729f5c..30714a0c1b 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EnumSpec.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EnumSpec.cs @@ -14,11 +14,11 @@ internal static EnumSpec CreateFromDataSchema(ErrorReporter errorReporter, Schem if (dataSchema.Value.Type?.Value.Value != TDValues.TypeString) { - errorReporter.ReportError($"Enum schema '{schemaName}' must have type 'string'.", dataSchema.TokenIndex); + errorReporter.ReportError(ErrorCondition.TypeMismatch, $"Enum schema '{schemaName}' must have type 'string'.", dataSchema.TokenIndex); } if (dataSchema.Value.Enum?.Elements == null) { - errorReporter.ReportError($"Enum schema '{schemaName}' must have at least one defined value.", dataSchema.TokenIndex); + errorReporter.ReportError(ErrorCondition.ElementMissing, $"Enum schema '{schemaName}' must have at least one defined value.", dataSchema.TokenIndex); } string? description = dataSchema.Value.Description?.Value.Value ?? defaultDescription; diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ObjectSpec.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ObjectSpec.cs index db065d2387..dc8ddf02bc 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ObjectSpec.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ObjectSpec.cs @@ -14,7 +14,7 @@ internal static ObjectSpec CreateFromDataSchema(ErrorReporter errorReporter, Sch if (dataSchema.Value.Type?.Value.Value != TDValues.TypeObject) { - errorReporter.ReportError($"Object schema '{schemaName}' must have type 'object'.", dataSchema.TokenIndex); + errorReporter.ReportError(ErrorCondition.TypeMismatch, $"Object schema '{schemaName}' must have type 'object'.", dataSchema.TokenIndex); } Dictionary fieldSpecs = new(); diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs index e989c0464b..237c178239 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs @@ -143,7 +143,7 @@ private static bool IsLocalDuplicate(ErrorReporter errorReporter, string schemaN if (existingSpec.GetType() != schemaSpec.GetType()) { - errorReporter.ReportError($"Schema name {schemaName} is duplicated on schema with different type.", schemaSpec.TokenIndex, existingSpec.TokenIndex); + errorReporter.ReportError(ErrorCondition.Duplication, $"Schema name {schemaName} is duplicated on schema with different type.", schemaSpec.TokenIndex, existingSpec.TokenIndex); return false; } else if (existingSpec is ObjectSpec existingObjectSpec && schemaSpec is ObjectSpec newObjectSpec) @@ -152,7 +152,7 @@ private static bool IsLocalDuplicate(ErrorReporter errorReporter, string schemaN { if (!newObjectSpec.Fields.TryGetValue(field.Key, out FieldSpec? newField)) { - errorReporter.ReportError($"Schema name {schemaName} is duplicated but schema has field '{field.Key}' not present in other schema.", field.Value.Schema.TokenIndex, newObjectSpec.TokenIndex); + errorReporter.ReportError(ErrorCondition.Duplication, $"Schema name {schemaName} is duplicated but schema has field '{field.Key}' not present in other schema.", field.Value.Schema.TokenIndex, newObjectSpec.TokenIndex); return false; } } @@ -161,7 +161,7 @@ private static bool IsLocalDuplicate(ErrorReporter errorReporter, string schemaN { if (!existingObjectSpec.Fields.TryGetValue(field.Key, out FieldSpec? extantField)) { - errorReporter.ReportError($"Schema name {schemaName} is duplicated but schema has field '{field.Key}' not present in other schema.", field.Value.Schema.TokenIndex, existingObjectSpec.TokenIndex); + errorReporter.ReportError(ErrorCondition.Duplication, $"Schema name {schemaName} is duplicated but schema has field '{field.Key}' not present in other schema.", field.Value.Schema.TokenIndex, existingObjectSpec.TokenIndex); return false; } } @@ -171,7 +171,7 @@ private static bool IsLocalDuplicate(ErrorReporter errorReporter, string schemaN FieldSpec existingFieldValue = existingObjectSpec.Fields[field.Key]; if (!field.Value.Equals(existingFieldValue)) { - errorReporter.ReportError($"Schema name {schemaName} is duplicated but field '{field.Key}' has different value.", field.Value.Schema.TokenIndex, existingFieldValue.Schema.TokenIndex); + errorReporter.ReportError(ErrorCondition.Duplication, $"Schema name {schemaName} is duplicated but field '{field.Key}' has different value.", field.Value.Schema.TokenIndex, existingFieldValue.Schema.TokenIndex); return false; } } @@ -184,7 +184,7 @@ private static bool IsLocalDuplicate(ErrorReporter errorReporter, string schemaN { if (!newEnumSpec.Values.Contains(value)) { - errorReporter.ReportError($"Schema name {schemaName} is duplicated but schema has enum value '{value}' not present in other schema.", existingEnumSpec.TokenIndex, newEnumSpec.TokenIndex); + errorReporter.ReportError(ErrorCondition.Duplication, $"Schema name {schemaName} is duplicated but schema has enum value '{value}' not present in other schema.", existingEnumSpec.TokenIndex, newEnumSpec.TokenIndex); return false; } } @@ -193,7 +193,7 @@ private static bool IsLocalDuplicate(ErrorReporter errorReporter, string schemaN { if (!existingEnumSpec.Values.Contains(value)) { - errorReporter.ReportError($"Schema name {schemaName} is duplicated but schema has enum value '{value}' not present in other schema.", newEnumSpec.TokenIndex, existingEnumSpec.TokenIndex); + errorReporter.ReportError(ErrorCondition.Duplication, $"Schema name {schemaName} is duplicated but schema has enum value '{value}' not present in other schema.", newEnumSpec.TokenIndex, existingEnumSpec.TokenIndex); return false; } } diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs index 03f8a3ea9e..0bf92b1eeb 100644 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/JsonSchemaStandardizer.cs @@ -93,7 +93,7 @@ private bool TryGetSchemaType( if (schemaTracker.ValueKind != JsonValueKind.Object) { - errorReporter?.ReportError("JSON Schema definition has non-object value", schemaTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.JsonInvalid, "JSON Schema definition has non-object value", schemaTracker.TokenIndex); return false; } @@ -107,18 +107,18 @@ private bool TryGetSchemaType( string? title = titleTracker.GetString(); if (titleTracker.ValueKind != JsonValueKind.String || string.IsNullOrEmpty(title)) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyTitle}' property has non-string or empty value", titleTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.PropertyInvalid, $"JSON Schema '{JsonSchemaValues.PropertyTitle}' property has non-string or empty value", titleTracker.TokenIndex); hasError = true; } else if (!this.typeNamer.SuppressTitles && !TitleRegex.IsMatch(title)) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyTitle}' property value \"{title}\" does not conform to codegen type naming rules -- it must start with an uppercase letter and contain only alphanumeric characters", titleTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.PropertyInvalid, $"JSON Schema '{JsonSchemaValues.PropertyTitle}' property value \"{title}\" does not conform to codegen type naming rules -- it must start with an uppercase letter and contain only alphanumeric characters", titleTracker.TokenIndex); hasError = true; } } else if (isTopLevel) { - errorReporter?.ReportError($"JSON Schema file missing top-level '{JsonSchemaValues.PropertyTitle}' property", schemaTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.PropertyMissing, $"JSON Schema file missing top-level '{JsonSchemaValues.PropertyTitle}' property", schemaTracker.TokenIndex); hasError = true; } @@ -126,7 +126,7 @@ private bool TryGetSchemaType( { if (descTracker.ValueKind != JsonValueKind.String) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyDescription}' property has non-string value", descTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.PropertyInvalid, $"JSON Schema '{JsonSchemaValues.PropertyDescription}' property has non-string value", descTracker.TokenIndex); hasError = true; } } @@ -138,13 +138,13 @@ private bool TryGetSchemaType( if (!schemaTracker.TryGetProperty(JsonSchemaValues.PropertyType, out JsonTracker typeTracker)) { - errorReporter?.ReportError($"JSON Schema definition has neither '{JsonSchemaValues.PropertyType}' nor '{JsonSchemaValues.PropertyRef}' property", schemaTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.PropertyMissing, $"JSON Schema definition has neither '{JsonSchemaValues.PropertyType}' nor '{JsonSchemaValues.PropertyRef}' property", schemaTracker.TokenIndex); return false; } if (typeTracker.ValueKind != JsonValueKind.String || string.IsNullOrEmpty(typeTracker.GetString())) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyType}' property has non-string or empty value", typeTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.PropertyInvalid, $"JSON Schema '{JsonSchemaValues.PropertyType}' property has non-string or empty value", typeTracker.TokenIndex); return false; } @@ -169,7 +169,7 @@ private bool TryGetSchemaType( case JsonSchemaValues.TypeBoolean: return TryGetBooleanSchemaType(schemaTracker, orNull, errorReporter, out schemaType); default: - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyType}' property has unrecognized value \"{typeTracker.GetString()}\"", typeTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.PropertyUnsupportedValue, $"JSON Schema '{JsonSchemaValues.PropertyType}' property has unrecognized value \"{typeTracker.GetString()}\"", typeTracker.TokenIndex); return false; } } @@ -183,13 +183,13 @@ private bool TryGetNestedNullableJsonElement(ref JsonTracker jsonTracker, ErrorR if (anyOfTracker.ValueKind != JsonValueKind.Array) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyAnyOf}' property has non-array value", anyOfTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.JsonInvalid, $"JSON Schema '{JsonSchemaValues.PropertyAnyOf}' property has non-array value", anyOfTracker.TokenIndex); return false; } if (anyOfTracker.GetArrayLength() != 2) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyAnyOf}' property must have exactly two elements to represent a nullable type", anyOfTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.JsonInvalid, $"JSON Schema '{JsonSchemaValues.PropertyAnyOf}' property must have exactly two elements to represent a nullable type", anyOfTracker.TokenIndex); return false; } @@ -201,12 +201,12 @@ private bool TryGetNestedNullableJsonElement(ref JsonTracker jsonTracker, ErrorR if (firstIsNull && secondIsNull) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyAnyOf}' property has two elements that both have type '{JsonSchemaValues.TypeNull}'", anyOfTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.JsonInvalid, $"JSON Schema '{JsonSchemaValues.PropertyAnyOf}' property has two elements that both have type '{JsonSchemaValues.TypeNull}'", anyOfTracker.TokenIndex); return false; } if (!firstIsNull && !secondIsNull) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyAnyOf}' property has two elements neither of which has type '{JsonSchemaValues.TypeNull}'", anyOfTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.JsonInvalid, $"JSON Schema '{JsonSchemaValues.PropertyAnyOf}' property has two elements neither of which has type '{JsonSchemaValues.TypeNull}'", anyOfTracker.TokenIndex); return false; } @@ -221,17 +221,17 @@ private bool TryDetermineNullType(JsonTracker tracker, string ordinal, ErrorRepo if (tracker.ValueKind != JsonValueKind.Object) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyAnyOf}' {ordinal} element is not a JSON object", tracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.JsonInvalid, $"JSON Schema '{JsonSchemaValues.PropertyAnyOf}' {ordinal} element is not a JSON object", tracker.TokenIndex); return false; } if (!tracker.TryGetProperty(JsonSchemaValues.PropertyType, out JsonTracker typeTracker)) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyAnyOf}' {ordinal} element missing '{JsonSchemaValues.PropertyType}' property", tracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.PropertyMissing, $"JSON Schema '{JsonSchemaValues.PropertyAnyOf}' {ordinal} element missing '{JsonSchemaValues.PropertyType}' property", tracker.TokenIndex); return false; } if (typeTracker.ValueKind != JsonValueKind.String || string.IsNullOrEmpty(typeTracker.GetString())) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyAnyOf}' {ordinal} element '{JsonSchemaValues.PropertyType}' property has non-string or empty value", typeTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.PropertyInvalid, $"JSON Schema '{JsonSchemaValues.PropertyAnyOf}' {ordinal} element '{JsonSchemaValues.PropertyType}' property has non-string or empty value", typeTracker.TokenIndex); return false; } if (typeTracker.GetString() == JsonSchemaValues.TypeNull) @@ -286,7 +286,7 @@ private bool TryGetReferenceSchemaType( { if (refTypeTracker.ValueKind != JsonValueKind.String || string.IsNullOrEmpty(refTypeTracker.GetString())) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyType}' property has non-string or empty value", refTypeTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.JsonInvalid, $"JSON Schema '{JsonSchemaValues.PropertyType}' property has non-string or empty value", refTypeTracker.TokenIndex); return false; } @@ -332,7 +332,7 @@ private bool TryGetObjectSchemaType( { if (schemaTracker.TryGetProperty(JsonSchemaValues.PropertyProperties, out _)) { - errorReporter?.ReportError($"JSON Schema element has both a '{JsonSchemaValues.PropertyProperties}' property and an object-valued '{JsonSchemaValues.PropertyAdditionalProperties}' property -- intended type is ambiguous between Object and Map", schemaTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.ValuesInconsistent, $"JSON Schema element has both a '{JsonSchemaValues.PropertyProperties}' property and an object-valued '{JsonSchemaValues.PropertyAdditionalProperties}' property -- intended type is ambiguous between Object and Map", schemaTracker.TokenIndex); return false; } @@ -367,7 +367,7 @@ private bool TryGetObjectSchemaType( } else if (addlPropsTracker.ValueKind != JsonValueKind.False) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyAdditionalProperties}' property must have a value that is either a JSON object or a literal false", addlPropsTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.JsonInvalid, $"JSON Schema '{JsonSchemaValues.PropertyAdditionalProperties}' property must have a value that is either a JSON object or a literal false", addlPropsTracker.TokenIndex); return false; } } @@ -378,7 +378,7 @@ private bool TryGetObjectSchemaType( if (propertiesTracker.ValueKind != JsonValueKind.Object) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyProperties}' property has non-object value", propertiesTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.JsonInvalid, $"JSON Schema '{JsonSchemaValues.PropertyProperties}' property has non-object value", propertiesTracker.TokenIndex); return false; } @@ -387,7 +387,7 @@ private bool TryGetObjectSchemaType( { if (requiredTracker.ValueKind != JsonValueKind.Array) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyRequired}' property has non-array value", requiredTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.JsonInvalid, $"JSON Schema '{JsonSchemaValues.PropertyRequired}' property has non-array value", requiredTracker.TokenIndex); hasError = true; } else @@ -397,12 +397,12 @@ private bool TryGetObjectSchemaType( string? reqName = reqTracker.GetString(); if (reqTracker.ValueKind != JsonValueKind.String || string.IsNullOrEmpty(reqName)) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyRequired}' element in array has non-string or empty value", reqTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.JsonInvalid, $"JSON Schema '{JsonSchemaValues.PropertyRequired}' element in array has non-string or empty value", reqTracker.TokenIndex); hasError = true; } else if (!propertiesTracker.TryGetProperty(reqName, out _)) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyRequired}' element in array has value '{reqName}' that does not correspond to any property in '{JsonSchemaValues.PropertyProperties}' element", reqTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.ItemNotFound, $"JSON Schema '{JsonSchemaValues.PropertyRequired}' element in array has value '{reqName}' that does not correspond to any property in '{JsonSchemaValues.PropertyProperties}' element", reqTracker.TokenIndex); hasError = true; } else @@ -489,7 +489,7 @@ private bool TryGetObjectSchemaType( return true; } - errorReporter?.ReportError($"JSON Schema element has neither a '{JsonSchemaValues.PropertyProperties}' property nor an object-valued '{JsonSchemaValues.PropertyAdditionalProperties}' property", schemaTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.PropertyMissing, $"JSON Schema element has neither a '{JsonSchemaValues.PropertyProperties}' property nor an object-valued '{JsonSchemaValues.PropertyAdditionalProperties}' property", schemaTracker.TokenIndex); return false; } @@ -508,12 +508,12 @@ private bool TryGetArraySchemaType( if (!schemaTracker.TryGetProperty(JsonSchemaValues.PropertyItems, out JsonTracker itemsTracker)) { - errorReporter?.ReportError($"JSON Schema element has type '{JsonSchemaValues.TypeArray}' but no '{JsonSchemaValues.PropertyItems}' element", schemaTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.PropertyMissing, $"JSON Schema element has type '{JsonSchemaValues.TypeArray}' but no '{JsonSchemaValues.PropertyItems}' property", schemaTracker.TokenIndex); hasError = true; } else if (itemsTracker.ValueKind != JsonValueKind.Object) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyItems}' property has non-object value", itemsTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.JsonInvalid, $"JSON Schema '{JsonSchemaValues.PropertyItems}' property has non-object value", itemsTracker.TokenIndex); hasError = true; } @@ -568,7 +568,7 @@ private bool TryGetStringSchemaType( modifierCount++; if (formatTracker.ValueKind != JsonValueKind.String || string.IsNullOrEmpty(formatTracker.GetString())) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyFormat}' property has non-string or empty value", formatTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.JsonInvalid, $"JSON Schema '{JsonSchemaValues.PropertyFormat}' property has non-string or empty value", formatTracker.TokenIndex); hasError = true; } } @@ -577,7 +577,7 @@ private bool TryGetStringSchemaType( modifierCount++; if (encodingTracker.ValueKind != JsonValueKind.String || string.IsNullOrEmpty(encodingTracker.GetString())) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyContentEncoding}' property has non-string or empty value", encodingTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.JsonInvalid, $"JSON Schema '{JsonSchemaValues.PropertyContentEncoding}' property has non-string or empty value", encodingTracker.TokenIndex); hasError = true; } } @@ -586,14 +586,14 @@ private bool TryGetStringSchemaType( modifierCount++; if (patternTracker.ValueKind != JsonValueKind.String || string.IsNullOrEmpty(patternTracker.GetString())) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyPattern}' property has non-string or empty value", patternTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.JsonInvalid, $"JSON Schema '{JsonSchemaValues.PropertyPattern}' property has non-string or empty value", patternTracker.TokenIndex); hasError = true; } } if (modifierCount > 1) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.TypeString}' type can have at most one of '{JsonSchemaValues.PropertyFormat}', '{JsonSchemaValues.PropertyContentEncoding}', or '{JsonSchemaValues.PropertyPattern}' properties", schemaTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.ValuesInconsistent, $"JSON Schema '{JsonSchemaValues.TypeString}' type can have at most one of '{JsonSchemaValues.PropertyFormat}', '{JsonSchemaValues.PropertyContentEncoding}', or '{JsonSchemaValues.PropertyPattern}' properties", schemaTracker.TokenIndex); hasError = true; } @@ -635,7 +635,7 @@ private bool TryGetStringSchemaType( schemaType = new UuidType(orNull); return true; default: - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyFormat}' property has unrecognized value \"{formatTracker.GetString()}\"", formatTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.PropertyUnsupportedValue, $"JSON Schema '{JsonSchemaValues.PropertyFormat}' property has unrecognized value \"{formatTracker.GetString()}\"", formatTracker.TokenIndex); return false; } } @@ -648,7 +648,7 @@ private bool TryGetStringSchemaType( schemaType = new BytesType(orNull); return true; default: - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyContentEncoding}' property has unrecognized value \"{encodingTracker.GetString()}\"", encodingTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.PropertyUnsupportedValue, $"JSON Schema '{JsonSchemaValues.PropertyContentEncoding}' property has unrecognized value \"{encodingTracker.GetString()}\"", encodingTracker.TokenIndex); return false; } } @@ -661,7 +661,7 @@ private bool TryGetStringSchemaType( schemaType = new DecimalType(orNull); return true; default: - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyPattern}' property has unprocessable value \"{patternTracker.GetString()}\"", patternTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.PropertyInvalid, $"JSON Schema '{JsonSchemaValues.PropertyPattern}' property has unprocessable value \"{patternTracker.GetString()}\"", patternTracker.TokenIndex); return false; } } @@ -673,7 +673,7 @@ private bool TryGetStringSchemaType( List enumValues = new(); if (enumTracker.ValueKind != JsonValueKind.Array) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyEnum}' property has non-array value", enumTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.JsonInvalid, $"JSON Schema '{JsonSchemaValues.PropertyEnum}' property has non-array value", enumTracker.TokenIndex); hasError = true; } else @@ -682,12 +682,12 @@ private bool TryGetStringSchemaType( { if (valueTracker.ValueKind != JsonValueKind.String || string.IsNullOrEmpty(valueTracker.GetString())) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyEnum}' element in array has non-string or empty value", valueTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.JsonInvalid, $"JSON Schema '{JsonSchemaValues.PropertyEnum}' element in array has non-string or empty value", valueTracker.TokenIndex); hasError = true; } else if (!EnumValueRegex.IsMatch(valueTracker.GetString()!)) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyEnum}' element value \"{valueTracker.GetString()}\"must start with a letter and contain only alphanumerics and underscores", valueTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.PropertyInvalid, $"JSON Schema '{JsonSchemaValues.PropertyEnum}' element value \"{valueTracker.GetString()}\"must start with a letter and contain only alphanumerics and underscores", valueTracker.TokenIndex); hasError = true; } else @@ -743,17 +743,17 @@ private bool TryGetIntegerSchemaType(JsonTracker schemaTracker, bool orNull, Err { if (maxTracker.ValueKind != JsonValueKind.Number) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyMaximum}' property has non-numeric value", maxTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.JsonInvalid, $"JSON Schema '{JsonSchemaValues.PropertyMaximum}' property has non-numeric value", maxTracker.TokenIndex); hasError = true; } else if (!double.IsInteger(maxTracker.GetDouble())) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyMaximum}' property has non-integer numeric value", maxTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.PropertyInvalid, $"JSON Schema '{JsonSchemaValues.PropertyMaximum}' property has non-integer numeric value", maxTracker.TokenIndex); hasError = true; } else if (maxTracker.GetDouble() < 0) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyMaximum}' property has negative value", maxTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.PropertyInvalid, $"JSON Schema '{JsonSchemaValues.PropertyMaximum}' property has negative value", maxTracker.TokenIndex); hasError = true; } else @@ -766,17 +766,17 @@ private bool TryGetIntegerSchemaType(JsonTracker schemaTracker, bool orNull, Err { if (minTracker.ValueKind != JsonValueKind.Number) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyMinimum}' property has non-numeric value", minTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.JsonInvalid, $"JSON Schema '{JsonSchemaValues.PropertyMinimum}' property has non-numeric value", minTracker.TokenIndex); hasError = true; } else if (!double.IsInteger(minTracker.GetDouble())) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyMinimum}' property has non-integer numeric value", minTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.PropertyInvalid, $"JSON Schema '{JsonSchemaValues.PropertyMinimum}' property has non-integer numeric value", minTracker.TokenIndex); hasError = true; } else if (minTracker.GetDouble() > 0) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyMinimum}' property has positive value", minTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.PropertyInvalid, $"JSON Schema '{JsonSchemaValues.PropertyMinimum}' property has positive value", minTracker.TokenIndex); hasError = true; } else @@ -828,7 +828,7 @@ private bool TryGetNumberSchemaType(JsonTracker schemaTracker, bool orNull, Erro { if (formatTracker.ValueKind != JsonValueKind.String || string.IsNullOrEmpty(formatTracker.GetString())) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyFormat}' property has non-string or empty value", formatTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.JsonInvalid, $"JSON Schema '{JsonSchemaValues.PropertyFormat}' property has non-string or empty value", formatTracker.TokenIndex); hasError = true; } else @@ -842,7 +842,7 @@ private bool TryGetNumberSchemaType(JsonTracker schemaTracker, bool orNull, Erro isDouble = true; break; default: - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyFormat}' property has unrecognized value -- must be either '{JsonSchemaValues.FormatFloat}' or '{JsonSchemaValues.FormatDouble}'", formatTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.PropertyUnsupportedValue, $"JSON Schema '{JsonSchemaValues.PropertyFormat}' property has unrecognized value -- must be either '{JsonSchemaValues.FormatFloat}' or '{JsonSchemaValues.FormatDouble}'", formatTracker.TokenIndex); hasError = true; break; } @@ -900,13 +900,13 @@ private bool TryGetReferenceInfo( if (referencingTracker.ValueKind != JsonValueKind.String) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyRef}' property has non-string value", referencingTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.JsonInvalid, $"JSON Schema '{JsonSchemaValues.PropertyRef}' property has non-string value", referencingTracker.TokenIndex); return false; } if (string.IsNullOrEmpty(referencingTracker.GetString())) { - errorReporter?.ReportError($"JSON Schema '{JsonSchemaValues.PropertyRef}' property has empty string value", referencingTracker.TokenIndex); + errorReporter?.ReportError(ErrorCondition.PropertyEmpty, $"JSON Schema '{JsonSchemaValues.PropertyRef}' property has empty string value", referencingTracker.TokenIndex); return false; } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/ProtocolCompilerTester.cs b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/ProtocolCompilerTester.cs index c7cb5d60e7..eb83ea9e06 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/ProtocolCompilerTester.cs +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/ProtocolCompilerTester.cs @@ -55,6 +55,12 @@ public void TestProtocolCompilerFailures(string testCaseName, TestCommandLine co TestError? expectedError = GetBestMatchingExpectedError(errorRecord, errors); if (expectedError != null) { + if (!Enum.TryParse(expectedError.Condition, out ErrorCondition expectedCondition)) + { + Assert.Fail($"Test case '{testCaseName}' contains invalid error condition string '{expectedError.Condition}' in expected errors."); + } + + Assert.Equal(expectedCondition, errorRecord.Condition); Assert.Equal(expectedError.Filename, errorRecord.Filename); Assert.Equal(expectedError.LineNumber, errorRecord.LineNumber); Assert.Equal(expectedError.CfLineNumber, errorRecord.CfLineNumber); @@ -74,14 +80,30 @@ public void TestProtocolCompilerFailures(string testCaseName, TestCommandLine co private static TestError? GetBestMatchingExpectedError(ErrorRecord errorRecord, TestError[] errors) { - List plausibleErrors = errors.Where(e => e.Filename == errorRecord.Filename && Math.Abs(e.LineNumber - errorRecord.LineNumber) < 2).ToList(); - if (plausibleErrors.Count == 0) + if (errors.Length == 0) { return null; } - // TODO left off here - return null; + List fileMatches = errors.Where(e => e.Filename == errorRecord.Filename).ToList(); + if (fileMatches.Count == 0) + { + return errors[0]; + } + + List conditionMatches = fileMatches.Where(e => e.Condition == errorRecord.Condition.ToString()).ToList(); + if (conditionMatches.Count == 0) + { + return fileMatches[0]; + } + + int minLineOffset = conditionMatches.Min(e => Math.Abs(e.LineNumber - errorRecord.LineNumber)); + List minOffsetMatches = conditionMatches.Where(e => Math.Abs(e.LineNumber - errorRecord.LineNumber) == minLineOffset).ToList(); + + int minCfLineOffset = minOffsetMatches.Min(e => Math.Abs(e.CfLineNumber - errorRecord.CfLineNumber)); + List minCfOffsetMatches = minOffsetMatches.Where(e => Math.Abs(e.CfLineNumber - errorRecord.CfLineNumber) == minCfLineOffset).ToList(); + + return minCfOffsetMatches.First(); } private static OptionContainer GetOptionContainer(string testCaseName, TestCommandLine commandLine) diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/TestError.cs b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/TestError.cs index afaf71bcfa..e068e86a0c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/TestError.cs +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/TestError.cs @@ -1,9 +1,13 @@ namespace Azure.Iot.Operations.ProtocolCompiler.UnitTests { using System.Text.Json.Serialization; + using Azure.Iot.Operations.CodeGeneration; public class TestError { + [JsonPropertyName("condition")] + public string Condition { get; set; } = string.Empty; + [JsonPropertyName("filename")] public string Filename { get; set; } = string.Empty; diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SampleTest.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SampleTest.json index df05047cbe..d07dd389a0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SampleTest.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SampleTest.json @@ -16,6 +16,7 @@ }, "errors": [ { + "condition": "PropertyUnsupportedValue", "filename": "OneAction.TD.json", "line": 32, "cfLine": 0, From cded6a0312eed568650d9eb69a92acf5505e19ed Mon Sep 17 00:00:00 2001 From: "John (JD) Douceur" Date: Tue, 6 Jan 2026 12:30:20 -0800 Subject: [PATCH 32/52] add initial set of 356 validation-failure test cases --- .../MqttTopicTokens.cs | 5 + .../ThingValidator.cs | 87 +++++++----- .../.gitignore | 1 + .../ProtocolCompilerTester.cs | 119 ++++++++++++---- .../json-schemas/AnObjectSchema.json | 17 +++ .../name-rules/DefaultSchemaNames.json | 129 ++++++++++++++++++ .../SetColorInputArguments.schema.json | 14 -- .../SetColorOutputArguments.schema.json | 14 -- .../test-cases/{failure => }/SampleTest.json | 2 +- ...ormAdditionalResponseContentTypeEmpty.json | 16 +++ ...FormAdditionalResponseContentTypeText.json | 16 +++ ...nalResponseNoMatchingSchemaDefinition.json | 16 +++ .../ActionFormAdditionalResponseNoSchema.json | 16 +++ ...AdditionalResponseNoSchemaDefinitions.json | 16 +++ ...ActionFormAdditionalResponseNoSuccess.json | 16 +++ ...AdditionalResponseSchemaDefinitionMap.json | 16 +++ ...onalResponseSchemaDefinitionNotObject.json | 16 +++ ...tionFormAdditionalResponseSchemaEmpty.json | 16 +++ ...tionFormAdditionalResponseSuccessTrue.json | 16 +++ ...AdditionalResponseUnsupportedProperty.json | 16 +++ ...ActionFormAdditionalResponsesMultiple.json | 16 +++ .../failure/ActionFormContentTypeText.json | 16 +++ .../failure/ActionFormHeaderCodeEmpty.json | 16 +++ ...mHeaderCodeNoMatchingSchemaDefinition.json | 16 +++ ...tionFormHeaderCodeNoSchemaDefinitions.json | 16 +++ ...FormHeaderCodeSchemaDefinitionNotEnum.json | 16 +++ .../ActionFormHeaderInfoContentTypeEmpty.json | 16 +++ ...ctionFormHeaderInfoContentTypeNotJson.json | 16 +++ .../ActionFormHeaderInfoNoContentType.json | 16 +++ ...mHeaderInfoNoMatchingSchemaDefinition.json | 16 +++ .../failure/ActionFormHeaderInfoNoSchema.json | 16 +++ ...tionFormHeaderInfoNoSchemaDefinitions.json | 16 +++ ...tionFormHeaderInfoSchemaDefinitionMap.json | 16 +++ ...rmHeaderInfoSchemaDefinitionNotObject.json | 16 +++ .../ActionFormHeaderInfoSchemaEmpty.json | 16 +++ .../ActionFormHeaderInfoSuccessTrue.json | 16 +++ ...tionFormHeaderInfoUnsupportedProperty.json | 16 +++ .../ActionFormHeaderInfosMultiple.json | 16 +++ .../failure/ActionFormOpInvokeDuplicate.json | 16 +++ .../test-cases/failure/ActionFormOpRead.json | 16 +++ .../test-cases/failure/ActionFormOpSub.json | 16 +++ .../test-cases/failure/ActionFormOpWrite.json | 16 +++ .../failure/ActionFormServiceGroupEmpty.json | 16 +++ .../failure/ActionFormTopicNoContentType.json | 16 +++ .../failure/ActionFormTopicTokenAction.json | 16 +++ .../ActionFormTopicTokenConsumerId.json | 16 +++ .../ActionFormTopicTokenMaintainerId.json | 16 +++ .../failure/ActionFormTopicTokenSenderId.json | 16 +++ .../ActionFormUnsupportedProperty.json | 16 +++ .../test-cases/failure/ActionFormsEmpty.json | 16 +++ .../ActionFormsMultipleContentTypes.json | 16 +++ .../failure/ActionFormsOpInvokeDuplicate.json | 16 +++ .../failure/ActionFormsOplessAndInvoke.json | 16 +++ .../failure/ActionFormsOplessDuplicate.json | 16 +++ .../test-cases/failure/ActionInputMap.json | 16 +++ .../ActionInputNullAndContentTypeJson.json | 16 +++ .../test-cases/failure/ActionInputNumber.json | 16 +++ ...ActionInputObjectAndContentTypeCustom.json | 16 +++ .../ActionInputObjectAndContentTypeRaw.json | 16 +++ .../failure/ActionInputObjectConst.json | 16 +++ .../ActionInputObjectErrorMessage.json | 16 +++ .../test-cases/failure/ActionInputString.json | 16 +++ .../test-cases/failure/ActionNoForms.json | 16 +++ .../failure/ActionNoFormsWithTopic.json | 16 +++ .../test-cases/failure/ActionOutputMap.json | 16 +++ .../ActionOutputNullAndContentTypeJson.json | 16 +++ .../failure/ActionOutputNumber.json | 16 +++ ...ctionOutputObjectAndContentTypeCustom.json | 16 +++ .../ActionOutputObjectAndContentTypeRaw.json | 16 +++ .../failure/ActionOutputObjectConst.json | 16 +++ .../ActionOutputObjectErrorMessage.json | 16 +++ .../failure/ActionOutputString.json | 16 +++ .../failure/ActionUnsupportedProperty.json | 16 +++ .../test-cases/failure/ArrayKey.json | 16 +++ .../test-cases/failure/BooleanKey.json | 16 +++ .../failure/ContextDtvWrongPrefix.json | 16 +++ .../failure/ContextDtvWrongUri.json | 23 ++++ .../test-cases/failure/ContextMissingDtv.json | 16 +++ .../test-cases/failure/ContextMissingWot.json | 16 +++ .../test-cases/failure/ContextWrongType.json | 16 +++ .../test-cases/failure/DuplicateKey.json | 16 +++ .../test-cases/failure/EventBooleanConst.json | 16 +++ .../failure/EventFormAdditionalResponses.json | 16 +++ .../failure/EventFormContentTypeText.json | 16 +++ .../failure/EventFormHeaderCode.json | 16 +++ .../failure/EventFormHeaderInfo.json | 16 +++ .../test-cases/failure/EventFormOpInvoke.json | 16 +++ .../test-cases/failure/EventFormOpRead.json | 16 +++ .../test-cases/failure/EventFormOpSubAll.json | 16 +++ .../failure/EventFormOpSubDuplicate.json | 16 +++ .../test-cases/failure/EventFormOpWrite.json | 16 +++ .../failure/EventFormServiceGroupEmpty.json | 16 +++ .../failure/EventFormTopicNoContentType.json | 16 +++ .../failure/EventFormTopicTokenAction.json | 16 +++ .../EventFormTopicTokenConsumerId.json | 16 +++ .../EventFormTopicTokenExecutorId.json | 16 +++ .../failure/EventFormTopicTokenInvokerId.json | 16 +++ .../EventFormTopicTokenMaintainerId.json | 16 +++ .../failure/EventFormUnsupportedProperty.json | 16 +++ .../test-cases/failure/EventFormsEmpty.json | 16 +++ .../failure/EventFormsOpSubDuplicate.json | 16 +++ .../failure/EventFormsOplessAndSub.json | 16 +++ .../failure/EventFormsOplessDuplicate.json | 16 +++ .../test-cases/failure/EventIntegerConst.json | 16 +++ .../test-cases/failure/EventNoForms.json | 16 +++ ...ntNoFormsWithTopicAndNoRootFormSubAll.json | 16 +++ .../failure/EventNullAndContentTypeJson.json | 16 +++ .../test-cases/failure/EventNumberConst.json | 16 +++ .../EventObjectAndContentTypeCustom.json | 16 +++ .../failure/EventObjectAndContentTypeRaw.json | 16 +++ .../test-cases/failure/EventObjectConst.json | 16 +++ .../failure/EventObjectErrorMessage.json | 16 +++ .../test-cases/failure/EventStringConst.json | 16 +++ .../failure/EventUnsupportedProperty.json | 16 +++ .../test-cases/failure/IdEmpty.json | 16 +++ .../failure/IdInvalidCharacters.json | 16 +++ .../IdInvalidReplacementForTokenInTopic.json | 16 +++ .../test-cases/failure/IdNotString.json | 16 +++ .../test-cases/failure/LinkEmptyHref.json | 16 +++ .../test-cases/failure/LinkEmptyType.json | 16 +++ .../test-cases/failure/LinkNoHref.json | 16 +++ .../test-cases/failure/LinkNoType.json | 16 +++ .../test-cases/failure/LinkNonJsonFile.json | 16 +++ .../failure/LinkNonexistentFile.json | 16 +++ .../test-cases/failure/LinkTypeNotJson.json | 16 +++ .../failure/LinkUnsupportedProperty.json | 16 +++ .../test-cases/failure/MissingColon.json | 16 +++ .../test-cases/failure/MissingComma.json | 16 +++ .../test-cases/failure/MissingElement.json | 16 +++ .../test-cases/failure/MissingKey.json | 16 +++ .../test-cases/failure/MissingValue.json | 16 +++ .../test-cases/failure/MultipleLinks.json | 16 +++ .../test-cases/failure/NoClientOrServer.json | 19 +++ .../test-cases/failure/NoContext.json | 16 +++ .../test-cases/failure/NoId.json | 16 +++ .../test-cases/failure/NoThingOrSchema.json | 17 +++ .../test-cases/failure/NoTitle.json | 16 +++ .../test-cases/failure/NonexistentThing.json | 17 +++ .../test-cases/failure/NumericKey.json | 16 +++ .../test-cases/failure/ObjectKey.json | 16 +++ .../failure/PropertyBooleanConst.json | 16 +++ ...ormAdditionalResponseContentTypeEmpty.json | 16 +++ ...FormAdditionalResponseContentTypeText.json | 16 +++ ...nalResponseNoMatchingSchemaDefinition.json | 16 +++ ...ropertyFormAdditionalResponseNoSchema.json | 16 +++ ...AdditionalResponseNoSchemaDefinitions.json | 16 +++ ...opertyFormAdditionalResponseNoSuccess.json | 16 +++ ...AdditionalResponseSchemaDefinitionMap.json | 16 +++ ...onalResponseSchemaDefinitionNotObject.json | 16 +++ ...ertyFormAdditionalResponseSchemaEmpty.json | 16 +++ ...ertyFormAdditionalResponseSuccessTrue.json | 16 +++ ...AdditionalResponseUnsupportedProperty.json | 16 +++ ...opertyFormAdditionalResponsesMultiple.json | 16 +++ .../failure/PropertyFormContentTypeText.json | 16 +++ .../failure/PropertyFormHeaderCode.json | 16 +++ .../failure/PropertyFormHeaderInfo.json | 16 +++ .../failure/PropertyFormOpInvoke.json | 16 +++ .../failure/PropertyFormOpReadAll.json | 16 +++ .../failure/PropertyFormOpReadDuplicate.json | 16 +++ .../test-cases/failure/PropertyFormOpSub.json | 16 +++ .../failure/PropertyFormOpWriteDuplicate.json | 16 +++ .../failure/PropertyFormOpWriteMulti.json | 16 +++ ...FormReadAllWithoutAdditionalResponses.json | 16 +++ ...plessWithoutTopicAndNoRootFormReadAll.json | 16 +++ ...FormReadAllWithoutAdditionalResponses.json | 16 +++ ...mReadWithoutTopicAndNoRootFormReadAll.json | 16 +++ ...TopicWriteWithTopicAndRootFormReadAll.json | 16 +++ .../failure/PropertyFormServiceGroup.json | 16 +++ .../PropertyFormTopicNoContentType.json | 16 +++ .../PropertyFormTopicTokenExecutorId.json | 16 +++ .../PropertyFormTopicTokenInvokerId.json | 16 +++ ...picTokenNoActionWhenNoOpAndNoReadOnly.json | 16 +++ ...TokenNoActionWhenNoOpAndReadOnlyFalse.json | 16 +++ ...ormTopicTokenNoActionWhenReadAndWrite.json | 16 +++ .../PropertyFormTopicTokenSenderId.json | 16 +++ .../PropertyFormUnsupportedProperty.json | 16 +++ ...mWriteMultiWithoutAdditionalResponses.json | 16 +++ ...teWithoutTopicAndNoRootFormWriteMulti.json | 16 +++ .../failure/PropertyFormsEmpty.json | 16 +++ .../failure/PropertyFormsOpReadDuplicate.json | 16 +++ .../PropertyFormsOpWriteDuplicate.json | 16 +++ .../failure/PropertyFormsOpWriteNoRead.json | 16 +++ .../failure/PropertyFormsOplessAndRead.json | 16 +++ .../failure/PropertyFormsOplessDuplicate.json | 16 +++ .../failure/PropertyIntegerConst.json | 16 +++ .../test-cases/failure/PropertyNoForms.json | 16 +++ .../failure/PropertyNumberConst.json | 16 +++ .../failure/PropertyObjectConst.json | 16 +++ .../failure/PropertyObjectErrorMessage.json | 16 +++ .../failure/PropertyStringConst.json | 16 +++ .../test-cases/failure/PropertyTypeNull.json | 16 +++ .../failure/PropertyUnsupportedProperty.json | 16 +++ ...ormAdditionalResponseContentTypeEmpty.json | 16 +++ ...FormAdditionalResponseContentTypeText.json | 16 +++ .../RootFormAdditionalResponseNoSuccess.json | 16 +++ .../RootFormAdditionalResponseSchema.json | 16 +++ ...RootFormAdditionalResponseSuccessTrue.json | 16 +++ ...AdditionalResponseUnsupportedProperty.json | 16 +++ .../RootFormAdditionalResponsesAndSubAll.json | 16 +++ .../RootFormAdditionalResponsesMultiple.json | 16 +++ .../failure/RootFormContentTypeCustom.json | 16 +++ .../failure/RootFormContentTypeRaw.json | 16 +++ .../failure/RootFormContentTypeText.json | 16 +++ .../test-cases/failure/RootFormEmptyHref.json | 16 +++ .../failure/RootFormHeaderCode.json | 16 +++ .../failure/RootFormHeaderInfo.json | 16 +++ .../failure/RootFormNoContentType.json | 16 +++ .../test-cases/failure/RootFormNoHref.json | 16 +++ .../test-cases/failure/RootFormNoOp.json | 16 +++ .../test-cases/failure/RootFormNoTopic.json | 16 +++ .../failure/RootFormOpArrayEmpty.json | 16 +++ .../failure/RootFormOpElementEmpty.json | 16 +++ .../test-cases/failure/RootFormOpEmpty.json | 16 +++ .../failure/RootFormOpReadAllAndSubAll.json | 16 +++ .../failure/RootFormOpReadAllDuplicate.json | 16 +++ .../test-cases/failure/RootFormOpReadOne.json | 16 +++ .../failure/RootFormOpSubAllDuplicate.json | 16 +++ .../test-cases/failure/RootFormOpSubOne.json | 16 +++ .../failure/RootFormOpWiteMultiAndSubAll.json | 16 +++ .../RootFormOpWriteMultiDuplicate.json | 16 +++ .../failure/RootFormOpWriteOne.json | 16 +++ .../RootFormReadAllButNoProperties.json | 16 +++ .../failure/RootFormServiceGroupEmpty.json | 16 +++ .../failure/RootFormServiceGroupNoSubAll.json | 16 +++ .../failure/RootFormSubAllButNoEvents.json | 16 +++ .../failure/RootFormTopicEmpty.json | 16 +++ .../failure/RootFormTopicLevelEmpty.json | 16 +++ .../failure/RootFormTopicLevelInvalid.json | 16 +++ .../failure/RootFormTopicReservedStart.json | 16 +++ .../RootFormTopicTokenActionWhenSubAll.json | 16 +++ ...ootFormTopicTokenConsumerIdWhenSubAll.json | 16 +++ .../RootFormTopicTokenCustomEmpty.json | 16 +++ .../RootFormTopicTokenCustomInvalid.json | 16 +++ .../failure/RootFormTopicTokenEmpty.json | 16 +++ .../failure/RootFormTopicTokenExecutorId.json | 16 +++ .../failure/RootFormTopicTokenInvokerId.json | 16 +++ ...tFormTopicTokenMaintainerIdWhenSubAll.json | 16 +++ ...TokenNoActionWhenReadAllAndWriteMulti.json | 16 +++ ...RootFormTopicTokenSenderIdWhenReadAll.json | 16 +++ ...tFormTopicTokenSenderIdWhenWriteMulti.json | 16 +++ .../RootFormTopicTokenUnrecognized.json | 16 +++ ...FormWriteMultiButNoWritableProperties.json | 16 +++ .../test-cases/failure/RootFormsEmpty.json | 16 +++ .../failure/RootFormsOpReadAllDuplicate.json | 16 +++ .../failure/RootFormsOpSubAllDuplicate.json | 16 +++ .../RootFormsOpWriteMultiDuplicate.json | 16 +++ .../RootFormsOpWriteMultiNoReadAll.json | 16 +++ .../failure/SchemaDefinitionArrayConst.json | 16 +++ .../SchemaDefinitionArrayItemsNoType.json | 16 +++ .../SchemaDefinitionArrayItemsNotObject.json | 16 +++ ...SchemaDefinitionArrayItemsObjectConst.json | 16 +++ .../SchemaDefinitionArrayItemsRef.json | 16 +++ ...SchemaDefinitionArrayItemsStringConst.json | 16 +++ ...hemaDefinitionArrayItemsTypeNotString.json | 16 +++ .../SchemaDefinitionArrayItemsTypeNull.json | 16 +++ ...maDefinitionArrayItemsTypeUnsupported.json | 16 +++ .../failure/SchemaDefinitionArrayNoItems.json | 16 +++ ...DefinitionBooleanConstValueNotBoolean.json | 16 +++ .../SchemaDefinitionBooleanReadOnly.json | 16 +++ ...aDefinitionBooleanUnsupportedProperty.json | 16 +++ ...maDefinitionIntegerConstValueAboveMax.json | 16 +++ ...maDefinitionIntegerConstValueBelowMin.json | 16 +++ ...DefinitionIntegerConstValueNotInteger.json | 16 +++ ...DefinitionIntegerConstValueNotNumeric.json | 16 +++ .../SchemaDefinitionIntegerMaxNotInteger.json | 16 +++ .../SchemaDefinitionIntegerMaxNotNumeric.json | 16 +++ .../SchemaDefinitionIntegerMinAboveMax.json | 16 +++ .../SchemaDefinitionIntegerMinNotInteger.json | 16 +++ .../SchemaDefinitionIntegerMinNotNumeric.json | 16 +++ .../SchemaDefinitionIntegerReadOnly.json | 16 +++ ...aDefinitionIntegerUnsupportedProperty.json | 16 +++ ...finitionMapAdditionalPropertiesNoType.json | 16 +++ ...itionMapAdditionalPropertiesNotObject.json | 16 +++ ...ionMapAdditionalPropertiesObjectConst.json | 16 +++ ...aDefinitionMapAdditionalPropertiesRef.json | 16 +++ ...ionMapAdditionalPropertiesStringConst.json | 16 +++ ...nMapAdditionalPropertiesTypeNotString.json | 16 +++ ...nitionMapAdditionalPropertiesTypeNull.json | 16 +++ ...apAdditionalPropertiesTypeUnsupported.json | 16 +++ .../failure/SchemaDefinitionMapConst.json | 16 +++ .../failure/SchemaDefinitionNoType.json | 16 +++ ...emaDefinitionNumberConstValueAboveMax.json | 16 +++ ...emaDefinitionNumberConstValueBelowMin.json | 16 +++ ...aDefinitionNumberConstValueNotNumeric.json | 16 +++ .../SchemaDefinitionNumberMaxNotNumeric.json | 16 +++ .../SchemaDefinitionNumberMinAboveMax.json | 16 +++ .../SchemaDefinitionNumberMinNotNumeric.json | 16 +++ .../SchemaDefinitionNumberReadOnly.json | 16 +++ ...maDefinitionNumberUnsupportedProperty.json | 16 +++ ...chemaDefinitionObjectBothDeterminants.json | 16 +++ .../SchemaDefinitionObjectConstNotObject.json | 16 +++ ...nitionObjectConstPropertyBooleanConst.json | 16 +++ ...nObjectConstPropertyBooleanNotBoolean.json | 16 +++ ...nstPropertyBooleanUnsupportedProperty.json | 16 +++ ...ionObjectConstPropertyIntegerAboveMax.json | 16 +++ ...ionObjectConstPropertyIntegerBelowMin.json | 16 +++ ...nitionObjectConstPropertyIntegerConst.json | 16 +++ ...nObjectConstPropertyIntegerNotInteger.json | 16 +++ ...nObjectConstPropertyIntegerNotNumeric.json | 16 +++ ...nstPropertyIntegerUnsupportedProperty.json | 16 +++ ...maDefinitionObjectConstPropertyNoType.json | 16 +++ ...aDefinitionObjectConstPropertyNoValue.json | 16 +++ ...tionObjectConstPropertyNumberAboveMax.json | 16 +++ ...tionObjectConstPropertyNumberBelowMin.json | 16 +++ ...initionObjectConstPropertyNumberConst.json | 16 +++ ...onObjectConstPropertyNumberNotNumeric.json | 16 +++ ...onstPropertyNumberUnsupportedProperty.json | 16 +++ ...initionObjectConstPropertyStringConst.json | 16 +++ ...onstPropertyStringUnsupportedProperty.json | 16 +++ ...jectConstPropertyStringValueNotString.json | 16 +++ ...efinitionObjectConstPropertyTypeArray.json | 16 +++ ...DefinitionObjectConstPropertyTypeNull.json | 16 +++ ...finitionObjectConstPropertyTypeObject.json | 16 +++ ...ionObjectConstPropertyTypeUnsupported.json | 16 +++ ...initionObjectConstUnsupportedProperty.json | 16 +++ ...emaDefinitionObjectConstValueNoSchema.json | 16 +++ ...efinitionObjectErrorMessageNoProperty.json | 16 +++ ...DefinitionObjectErrorMessageNotString.json | 16 +++ ...onObjectErrorMessagePropertyNotString.json | 16 +++ .../SchemaDefinitionObjectNoDeterminant.json | 16 +++ ...maDefinitionObjectPropertiesNotObject.json | 16 +++ .../SchemaDefinitionObjectPropertyNoType.json | 16 +++ ...maDefinitionObjectPropertyObjectConst.json | 16 +++ .../SchemaDefinitionObjectPropertyRef.json | 16 +++ ...maDefinitionObjectPropertyStringConst.json | 16 +++ ...DefinitionObjectPropertyTypeNotString.json | 16 +++ ...chemaDefinitionObjectPropertyTypeNull.json | 16 +++ ...finitionObjectPropertyTypeUnsupported.json | 16 +++ ...emaDefinitionObjectRequiredNoProperty.json | 16 +++ ...hemaDefinitionObjectRequiredNotString.json | 16 +++ .../failure/SchemaDefinitionRef.json | 16 +++ ...aDefinitionStringConstContentEncoding.json | 16 +++ .../SchemaDefinitionStringConstFormat.json | 16 +++ .../SchemaDefinitionStringConstPattern.json | 16 +++ ...initionStringConstUnsupportedProperty.json | 16 +++ ...maDefinitionStringConstValueNotString.json | 16 +++ ...initionStringContentEncodingNotString.json | 16 +++ ...StringContentEncodingUnsupportedValue.json | 16 +++ .../SchemaDefinitionStringEnumConst.json | 16 +++ ...maDefinitionStringEnumContentEncoding.json | 16 +++ ...emaDefinitionStringEnumElementInvalid.json | 16 +++ .../SchemaDefinitionStringEnumFormat.json | 16 +++ .../SchemaDefinitionStringEnumPattern.json | 16 +++ .../SchemaDefinitionStringEnumReadOnly.json | 16 +++ ...finitionStringEnumUnsupportedProperty.json | 16 +++ ...initionStringFormatAndContentEncoding.json | 16 +++ ...chemaDefinitionStringFormatAndPattern.json | 16 +++ ...SchemaDefinitionStringFormatNotString.json | 16 +++ ...efinitionStringFormatUnsupportedValue.json | 16 +++ ...nitionStringPatternAndContentEncoding.json | 16 +++ ...tionStringPatternNotDurationOrDecimal.json | 16 +++ ...chemaDefinitionStringPatternNotString.json | 16 +++ ...maDefinitionStringPatternRegexInvalid.json | 16 +++ .../SchemaDefinitionStringReadOnly.json | 16 +++ ...maDefinitionStringUnsupportedProperty.json | 16 +++ .../SchemaDefinitionTypeNotString.json | 16 +++ .../failure/SchemaDefinitionTypeNull.json | 16 +++ .../SchemaDefinitionTypeUnsupported.json | 16 +++ .../test-cases/failure/TitleEmpty.json | 16 +++ .../test-cases/failure/TitleInvalid.json | 16 +++ .../test-cases/failure/TitleNotString.json | 16 +++ .../test-cases/failure/TrailingComma.json | 23 ++++ .../test-cases/failure/UnclosedArray.json | 16 +++ .../test-cases/failure/UnclosedObject.json | 16 +++ .../failure/UnsupportedLanguage.json | 16 +++ .../IdInvalidReplacementButNotInTopic.json | 7 + .../test-cases/success/LinkNoRel.json | 7 + .../test-cases/success/LinkOtherRel.json | 7 + ...NoReadablePropertyAdditionalResponses.json | 15 ++ ...NoWritablePropertyAdditionalResponses.json | 15 ++ .../thing-descriptions/.vscode/settings.json | 9 ++ ...AdditionalResponseContentTypeEmpty.TD.json | 56 ++++++++ ...mAdditionalResponseContentTypeText.TD.json | 56 ++++++++ ...ResponseNoMatchingSchemaDefinition.TD.json | 48 +++++++ ...tionFormAdditionalResponseNoSchema.TD.json | 55 ++++++++ ...itionalResponseNoSchemaDefinitions.TD.json | 38 ++++++ ...ionFormAdditionalResponseNoSuccess.TD.json | 55 ++++++++ ...itionalResponseSchemaDefinitionMap.TD.json | 53 +++++++ ...lResponseSchemaDefinitionNotObject.TD.json | 55 ++++++++ ...nFormAdditionalResponseSchemaEmpty.TD.json | 56 ++++++++ ...nFormAdditionalResponseSuccessTrue.TD.json | 56 ++++++++ ...itionalResponseUnsupportedProperty.TD.json | 57 ++++++++ ...ionFormAdditionalResponsesMultiple.TD.json | 60 ++++++++ .../ActionFormContentTypeText.TD.json | 32 +++++ .../ActionFormHeaderCodeEmpty.TD.json | 33 +++++ ...aderCodeNoMatchingSchemaDefinition.TD.json | 38 ++++++ ...nFormHeaderCodeNoSchemaDefinitions.TD.json | 33 +++++ ...mHeaderCodeSchemaDefinitionNotEnum.TD.json | 38 ++++++ ...tionFormHeaderInfoContentTypeEmpty.TD.json | 56 ++++++++ ...onFormHeaderInfoContentTypeNotJson.TD.json | 56 ++++++++ .../ActionFormHeaderInfoNoContentType.TD.json | 55 ++++++++ ...aderInfoNoMatchingSchemaDefinition.TD.json | 49 +++++++ .../ActionFormHeaderInfoNoSchema.TD.json | 56 ++++++++ ...nFormHeaderInfoNoSchemaDefinitions.TD.json | 39 ++++++ ...nFormHeaderInfoSchemaDefinitionMap.TD.json | 54 ++++++++ ...eaderInfoSchemaDefinitionNotObject.TD.json | 56 ++++++++ .../ActionFormHeaderInfoSchemaEmpty.TD.json | 57 ++++++++ .../ActionFormHeaderInfoSuccessTrue.TD.json | 56 ++++++++ ...nFormHeaderInfoUnsupportedProperty.TD.json | 57 ++++++++ .../ActionFormHeaderInfosMultiple.TD.json | 62 +++++++++ .../ActionFormOpInvokeDuplicate.TD.json | 32 +++++ .../ActionFormServiceGroupEmpty.TD.json | 33 +++++ .../ActionFormTopicNoContentType.TD.json | 31 +++++ .../ActionFormTopicTokenAction.TD.json | 32 +++++ .../ActionFormTopicTokenConsumerId.TD.json | 32 +++++ .../ActionFormTopicTokenMaintainerId.TD.json | 32 +++++ .../ActionFormTopicTokenSenderId.TD.json | 32 +++++ .../ActionFormUnsupportedProperty.TD.json | 33 +++++ .../ActionFormsMultipleContentTypes.TD.json | 38 ++++++ .../ActionFormsOpInvokeDuplicate.TD.json | 38 ++++++ .../ActionFormsOplessAndInvoke.TD.json | 37 +++++ .../ActionFormsOplessDuplicate.TD.json | 36 +++++ .../invalidAioBinding/ActionInputMap.TD.json | 38 ++++++ .../ActionInputNullAndContentTypeJson.TD.json | 35 +++++ .../ActionInputNumber.TD.json | 35 +++++ ...ionInputObjectAndContentTypeCustom.TD.json | 40 ++++++ ...ActionInputObjectAndContentTypeRaw.TD.json | 40 ++++++ .../ActionInputObjectConst.TD.json | 43 ++++++ .../ActionInputObjectErrorMessage.TD.json | 41 ++++++ .../ActionInputString.TD.json | 35 +++++ .../ActionNoFormsWithTopic.TD.json | 31 +++++ .../invalidAioBinding/ActionOutputMap.TD.json | 38 ++++++ ...ActionOutputNullAndContentTypeJson.TD.json | 35 +++++ .../ActionOutputNumber.TD.json | 35 +++++ ...onOutputObjectAndContentTypeCustom.TD.json | 40 ++++++ ...ctionOutputObjectAndContentTypeRaw.TD.json | 40 ++++++ .../ActionOutputObjectConst.TD.json} | 27 ++-- .../ActionOutputObjectErrorMessage.TD.json | 41 ++++++ .../ActionOutputString.TD.json | 35 +++++ .../ActionUnsupportedProperty.TD.json | 33 +++++ .../ContextDtvWrongPrefix.TD.json | 32 +++++ .../ContextDtvWrongUri.TD.json | 32 +++++ .../ContextMissingDtv.TD.json | 29 ++++ .../EventBooleanConst.TD.json | 36 +++++ .../EventFormAdditionalResponses.TD.json | 52 +++++++ .../EventFormContentTypeText.TD.json | 35 +++++ .../EventFormHeaderCode.TD.json | 45 ++++++ .../EventFormHeaderInfo.TD.json | 52 +++++++ .../EventFormOpSubDuplicate.TD.json | 35 +++++ .../EventFormServiceGroupEmpty.TD.json | 36 +++++ .../EventFormTopicNoContentType.TD.json | 34 +++++ .../EventFormTopicTokenAction.TD.json | 35 +++++ .../EventFormTopicTokenConsumerId.TD.json | 35 +++++ .../EventFormTopicTokenExecutorId.TD.json | 35 +++++ .../EventFormTopicTokenInvokerId.TD.json | 35 +++++ .../EventFormTopicTokenMaintainerId.TD.json | 35 +++++ .../EventFormUnsupportedProperty.TD.json | 36 +++++ .../EventFormsOpSubDuplicate.TD.json | 41 ++++++ .../EventFormsOplessAndSub.TD.json | 40 ++++++ .../EventFormsOplessDuplicate.TD.json | 39 ++++++ .../EventIntegerConst.TD.json | 36 +++++ ...oFormsWithTopicAndNoRootFormSubAll.TD.json | 32 +++++ .../EventNullAndContentTypeJson.TD.json | 35 +++++ .../EventNumberConst.TD.json | 36 +++++ .../EventObjectAndContentTypeCustom.TD.json | 40 ++++++ .../EventObjectAndContentTypeRaw.TD.json | 40 ++++++ .../EventObjectConst.TD.json | 43 ++++++ .../EventObjectErrorMessage.TD.json | 41 ++++++ .../EventStringConst.TD.json | 36 +++++ .../EventUnsupportedProperty.TD.json | 36 +++++ .../invalidAioBinding/IdEmpty.TD.json | 32 +++++ .../IdInvalidCharacters.TD.json | 32 +++++ ...dInvalidReplacementForTokenInTopic.TD.json | 32 +++++ .../invalidAioBinding/LinkEmptyHref.TD.json | 39 ++++++ .../invalidAioBinding/LinkEmptyType.TD.json | 39 ++++++ .../invalidAioBinding/LinkNoHref.TD.json | 38 ++++++ .../invalidAioBinding/LinkNoType.TD.json | 38 ++++++ .../invalidAioBinding/LinkNonJsonFile.TD.json | 39 ++++++ .../LinkNonexistentFile.TD.json | 39 ++++++ .../invalidAioBinding/LinkTypeNotJson.TD.json | 39 ++++++ .../LinkUnsupportedProperty.TD.json | 40 ++++++ .../invalidAioBinding/MultipleLinks.TD.json | 44 ++++++ .../invalidAioBinding/NoId.TD.json | 31 +++++ .../PropertyBooleanConst.TD.json | 34 +++++ ...AdditionalResponseContentTypeEmpty.TD.json | 57 ++++++++ ...mAdditionalResponseContentTypeText.TD.json | 50 +++++++ ...ResponseNoMatchingSchemaDefinition.TD.json | 49 +++++++ ...ertyFormAdditionalResponseNoSchema.TD.json | 56 ++++++++ ...itionalResponseNoSchemaDefinitions.TD.json | 39 ++++++ ...rtyFormAdditionalResponseNoSuccess.TD.json | 56 ++++++++ ...itionalResponseSchemaDefinitionMap.TD.json | 54 ++++++++ ...lResponseSchemaDefinitionNotObject.TD.json | 56 ++++++++ ...yFormAdditionalResponseSchemaEmpty.TD.json | 57 ++++++++ ...yFormAdditionalResponseSuccessTrue.TD.json | 57 ++++++++ ...itionalResponseUnsupportedProperty.TD.json | 58 ++++++++ ...rtyFormAdditionalResponsesMultiple.TD.json | 61 +++++++++ .../PropertyFormContentTypeText.TD.json | 33 +++++ .../PropertyFormHeaderCode.TD.json | 43 ++++++ .../PropertyFormHeaderInfo.TD.json | 50 +++++++ .../PropertyFormOpReadDuplicate.TD.json | 33 +++++ .../PropertyFormOpWriteDuplicate.TD.json | 33 +++++ ...mReadAllWithoutAdditionalResponses.TD.json | 55 ++++++++ ...ssWithoutTopicAndNoRootFormReadAll.TD.json | 31 +++++ ...mReadAllWithoutAdditionalResponses.TD.json | 56 ++++++++ ...adWithoutTopicAndNoRootFormReadAll.TD.json | 32 +++++ ...icWriteWithTopicAndRootFormReadAll.TD.json | 46 +++++++ .../PropertyFormServiceGroup.TD.json | 34 +++++ .../PropertyFormTopicNoContentType.TD.json | 32 +++++ .../PropertyFormTopicTokenExecutorId.TD.json | 33 +++++ .../PropertyFormTopicTokenInvokerId.TD.json | 33 +++++ ...TokenNoActionWhenNoOpAndNoReadOnly.TD.json | 32 +++++ ...enNoActionWhenNoOpAndReadOnlyFalse.TD.json | 33 +++++ ...TopicTokenNoActionWhenReadAndWrite.TD.json | 33 +++++ .../PropertyFormTopicTokenSenderId.TD.json | 33 +++++ .../PropertyFormUnsupportedProperty.TD.json | 34 +++++ ...iteMultiWithoutAdditionalResponses.TD.json | 78 +++++++++++ ...ithoutTopicAndNoRootFormWriteMulti.TD.json | 38 ++++++ .../PropertyFormsOpReadDuplicate.TD.json | 39 ++++++ .../PropertyFormsOpWriteDuplicate.TD.json | 39 ++++++ .../PropertyFormsOpWriteNoRead.TD.json | 33 +++++ .../PropertyFormsOplessAndRead.TD.json | 38 ++++++ .../PropertyFormsOplessDuplicate.TD.json | 37 +++++ .../PropertyIntegerConst.TD.json | 34 +++++ .../PropertyNumberConst.TD.json | 34 +++++ .../PropertyObjectConst.TD.json | 41 ++++++ .../PropertyObjectErrorMessage.TD.json | 39 ++++++ .../PropertyStringConst.TD.json | 34 +++++ .../PropertyTypeNull.TD.json | 33 +++++ .../PropertyUnsupportedProperty.TD.json | 34 +++++ ...AdditionalResponseContentTypeEmpty.TD.json | 64 +++++++++ ...mAdditionalResponseContentTypeText.TD.json | 64 +++++++++ ...ootFormAdditionalResponseNoSuccess.TD.json | 63 +++++++++ .../RootFormAdditionalResponseSchema.TD.json | 70 ++++++++++ ...tFormAdditionalResponseSuccessTrue.TD.json | 64 +++++++++ ...itionalResponseUnsupportedProperty.TD.json | 65 +++++++++ ...otFormAdditionalResponsesAndSubAll.TD.json | 63 +++++++++ ...ootFormAdditionalResponsesMultiple.TD.json | 68 +++++++++ .../RootFormContentTypeCustom.TD.json | 58 ++++++++ .../RootFormContentTypeRaw.TD.json | 58 ++++++++ .../RootFormContentTypeText.TD.json | 58 ++++++++ .../RootFormHeaderCode.TD.json | 68 +++++++++ .../RootFormHeaderInfo.TD.json | 73 ++++++++++ .../RootFormNoContentType.TD.json | 57 ++++++++ .../invalidAioBinding/RootFormNoTopic.TD.json | 57 ++++++++ .../RootFormOpReadAllAndSubAll.TD.json | 58 ++++++++ .../RootFormOpReadAllDuplicate.TD.json | 58 ++++++++ .../RootFormOpSubAllDuplicate.TD.json | 58 ++++++++ .../RootFormOpWiteMultiAndSubAll.TD.json | 58 ++++++++ .../RootFormOpWriteMultiDuplicate.TD.json | 58 ++++++++ .../RootFormReadAllButNoProperties.TD.json | 30 ++++ .../RootFormServiceGroupEmpty.TD.json | 59 ++++++++ .../RootFormServiceGroupNoSubAll.TD.json | 59 ++++++++ .../RootFormSubAllButNoEvents.TD.json | 30 ++++ .../RootFormTopicEmpty.TD.json | 58 ++++++++ .../RootFormTopicLevelEmpty.TD.json | 58 ++++++++ .../RootFormTopicLevelInvalid.TD.json | 58 ++++++++ .../RootFormTopicReservedStart.TD.json | 58 ++++++++ ...RootFormTopicTokenActionWhenSubAll.TD.json | 58 ++++++++ ...FormTopicTokenConsumerIdWhenSubAll.TD.json | 58 ++++++++ .../RootFormTopicTokenCustomEmpty.TD.json | 58 ++++++++ .../RootFormTopicTokenCustomInvalid.TD.json | 58 ++++++++ .../RootFormTopicTokenEmpty.TD.json | 58 ++++++++ .../RootFormTopicTokenExecutorId.TD.json | 58 ++++++++ .../RootFormTopicTokenInvokerId.TD.json | 58 ++++++++ ...rmTopicTokenMaintainerIdWhenSubAll.TD.json | 58 ++++++++ ...enNoActionWhenReadAllAndWriteMulti.TD.json | 58 ++++++++ ...tFormTopicTokenSenderIdWhenReadAll.TD.json | 58 ++++++++ ...rmTopicTokenSenderIdWhenWriteMulti.TD.json | 58 ++++++++ .../RootFormTopicTokenUnrecognized.TD.json | 58 ++++++++ ...mWriteMultiButNoWritableProperties.TD.json | 58 ++++++++ .../RootFormsOpReadAllDuplicate.TD.json | 64 +++++++++ .../RootFormsOpSubAllDuplicate.TD.json | 64 +++++++++ .../RootFormsOpWriteMultiDuplicate.TD.json | 64 +++++++++ .../RootFormsOpWriteMultiNoReadAll.TD.json | 58 ++++++++ .../SchemaDefinitionArrayConst.TD.json | 41 ++++++ .../SchemaDefinitionArrayItemsNoType.TD.json | 39 ++++++ ...emaDefinitionArrayItemsObjectConst.TD.json | 48 +++++++ .../SchemaDefinitionArrayItemsRef.TD.json | 40 ++++++ ...emaDefinitionArrayItemsStringConst.TD.json | 41 ++++++ ...SchemaDefinitionArrayItemsTypeNull.TD.json | 40 ++++++ .../SchemaDefinitionArrayNoItems.TD.json | 37 +++++ ...initionBooleanConstValueNotBoolean.TD.json | 38 ++++++ .../SchemaDefinitionBooleanReadOnly.TD.json | 38 ++++++ ...finitionBooleanUnsupportedProperty.TD.json | 38 ++++++ ...efinitionIntegerConstValueAboveMax.TD.json | 39 ++++++ ...efinitionIntegerConstValueBelowMin.TD.json | 39 ++++++ ...initionIntegerConstValueNotInteger.TD.json | 38 ++++++ ...initionIntegerConstValueNotNumeric.TD.json | 38 ++++++ ...hemaDefinitionIntegerMaxNotInteger.TD.json | 39 ++++++ ...SchemaDefinitionIntegerMinAboveMax.TD.json | 39 ++++++ ...hemaDefinitionIntegerMinNotInteger.TD.json | 39 ++++++ .../SchemaDefinitionIntegerReadOnly.TD.json | 38 ++++++ ...finitionIntegerUnsupportedProperty.TD.json | 38 ++++++ ...itionMapAdditionalPropertiesNoType.TD.json | 39 ++++++ ...MapAdditionalPropertiesObjectConst.TD.json | 48 +++++++ ...finitionMapAdditionalPropertiesRef.TD.json | 40 ++++++ ...MapAdditionalPropertiesStringConst.TD.json | 41 ++++++ ...ionMapAdditionalPropertiesTypeNull.TD.json | 40 ++++++ .../SchemaDefinitionMapConst.TD.json | 43 ++++++ .../SchemaDefinitionNoType.TD.json | 36 +++++ ...DefinitionNumberConstValueAboveMax.TD.json | 39 ++++++ ...DefinitionNumberConstValueBelowMin.TD.json | 39 ++++++ ...finitionNumberConstValueNotNumeric.TD.json | 38 ++++++ .../SchemaDefinitionNumberMinAboveMax.TD.json | 39 ++++++ .../SchemaDefinitionNumberReadOnly.TD.json | 38 ++++++ ...efinitionNumberUnsupportedProperty.TD.json | 38 ++++++ ...maDefinitionObjectBothDeterminants.TD.json | 45 ++++++ ...hemaDefinitionObjectConstNotObject.TD.json | 43 ++++++ ...ionObjectConstPropertyBooleanConst.TD.json | 46 +++++++ ...jectConstPropertyBooleanNotBoolean.TD.json | 45 ++++++ ...PropertyBooleanUnsupportedProperty.TD.json | 46 +++++++ ...ObjectConstPropertyIntegerAboveMax.TD.json | 46 +++++++ ...ObjectConstPropertyIntegerBelowMin.TD.json | 46 +++++++ ...ionObjectConstPropertyIntegerConst.TD.json | 46 +++++++ ...jectConstPropertyIntegerNotInteger.TD.json | 45 ++++++ ...jectConstPropertyIntegerNotNumeric.TD.json | 45 ++++++ ...PropertyIntegerUnsupportedProperty.TD.json | 46 +++++++ ...efinitionObjectConstPropertyNoType.TD.json | 44 ++++++ ...finitionObjectConstPropertyNoValue.TD.json | 44 ++++++ ...nObjectConstPropertyNumberAboveMax.TD.json | 46 +++++++ ...nObjectConstPropertyNumberBelowMin.TD.json | 46 +++++++ ...tionObjectConstPropertyNumberConst.TD.json | 46 +++++++ ...bjectConstPropertyNumberNotNumeric.TD.json | 45 ++++++ ...tPropertyNumberUnsupportedProperty.TD.json | 46 +++++++ ...tionObjectConstPropertyStringConst.TD.json | 46 +++++++ ...tPropertyStringUnsupportedProperty.TD.json | 46 +++++++ ...tConstPropertyStringValueNotString.TD.json | 45 ++++++ ...nitionObjectConstPropertyTypeArray.TD.json | 48 +++++++ ...initionObjectConstPropertyTypeNull.TD.json | 45 ++++++ ...itionObjectConstPropertyTypeObject.TD.json | 52 +++++++ ...tionObjectConstUnsupportedProperty.TD.json | 46 +++++++ ...DefinitionObjectConstValueNoSchema.TD.json | 42 ++++++ ...nitionObjectErrorMessageNoProperty.TD.json | 40 ++++++ ...initionObjectErrorMessageNotString.TD.json | 43 ++++++ ...bjectErrorMessagePropertyNotString.TD.json | 43 ++++++ ...chemaDefinitionObjectNoDeterminant.TD.json | 37 +++++ ...efinitionObjectPropertiesNotObject.TD.json | 38 ++++++ ...hemaDefinitionObjectPropertyNoType.TD.json | 41 ++++++ ...efinitionObjectPropertyObjectConst.TD.json | 50 +++++++ .../SchemaDefinitionObjectPropertyRef.TD.json | 42 ++++++ ...efinitionObjectPropertyStringConst.TD.json | 43 ++++++ ...maDefinitionObjectPropertyTypeNull.TD.json | 42 ++++++ ...DefinitionObjectRequiredNoProperty.TD.json | 40 ++++++ .../SchemaDefinitionRef.TD.json | 37 +++++ ...finitionStringConstContentEncoding.TD.json | 39 ++++++ .../SchemaDefinitionStringConstFormat.TD.json | 39 ++++++ ...SchemaDefinitionStringConstPattern.TD.json | 39 ++++++ ...tionStringConstUnsupportedProperty.TD.json | 39 ++++++ ...efinitionStringConstValueNotString.TD.json | 38 ++++++ ...ingContentEncodingUnsupportedValue.TD.json | 38 ++++++ .../SchemaDefinitionStringEnumConst.TD.json | 39 ++++++ ...efinitionStringEnumContentEncoding.TD.json | 39 ++++++ ...DefinitionStringEnumElementInvalid.TD.json | 38 ++++++ .../SchemaDefinitionStringEnumFormat.TD.json | 39 ++++++ .../SchemaDefinitionStringEnumPattern.TD.json | 39 ++++++ ...SchemaDefinitionStringEnumReadOnly.TD.json | 39 ++++++ ...itionStringEnumUnsupportedProperty.TD.json | 39 ++++++ ...tionStringFormatAndContentEncoding.TD.json | 39 ++++++ ...maDefinitionStringFormatAndPattern.TD.json | 39 ++++++ ...nitionStringFormatUnsupportedValue.TD.json | 38 ++++++ ...ionStringPatternAndContentEncoding.TD.json | 39 ++++++ ...nStringPatternNotDurationOrDecimal.TD.json | 38 ++++++ ...efinitionStringPatternRegexInvalid.TD.json | 38 ++++++ .../SchemaDefinitionStringReadOnly.TD.json | 38 ++++++ ...efinitionStringUnsupportedProperty.TD.json | 38 ++++++ .../SchemaDefinitionTypeNull.TD.json | 37 +++++ .../invalidAioBinding/TitleEmpty.TD.json | 32 +++++ .../invalidAioBinding/TitleInvalid.TD.json | 32 +++++ .../invalidJson/ArrayKey.TD.json | 32 +++++ .../invalidJson/BooleanKey.TD.json | 32 +++++ .../invalidJson/DuplicateKey.TD.json | 33 +++++ .../invalidJson/MissingColon.TD.json | 32 +++++ .../invalidJson/MissingComma.TD.json | 32 +++++ .../invalidJson/MissingElement.TD.json | 32 +++++ .../invalidJson/MissingKey.TD.json | 32 +++++ .../invalidJson/MissingValue.TD.json | 32 +++++ .../invalidJson/NumericKey.TD.json | 32 +++++ .../invalidJson/ObjectKey.TD.json | 32 +++++ .../invalidJson/TrailingComma.TD.json | 32 +++++ .../invalidJson/UnclosedArray.TD.json | 31 +++++ .../invalidJson/UnclosedObject.TD.json | 31 +++++ .../invalidThing/ActionFormOpRead.TD.json | 32 +++++ .../invalidThing/ActionFormOpSub.TD.json | 32 +++++ .../invalidThing/ActionFormOpWrite.TD.json | 32 +++++ .../invalidThing/ActionFormsEmpty.TD.json | 26 ++++ .../invalidThing/ActionNoForms.TD.json | 24 ++++ .../invalidThing/ContextMissingWot.TD.json | 31 +++++ .../invalidThing/ContextWrongType.TD.json | 29 ++++ .../invalidThing/EventFormOpInvoke.TD.json | 35 +++++ .../invalidThing/EventFormOpRead.TD.json | 35 +++++ .../invalidThing/EventFormOpSubAll.TD.json | 35 +++++ .../invalidThing/EventFormOpWrite.TD.json | 35 +++++ .../invalidThing/EventFormsEmpty.TD.json | 29 ++++ .../invalidThing/EventNoForms.TD.json | 27 ++++ .../invalidThing/IdNotString.TD.json | 32 +++++ .../invalidThing/NoContext.TD.json | 28 ++++ .../invalidThing/NoTitle.TD.json | 31 +++++ .../invalidThing/PropertyFormOpInvoke.TD.json | 33 +++++ .../PropertyFormOpReadAll.TD.json | 33 +++++ .../invalidThing/PropertyFormOpSub.TD.json | 33 +++++ .../PropertyFormOpWriteMulti.TD.json | 33 +++++ .../invalidThing/PropertyFormsEmpty.TD.json | 27 ++++ .../invalidThing/PropertyNoForms.TD.json | 25 ++++ .../invalidThing/RootFormEmptyHref.TD.json | 58 ++++++++ .../invalidThing/RootFormNoHref.TD.json | 57 ++++++++ .../invalidThing/RootFormNoOp.TD.json | 57 ++++++++ .../invalidThing/RootFormOpArrayEmpty.TD.json | 58 ++++++++ .../RootFormOpElementEmpty.TD.json | 58 ++++++++ .../invalidThing/RootFormOpEmpty.TD.json | 58 ++++++++ .../invalidThing/RootFormOpReadOne.TD.json | 58 ++++++++ .../invalidThing/RootFormOpSubOne.TD.json | 58 ++++++++ .../invalidThing/RootFormOpWriteOne.TD.json | 58 ++++++++ .../invalidThing/RootFormsEmpty.TD.json | 52 +++++++ ...chemaDefinitionArrayItemsNotObject.TD.json | 38 ++++++ ...aDefinitionArrayItemsTypeNotString.TD.json | 40 ++++++ ...efinitionArrayItemsTypeUnsupported.TD.json | 40 ++++++ ...hemaDefinitionIntegerMaxNotNumeric.TD.json | 38 ++++++ ...hemaDefinitionIntegerMinNotNumeric.TD.json | 38 ++++++ ...onMapAdditionalPropertiesNotObject.TD.json | 38 ++++++ ...pAdditionalPropertiesTypeNotString.TD.json | 40 ++++++ ...dditionalPropertiesTypeUnsupported.TD.json | 40 ++++++ ...chemaDefinitionNumberMaxNotNumeric.TD.json | 38 ++++++ ...chemaDefinitionNumberMinNotNumeric.TD.json | 38 ++++++ ...ObjectConstPropertyTypeUnsupported.TD.json | 45 ++++++ ...initionObjectPropertyTypeNotString.TD.json | 42 ++++++ ...itionObjectPropertyTypeUnsupported.TD.json | 42 ++++++ ...aDefinitionObjectRequiredNotString.TD.json | 43 ++++++ ...tionStringContentEncodingNotString.TD.json | 38 ++++++ ...emaDefinitionStringFormatNotString.TD.json | 38 ++++++ ...maDefinitionStringPatternNotString.TD.json | 38 ++++++ .../SchemaDefinitionTypeNotString.TD.json | 37 +++++ .../SchemaDefinitionTypeUnsupported.TD.json | 37 +++++ .../invalidThing/TitleNotString.TD.json | 32 +++++ .../IdInvalidReplacementButNotInTopic.TD.json | 32 +++++ .../valid/LinkNoRel.TD.json | 38 ++++++ .../valid/LinkOtherRel.TD.json | 39 ++++++ .../thing-descriptions/valid/Noop.TD.json | 32 +++++ ...eadablePropertyAdditionalResponses.TD.json | 68 +++++++++ ...ritablePropertyAdditionalResponses.TD.json | 74 ++++++++++ 729 files changed, 21384 insertions(+), 109 deletions(-) create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/.gitignore create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/json-schemas/AnObjectSchema.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/name-rules/DefaultSchemaNames.json delete mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/sandbox/SampleTest/SetColorInputArguments.schema.json delete mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/sandbox/SampleTest/SetColorOutputArguments.schema.json rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/{failure => }/SampleTest.json (90%) create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeEmpty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeText.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoMatchingSchemaDefinition.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchema.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchemaDefinitions.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSuccess.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionMap.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionNotObject.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaEmpty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSuccessTrue.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseUnsupportedProperty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponsesMultiple.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormContentTypeText.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeEmpty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoMatchingSchemaDefinition.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoSchemaDefinitions.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeSchemaDefinitionNotEnum.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeEmpty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeNotJson.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoContentType.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoMatchingSchemaDefinition.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchema.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchemaDefinitions.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionMap.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionNotObject.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaEmpty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSuccessTrue.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoUnsupportedProperty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfosMultiple.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpInvokeDuplicate.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpRead.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpSub.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpWrite.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormServiceGroupEmpty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicNoContentType.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenAction.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenConsumerId.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenMaintainerId.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenSenderId.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormUnsupportedProperty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsEmpty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsMultipleContentTypes.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOpInvokeDuplicate.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessAndInvoke.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessDuplicate.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputMap.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNullAndContentTypeJson.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNumber.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeCustom.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeRaw.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectConst.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectErrorMessage.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputString.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoForms.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoFormsWithTopic.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputMap.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNullAndContentTypeJson.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNumber.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeCustom.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeRaw.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectConst.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectErrorMessage.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputString.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionUnsupportedProperty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ArrayKey.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/BooleanKey.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextDtvWrongPrefix.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextDtvWrongUri.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextMissingDtv.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextMissingWot.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextWrongType.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/DuplicateKey.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventBooleanConst.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormAdditionalResponses.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormContentTypeText.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderCode.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderInfo.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpInvoke.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpRead.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubAll.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubDuplicate.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpWrite.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormServiceGroupEmpty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicNoContentType.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenAction.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenConsumerId.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenExecutorId.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenInvokerId.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenMaintainerId.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormUnsupportedProperty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsEmpty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOpSubDuplicate.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessAndSub.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessDuplicate.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventIntegerConst.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoForms.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoFormsWithTopicAndNoRootFormSubAll.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNullAndContentTypeJson.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNumberConst.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeCustom.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeRaw.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectConst.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectErrorMessage.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventStringConst.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventUnsupportedProperty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdEmpty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdInvalidCharacters.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdInvalidReplacementForTokenInTopic.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdNotString.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkEmptyHref.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkEmptyType.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNoHref.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNoType.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNonJsonFile.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNonexistentFile.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkTypeNotJson.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkUnsupportedProperty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingColon.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingComma.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingElement.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingKey.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingValue.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MultipleLinks.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoClientOrServer.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoContext.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoId.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoThingOrSchema.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoTitle.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NonexistentThing.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NumericKey.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ObjectKey.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyBooleanConst.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeEmpty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeText.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchema.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchemaDefinitions.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSuccess.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionMap.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionNotObject.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaEmpty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSuccessTrue.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseUnsupportedProperty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponsesMultiple.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormContentTypeText.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderCode.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderInfo.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpInvoke.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadAll.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadDuplicate.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpSub.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteDuplicate.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteMulti.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicAndNoRootFormReadAll.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormServiceGroup.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicNoContentType.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenExecutorId.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenInvokerId.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenReadAndWrite.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenSenderId.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormUnsupportedProperty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsEmpty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpReadDuplicate.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteDuplicate.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteNoRead.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessAndRead.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessDuplicate.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyIntegerConst.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNoForms.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNumberConst.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyObjectConst.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyObjectErrorMessage.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyStringConst.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyTypeNull.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyUnsupportedProperty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeEmpty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeText.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseNoSuccess.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSchema.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSuccessTrue.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseUnsupportedProperty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesAndSubAll.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesMultiple.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeCustom.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeRaw.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeText.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormEmptyHref.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderCode.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderInfo.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoContentType.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoHref.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoOp.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoTopic.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpArrayEmpty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpElementEmpty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpEmpty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllAndSubAll.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllDuplicate.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadOne.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubAllDuplicate.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubOne.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWiteMultiAndSubAll.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteMultiDuplicate.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteOne.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormReadAllButNoProperties.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupEmpty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupNoSubAll.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormSubAllButNoEvents.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicEmpty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelEmpty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelInvalid.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicReservedStart.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenActionWhenSubAll.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenConsumerIdWhenSubAll.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomEmpty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomInvalid.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenEmpty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenExecutorId.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenInvokerId.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenMaintainerIdWhenSubAll.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenReadAll.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenWriteMulti.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenUnrecognized.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormWriteMultiButNoWritableProperties.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsEmpty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpReadAllDuplicate.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpSubAllDuplicate.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiDuplicate.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiNoReadAll.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayConst.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsNoType.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsNotObject.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsObjectConst.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsRef.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsStringConst.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeNotString.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeNull.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeUnsupported.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayNoItems.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanConstValueNotBoolean.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanReadOnly.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanUnsupportedProperty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueAboveMax.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueBelowMin.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueNotInteger.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueNotNumeric.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMaxNotInteger.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMaxNotNumeric.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinAboveMax.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinNotInteger.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinNotNumeric.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerReadOnly.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerUnsupportedProperty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNoType.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNotObject.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesObjectConst.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesRef.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesStringConst.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNotString.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNull.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapConst.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNoType.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueAboveMax.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueBelowMin.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueNotNumeric.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMaxNotNumeric.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMinAboveMax.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMinNotNumeric.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberReadOnly.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberUnsupportedProperty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectBothDeterminants.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstNotObject.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanConst.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerAboveMax.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerBelowMin.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerConst.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotInteger.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNoType.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNoValue.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberAboveMax.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberBelowMin.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberConst.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberNotNumeric.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringConst.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringValueNotString.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeArray.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeNull.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeObject.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeUnsupported.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstUnsupportedProperty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstValueNoSchema.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessageNoProperty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessageNotString.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessagePropertyNotString.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectNoDeterminant.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertiesNotObject.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyNoType.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyObjectConst.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyRef.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyStringConst.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeNotString.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeNull.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeUnsupported.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectRequiredNoProperty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectRequiredNotString.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionRef.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstContentEncoding.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstFormat.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstPattern.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstUnsupportedProperty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstValueNotString.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringContentEncodingNotString.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringContentEncodingUnsupportedValue.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumConst.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumContentEncoding.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumElementInvalid.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumFormat.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumPattern.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumReadOnly.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumUnsupportedProperty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatAndContentEncoding.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatAndPattern.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatNotString.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatUnsupportedValue.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternAndContentEncoding.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternNotDurationOrDecimal.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternNotString.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternRegexInvalid.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringReadOnly.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringUnsupportedProperty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeNotString.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeNull.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeUnsupported.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleEmpty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleInvalid.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleNotString.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TrailingComma.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedArray.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedObject.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnsupportedLanguage.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/IdInvalidReplacementButNotInTopic.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/LinkNoRel.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/LinkOtherRel.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/.vscode/settings.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeEmpty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeText.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoMatchingSchemaDefinition.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchema.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchemaDefinitions.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSuccess.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionMap.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionNotObject.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaEmpty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSuccessTrue.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseUnsupportedProperty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponsesMultiple.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormContentTypeText.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeEmpty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoMatchingSchemaDefinition.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoSchemaDefinitions.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeSchemaDefinitionNotEnum.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeEmpty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeNotJson.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoContentType.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoMatchingSchemaDefinition.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchema.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchemaDefinitions.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionMap.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionNotObject.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaEmpty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSuccessTrue.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoUnsupportedProperty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfosMultiple.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormOpInvokeDuplicate.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormServiceGroupEmpty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicNoContentType.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenAction.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenConsumerId.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenMaintainerId.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenSenderId.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormUnsupportedProperty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsMultipleContentTypes.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOpInvokeDuplicate.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessAndInvoke.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessDuplicate.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputMap.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNullAndContentTypeJson.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNumber.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeCustom.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeRaw.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectConst.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectErrorMessage.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputString.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionNoFormsWithTopic.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputMap.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNullAndContentTypeJson.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNumber.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeCustom.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeRaw.TD.json rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/{invalid/OneAction.TD.json => invalidAioBinding/ActionOutputObjectConst.TD.json} (54%) create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectErrorMessage.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputString.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionUnsupportedProperty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongPrefix.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongUri.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextMissingDtv.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventBooleanConst.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormAdditionalResponses.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormContentTypeText.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderCode.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderInfo.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormOpSubDuplicate.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormServiceGroupEmpty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicNoContentType.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenAction.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenConsumerId.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenExecutorId.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenInvokerId.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenMaintainerId.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormUnsupportedProperty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOpSubDuplicate.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessAndSub.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessDuplicate.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventIntegerConst.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNoFormsWithTopicAndNoRootFormSubAll.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNullAndContentTypeJson.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNumberConst.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeCustom.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeRaw.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectConst.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectErrorMessage.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventStringConst.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventUnsupportedProperty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/IdEmpty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/IdInvalidCharacters.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/IdInvalidReplacementForTokenInTopic.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyHref.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyType.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoHref.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoType.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonJsonFile.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonexistentFile.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkTypeNotJson.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkUnsupportedProperty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/MultipleLinks.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/NoId.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyBooleanConst.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeEmpty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeText.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchema.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchemaDefinitions.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSuccess.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionMap.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionNotObject.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaEmpty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSuccessTrue.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseUnsupportedProperty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponsesMultiple.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormContentTypeText.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderCode.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderInfo.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpReadDuplicate.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpWriteDuplicate.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicAndNoRootFormReadAll.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormServiceGroup.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicNoContentType.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenExecutorId.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenInvokerId.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenReadAndWrite.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenSenderId.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormUnsupportedProperty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpReadDuplicate.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteDuplicate.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteNoRead.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessAndRead.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessDuplicate.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyIntegerConst.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyNumberConst.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectConst.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectErrorMessage.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyStringConst.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyTypeNull.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyUnsupportedProperty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeEmpty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeText.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseNoSuccess.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSchema.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSuccessTrue.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseUnsupportedProperty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesAndSubAll.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesMultiple.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeCustom.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeRaw.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeText.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderCode.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderInfo.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoContentType.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoTopic.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllAndSubAll.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllDuplicate.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpSubAllDuplicate.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWiteMultiAndSubAll.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWriteMultiDuplicate.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormReadAllButNoProperties.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupEmpty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupNoSubAll.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormSubAllButNoEvents.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicEmpty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelEmpty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelInvalid.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicReservedStart.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenActionWhenSubAll.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenConsumerIdWhenSubAll.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomEmpty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomInvalid.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenEmpty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenExecutorId.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenInvokerId.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenMaintainerIdWhenSubAll.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenReadAll.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenWriteMulti.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenUnrecognized.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormWriteMultiButNoWritableProperties.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpReadAllDuplicate.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpSubAllDuplicate.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiDuplicate.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiNoReadAll.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayConst.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsNoType.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsObjectConst.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsRef.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsStringConst.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsTypeNull.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayNoItems.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanConstValueNotBoolean.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanReadOnly.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanUnsupportedProperty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueAboveMax.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueBelowMin.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotInteger.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotNumeric.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMaxNotInteger.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinAboveMax.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinNotInteger.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerReadOnly.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerUnsupportedProperty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesNoType.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesObjectConst.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesStringConst.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesTypeNull.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapConst.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNoType.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueAboveMax.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueBelowMin.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueNotNumeric.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberMinAboveMax.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberReadOnly.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberUnsupportedProperty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectBothDeterminants.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstNotObject.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanConst.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerAboveMax.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerBelowMin.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerConst.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotInteger.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoType.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoValue.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberAboveMax.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberBelowMin.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberConst.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberNotNumeric.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringConst.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringValueNotString.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeArray.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeNull.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeObject.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstUnsupportedProperty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstValueNoSchema.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNoProperty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNotString.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessagePropertyNotString.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectNoDeterminant.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertiesNotObject.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyNoType.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyObjectConst.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyRef.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyStringConst.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyTypeNull.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectRequiredNoProperty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionRef.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstContentEncoding.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstFormat.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstPattern.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstUnsupportedProperty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstValueNotString.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringContentEncodingUnsupportedValue.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumConst.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumContentEncoding.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumElementInvalid.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumFormat.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumPattern.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumReadOnly.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumUnsupportedProperty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndContentEncoding.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndPattern.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatUnsupportedValue.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternAndContentEncoding.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternNotDurationOrDecimal.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternRegexInvalid.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringReadOnly.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringUnsupportedProperty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionTypeNull.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleEmpty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleInvalid.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ArrayKey.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/BooleanKey.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/DuplicateKey.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingColon.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingComma.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingElement.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingKey.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingValue.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/NumericKey.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ObjectKey.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/TrailingComma.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedArray.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedObject.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpRead.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpSub.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpWrite.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormsEmpty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionNoForms.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextMissingWot.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextWrongType.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpInvoke.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpRead.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpSubAll.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpWrite.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormsEmpty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventNoForms.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/IdNotString.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoContext.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoTitle.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpInvoke.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpReadAll.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpSub.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpWriteMulti.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormsEmpty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyNoForms.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormEmptyHref.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormNoHref.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormNoOp.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpArrayEmpty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpElementEmpty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpEmpty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpReadOne.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpSubOne.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpWriteOne.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormsEmpty.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsNotObject.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeNotString.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeUnsupported.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMaxNotNumeric.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMinNotNumeric.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesNotObject.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeNotString.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMaxNotNumeric.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMinNotNumeric.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectConstPropertyTypeUnsupported.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeNotString.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeUnsupported.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectRequiredNotString.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringContentEncodingNotString.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringFormatNotString.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringPatternNotString.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeNotString.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeUnsupported.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TitleNotString.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/IdInvalidReplacementButNotInTopic.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkNoRel.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkOtherRel.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/Noop.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TD.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TD.json diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/MqttTopicTokens.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/MqttTopicTokens.cs index 0b553837c4..1f557d8026 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/MqttTopicTokens.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/MqttTopicTokens.cs @@ -5,6 +5,11 @@ /// public static class MqttTopicTokens { + /// + /// Prefix for a custom token. + /// + public const string PrefixCustom = "ex:"; + /// /// Token representing the ID of a service. /// diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs index b4bd54b093..31ec4706ba 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs @@ -56,22 +56,22 @@ public bool TryValidateThng(TDThing thing, HashSet serializ ValueTracker? modelIdTopic = null; - if (!TryValidateRootForms(thing.Forms, thing.SchemaDefinitions, thing.Id!, serializationFormats, ref modelIdTopic)) + if (!TryValidateRootForms(thing.Forms, thing.SchemaDefinitions, thing.Id, serializationFormats, ref modelIdTopic)) { hasError = true; } - if (!TryValidateActions(thing.Actions, thing.SchemaDefinitions, thing.Id!, serializationFormats, ref modelIdTopic)) + if (!TryValidateActions(thing.Actions, thing.SchemaDefinitions, thing.Id, serializationFormats, ref modelIdTopic)) { hasError = true; } - if (!TryValidateProperties(thing.Properties, thing.SchemaDefinitions, thing.Id!, serializationFormats, ref modelIdTopic)) + if (!TryValidateProperties(thing.Properties, thing.SchemaDefinitions, thing.Id, serializationFormats, ref modelIdTopic)) { hasError = true; } - if (!TryValidateEvents(thing.Events, thing.SchemaDefinitions, thing.Id!, serializationFormats, ref modelIdTopic)) + if (!TryValidateEvents(thing.Events, thing.SchemaDefinitions, thing.Id, serializationFormats, ref modelIdTopic)) { hasError = true; } @@ -173,7 +173,7 @@ private void CheckSchemaDefinitionsCoverage(MapTracker? schemaDefi } } - private bool TryValidateRootForms(ArrayTracker? forms, MapTracker? schemaDefinitions, ValueTracker id, HashSet serializationFormats, ref ValueTracker? modelIdTopic) + private bool TryValidateRootForms(ArrayTracker? forms, MapTracker? schemaDefinitions, ValueTracker? id, HashSet serializationFormats, ref ValueTracker? modelIdTopic) { if (forms?.Elements == null) { @@ -594,7 +594,7 @@ private bool TryValidateSchemaDefinitions(MapTracker? schemaDefini return !hasError; } - private bool TryValidateActions(MapTracker? actions, MapTracker? schemaDefinitions, ValueTracker id, HashSet serializationFormats, ref ValueTracker? modelIdTopic) + private bool TryValidateActions(MapTracker? actions, MapTracker? schemaDefinitions, ValueTracker? id, HashSet serializationFormats, ref ValueTracker? modelIdTopic) { if (actions?.Entries == null) { @@ -618,7 +618,7 @@ private bool TryValidateActions(MapTracker? actions, MapTracker action, MapTracker? schemaDefinitions, ValueTracker id, out ValueTracker? contentType, ref ValueTracker? modelIdTopic) + private bool TryValidateAction(string name, ValueTracker action, MapTracker? schemaDefinitions, ValueTracker? id, out ValueTracker? contentType, ref ValueTracker? modelIdTopic) { if (action.Value.Forms == null) { @@ -677,7 +677,7 @@ private bool TryValidateActionDataSchema(ValueTracker dataSchema, string p return TryValidateDataSchema(dataSchema, null, DataSchemaKind.Action, contentType); } - private bool TryValidateProperties(MapTracker? properties, MapTracker? schemaDefinitions, ValueTracker id, HashSet serializationFormats, ref ValueTracker? modelIdTopic) + private bool TryValidateProperties(MapTracker? properties, MapTracker? schemaDefinitions, ValueTracker? id, HashSet serializationFormats, ref ValueTracker? modelIdTopic) { if (properties?.Entries == null) { @@ -701,7 +701,7 @@ private bool TryValidateProperties(MapTracker? properties, MapTracke return !hasError; } - private bool TryValidateProperty(string name, ValueTracker property, MapTracker? schemaDefinitions, ValueTracker id, out ValueTracker? contentType, ref ValueTracker? modelIdTopic) + private bool TryValidateProperty(string name, ValueTracker property, MapTracker? schemaDefinitions, ValueTracker? id, out ValueTracker? contentType, ref ValueTracker? modelIdTopic) { if (property.Value.Forms == null) { @@ -722,7 +722,7 @@ private bool TryValidateProperty(string name, ValueTracker property, return true; } - private bool TryValidatePropertyForms(string name, ArrayTracker forms, MapTracker? schemaDefinitions, ValueTracker id, ValueTracker? readOnly, out ValueTracker? contentType, ref ValueTracker? modelIdTopic) + private bool TryValidatePropertyForms(string name, ArrayTracker forms, MapTracker? schemaDefinitions, ValueTracker? id, ValueTracker? readOnly, out ValueTracker? contentType, ref ValueTracker? modelIdTopic) { bool isReadOnly = readOnly?.Value.Value == true; @@ -776,7 +776,7 @@ private bool TryValidatePropertyForms(string name, ArrayTracker forms, M return !hasError; } - private bool TryValidateEvents(MapTracker? evts, MapTracker? schemaDefinitions, ValueTracker id, HashSet serializationFormats, ref ValueTracker? modelIdTopic) + private bool TryValidateEvents(MapTracker? evts, MapTracker? schemaDefinitions, ValueTracker? id, HashSet serializationFormats, ref ValueTracker? modelIdTopic) { if (evts?.Entries == null) { @@ -800,7 +800,7 @@ private bool TryValidateEvents(MapTracker? evts, MapTracker evt, MapTracker? schemaDefinitions, ValueTracker id, out ValueTracker? contentType, ref ValueTracker? modelIdTopic) + private bool TryValidateEvent(string name, ValueTracker evt, MapTracker? schemaDefinitions, ValueTracker? id, out ValueTracker? contentType, ref ValueTracker? modelIdTopic) { if (evt.Value.Forms == null) { @@ -839,7 +839,7 @@ private bool TryValidateEvent(string name, ValueTracker evt, MapTracker return !hasError; } - private bool TryValidateForms(ArrayTracker forms, FormsKind formsKind, MapTracker? schemaDefinitions, ValueTracker id, out ValueTracker? contentType, ref ValueTracker? modelIdTopic, bool isReadOnly = false) + private bool TryValidateForms(ArrayTracker forms, FormsKind formsKind, MapTracker? schemaDefinitions, ValueTracker? id, out ValueTracker? contentType, ref ValueTracker? modelIdTopic, bool isReadOnly = false) { contentType = null; @@ -897,7 +897,7 @@ private bool TryValidateForms(ArrayTracker forms, FormsKind formsKind, M return !hasError; } - private bool TryValidateForm(ValueTracker form, FormsKind formsKind, MapTracker? schemaDefinitions, ValueTracker id, out ValueTracker? contentType, ref ValueTracker? modelIdTopic, bool isReadOnly) + private bool TryValidateForm(ValueTracker form, FormsKind formsKind, MapTracker? schemaDefinitions, ValueTracker? id, out ValueTracker? contentType, ref ValueTracker? modelIdTopic, bool isReadOnly) { bool hasError = false; @@ -1014,6 +1014,12 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map } } + if (hasError) + { + contentType = null; + return false; + } + bool hasOpRead = form.Value.Op?.Elements?.Any(op => op.Value.Value == TDValues.OpReadProp || op.Value.Value == TDValues.OpReadAllProps) ?? false; bool hasOpWrite = form.Value.Op?.Elements?.Any(op => op.Value.Value == TDValues.OpWriteProp || op.Value.Value == TDValues.OpWriteMultProps) ?? false; bool hasOpSub = form.Value.Op?.Elements?.Any(op => op.Value.Value == TDValues.OpSubEvent || op.Value.Value == TDValues.OpSubAllEvents) ?? false; @@ -1143,7 +1149,7 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map return !hasError; } - private bool TryValidateTopic(ValueTracker topic, FormsKind formsKind, ValueTracker id, bool hasOpRead, bool hasOpWrite, bool hasOpSub, ref ValueTracker? modelIdTopic, bool isReadOnly) + private bool TryValidateTopic(ValueTracker topic, FormsKind formsKind, ValueTracker? id, bool hasOpRead, bool hasOpWrite, bool hasOpSub, ref ValueTracker? modelIdTopic, bool isReadOnly) { FormsKind effectiveFormsKind = formsKind switch { @@ -1185,17 +1191,17 @@ private bool TryValidateTopic(ValueTracker topic, FormsKind formsK errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Form '{TDForm.TopicName}' property has value containing empty token '{{}}'.", topic.TokenIndex); hasError = true; } - else if (token.StartsWith("ex:")) + else if (token.StartsWith($"{MqttTopicTokens.PrefixCustom}")) { string exToken = token[3..]; if (exToken.Length == 0) { - errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Form '{TDForm.TopicName}' property has value containing empty custom token '{{ex:}}'.", topic.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Form '{TDForm.TopicName}' property has value containing empty custom token '{{{MqttTopicTokens.PrefixCustom}}}'.", topic.TokenIndex); hasError = true; } else if (!exToken.All(c => char.IsAsciiLetter(c))) { - errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Form '{TDForm.TopicName}' property has value containing custom token '{{{token}}}' that contains invalid character(s); only ASCII letters are allowed after the 'ex:' prefix.", topic.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Form '{TDForm.TopicName}' property has value containing custom token '{{{token}}}' that contains invalid character(s); only ASCII letters are allowed after the '{MqttTopicTokens.PrefixCustom}' prefix.", topic.TokenIndex); hasError = true; } } @@ -1215,7 +1221,7 @@ private bool TryValidateTopic(ValueTracker topic, FormsKind formsK case FormsKind.Action: if (token != MqttTopicTokens.ActionInvokerId && token != MqttTopicTokens.ActionExecutorId) { - errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Form '{TDForm.TopicName}' property has value containing token '{{{token}}}' that does not start with 'ex:' and that is not valid in an action topic; only '{{{MqttTopicTokens.ModelId}}}', '{{{MqttTopicTokens.ActionInvokerId}}}', and '{{{MqttTopicTokens.ActionExecutorId}}}' are allowed.", topic.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Form '{TDForm.TopicName}' property has value containing token '{{{token}}}' that is not valid in an action topic; only '{{{MqttTopicTokens.ModelId}}}', '{{{MqttTopicTokens.ActionInvokerId}}}', and '{{{MqttTopicTokens.ActionExecutorId}}}' are allowed unless token starts with '{MqttTopicTokens.PrefixCustom}'.", topic.TokenIndex); hasError = true; } break; @@ -1226,14 +1232,14 @@ private bool TryValidateTopic(ValueTracker topic, FormsKind formsK } else if (token != MqttTopicTokens.PropertyConsumerId && token != MqttTopicTokens.PropertyMaintainerId) { - errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Form '{TDForm.TopicName}' property has value containing token '{{{token}}}' that does not start with 'ex:' and that is not valid in a property topic; only '{{{MqttTopicTokens.ModelId}}}', '{{{MqttTopicTokens.PropertyAction}}}', '{{{MqttTopicTokens.PropertyConsumerId}}}', and '{{{MqttTopicTokens.PropertyMaintainerId}}}' are allowed.", topic.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Form '{TDForm.TopicName}' property has value containing token '{{{token}}}' that is not valid in a property topic; only '{{{MqttTopicTokens.ModelId}}}', '{{{MqttTopicTokens.PropertyAction}}}', '{{{MqttTopicTokens.PropertyConsumerId}}}', and '{{{MqttTopicTokens.PropertyMaintainerId}}}' are allowed unless token starts with '{MqttTopicTokens.PrefixCustom}'.", topic.TokenIndex); hasError = true; } break; case FormsKind.Event: if (token != MqttTopicTokens.EventSenderId) { - errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Form '{TDForm.TopicName}' property has value containing token '{{{token}}}' that does not start with 'ex:' and that is not valid in an event topic; only '{{{MqttTopicTokens.ModelId}}}' and '{{{MqttTopicTokens.EventSenderId}}}' are allowed.", topic.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Form '{TDForm.TopicName}' property has value containing token '{{{token}}}' that is not valid in an event topic; only '{{{MqttTopicTokens.ModelId}}}' and '{{{MqttTopicTokens.EventSenderId}}}' are allowed unless token starts with '{MqttTopicTokens.PrefixCustom}'.", topic.TokenIndex); hasError = true; } break; @@ -1251,7 +1257,7 @@ private bool TryValidateTopic(ValueTracker topic, FormsKind formsK } } - string partiallyResolvedTopic = topic.Value.Value.Replace($"{{{MqttTopicTokens.ModelId}}}", id.Value.Value); + string partiallyResolvedTopic = id != null ? topic.Value.Value.Replace($"{{{MqttTopicTokens.ModelId}}}", id.Value.Value) : topic.Value.Value; if (effectiveFormsKind == FormsKind.Property) { if (actionTokenPresent) @@ -1353,7 +1359,7 @@ private bool TryValidateSchemaReference(ValueTracker schemaRe } else if (schemaReference.Value.Success.Value.Value == true) { - errorReporter.ReportError(ErrorCondition.PropertyUnsupportedValue, $"'{parentPropName}' element has '{TDSchemaReference.SuccessName}' property value of true, which is not supported.", schemaReference.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupportedValue, $"'{parentPropName}' element has '{TDSchemaReference.SuccessName}' property value of true, which is not supported.", schemaReference.Value.Success.TokenIndex); hasError = true; } @@ -1367,7 +1373,7 @@ private bool TryValidateSchemaReference(ValueTracker schemaRe } else if (formsKind == FormsKind.Root) { - errorReporter.ReportError(ErrorCondition.PropertyUnsupported, $"'{parentPropName}' element has '{TDSchemaReference.SchemaName}' property, which is not allowed within root-level '{TDThing.FormsName}' element because schema is automatically composed from schema definitions in affordance '{TDThing.FormsName}' elements.", schemaReference.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupported, $"'{parentPropName}' element has '{TDSchemaReference.SchemaName}' property, which is not allowed within root-level '{TDThing.FormsName}' element because schema is automatically composed from schema definitions in affordance '{TDThing.FormsName}' elements.", schemaReference.Value.Schema.TokenIndex); hasError = true; } else if (string.IsNullOrWhiteSpace(schemaReference.Value.Schema.Value.Value)) @@ -1456,11 +1462,6 @@ private bool TryValidateDataSchema(ValueTracker dataSchema, Func(ValueTracker dataSchema, Func(ValueTracker dataSchema, DataSche errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Data schema property '{property.Key}' is missing '{TDDataSchema.TypeName}' property, which is required in an object definition that specifies a constant value.", property.Value.TokenIndex, dataSchema.Value.Const.TokenIndex); hasError = true; } + else if (property.Value.Value.Const != null) + { + errorReporter.ReportError(ErrorCondition.PropertyUnsupported, $"The '{TDDataSchema.ConstName}' property is not permitted in a schema definition that defines a '{TDDataSchema.ConstName}' value.", property.Value.Value.Const.TokenIndex, dataSchema.Value.Const.TokenIndex); + hasError = true; + } else if (dataSchema.Value.Const.Value.ValueMap.Entries!.TryGetValue(property.Key, out ValueTracker? constValue)) { switch (property.Value.Value.Type!.Value.Value) @@ -1846,6 +1852,16 @@ private bool TryValidateObjectDataSchema(ValueTracker dataSchema, DataSche errorReporter.ReportError(ErrorCondition.PropertyUnsupported, $"The '{TDDataSchema.ErrorMessageName}' property is permitted only in the first level of a '{TDThing.SchemaDefinitionsName}' element.", dataSchema.Value.ErrorMessage.TokenIndex); hasError = true; } + else if (!dataSchema.Value.Properties.Entries.TryGetValue(dataSchema.Value.ErrorMessage.Value.Value, out ValueTracker? errorMessage)) + { + errorReporter.ReportError(ErrorCondition.ItemNotFound, $"Data schema '{TDDataSchema.ErrorMessageName}' property names non-existent property '{dataSchema.Value.ErrorMessage.Value.Value}'.", dataSchema.Value.ErrorMessage.TokenIndex, dataSchema.Value.Properties.TokenIndex); + hasError = true; + } + else if (errorMessage.Value.Type == null || errorMessage.Value.Type.Value.Value != TDValues.TypeString) + { + errorReporter.ReportError(ErrorCondition.TypeMismatch, $"Data schema '{TDDataSchema.ErrorMessageName}' property must refer to a property with '{TDDataSchema.TypeName}' of '{TDValues.TypeString}'.", dataSchema.Value.ErrorMessage.TokenIndex, errorMessage.TokenIndex); + hasError = true; + } } HashSet supportedProperties = new() @@ -2024,7 +2040,7 @@ private bool TryValidateStringDataSchema(ValueTracker dataSchema, DataSche } else if (!patternRegex.IsMatch(Iso8601DurationExample) && !patternRegex.IsMatch(DecimalExample)) { - errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Data schema '{TDDataSchema.PatternName}' property value \"{patternValue}\" matches neither an ISO 8601 duration value (e.g., \"{Iso8601DurationExample}\") nor a decimal value (e.g., \"{DecimalExample}\"), so indended type is indeterminate.", dataSchema.Value.Pattern.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupportedValue, $"Data schema '{TDDataSchema.PatternName}' property value \"{patternValue}\" matches neither an ISO 8601 duration value (e.g., \"{Iso8601DurationExample}\") nor a decimal value (e.g., \"{DecimalExample}\"), so indended type is indeterminate.", dataSchema.Value.Pattern.TokenIndex); hasError = true; } } @@ -2188,12 +2204,17 @@ private bool TryValidateBooleanDataSchema(ValueTracker dataSchema, DataSch return !hasError; } - private bool TryValidateNullDataSchema(ValueTracker dataSchema, DataSchemaKind dataSchemaKind, Func? propertyApprover) + private bool TryValidateNullDataSchema(ValueTracker dataSchema, DataSchemaKind dataSchemaKind, Func? propertyApprover, bool contentTypeIsRawOrCustom, long contentTypeTokenIndex) where T : TDDataSchema, IDeserializable { if (dataSchemaKind != DataSchemaKind.Action && dataSchemaKind != DataSchemaKind.Event) { - errorReporter.ReportError(ErrorCondition.PropertyUnsupported, $"A '{TDDataSchema.TypeName}' property value of '{TDValues.TypeNull}' is permitted only in the '{TDAction.InputName}' or '{TDAction.OutputName}' property value of an '{TDThing.ActionsName}' element or in the '{TDEvent.DataName}' property value of an '{TDThing.EventsName}' element.", dataSchema.Value.Type!.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupportedValue, $"A '{TDDataSchema.TypeName}' property value of '{TDValues.TypeNull}' is permitted only in the '{TDAction.InputName}' or '{TDAction.OutputName}' property value of an '{TDThing.ActionsName}' element or in the '{TDEvent.DataName}' property value of an '{TDThing.EventsName}' element.", dataSchema.Value.Type!.TokenIndex); + return false; + } + else if (!contentTypeIsRawOrCustom) + { + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"Data schema with '{TDDataSchema.TypeName}' of '{TDValues.TypeNull}' is permitted only in an affordance with a form that specifies '{TDForm.ContentTypeName}' of '{TDValues.ContentTypeRaw}' or '{TDValues.ContentTypeCustom}'.", dataSchema.Value.Type!.TokenIndex, contentTypeTokenIndex); return false; } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/.gitignore b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/.gitignore new file mode 100644 index 0000000000..97f3e31276 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/.gitignore @@ -0,0 +1 @@ +sandbox/ diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/ProtocolCompilerTester.cs b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/ProtocolCompilerTester.cs index eb83ea9e06..40797e96e7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/ProtocolCompilerTester.cs +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/ProtocolCompilerTester.cs @@ -1,8 +1,6 @@ namespace Azure.Iot.Operations.ProtocolCompiler.UnitTests { - using System.Globalization; using Xunit; - using System.Diagnostics; using System.Buffers; using System.IO; using System.Text.Json; @@ -29,47 +27,51 @@ public static IEnumerable GetFailureTestCases() foreach (string testCasePath in Directory.GetFiles(failureCasesPath, @"*.json")) { string testCaseName = Path.GetFileNameWithoutExtension(testCasePath); - using (StreamReader streamReader = File.OpenText($"{failureCasesPath}/{testCaseName}.json")) - { - TestCase? testCase = JsonSerializer.Deserialize(streamReader.ReadToEnd()); - Assert.False(testCase == null, $"Test case '{testCaseName}' descriptor failed to deserialize"); - Assert.False(testCase.Success, $"Test case '{testCaseName}' is in failure folder but is marked as success."); - Assert.False(testCase.Errors.Length == 0, $"Test case '{testCaseName}' is marked as failure but descriptor contains no 'errors' elements."); - yield return new object[] { testCaseName, testCase.CommandLine, testCase.Errors }; - } + yield return new object[] { testCaseName }; + } + } + + public static IEnumerable GetSuccessTestCases() + { + foreach (string testCasePath in Directory.GetFiles(successCasesPath, @"*.json")) + { + string testCaseName = Path.GetFileNameWithoutExtension(testCasePath); + yield return new object[] { testCaseName }; } } [Theory] [MemberData(nameof(GetFailureTestCases))] - public void TestProtocolCompilerFailures(string testCaseName, TestCommandLine commandLine, TestError[] errors) + public async Task TestProtocolCompilerFailures(string testCaseName) { - OptionContainer options = GetOptionContainer(testCaseName, commandLine); + TestCase? testCase; + using (StreamReader streamReader = File.OpenText($"{failureCasesPath}/{testCaseName}.json")) + { + testCase = JsonSerializer.Deserialize(streamReader.ReadToEnd()); + Assert.False(testCase == null, $"Test case '{testCaseName}' descriptor failed to deserialize"); + Assert.False(testCase.Success, $"Test case '{testCaseName}' is in failure folder but is marked as success."); + Assert.False(testCase.Errors.Length == 0, $"Test case '{testCaseName}' is marked as failure but descriptor contains no 'errors' elements."); + } + + OptionContainer options = GetOptionContainer(testCaseName, testCase.CommandLine); + + if (options.OutputDir.Exists) + { + options.OutputDir.Delete(recursive: true); + } ErrorLog errorLog = CommandPerformer.GenerateCode(options, (_, _) => { }, suppressExternalTools: true); if (errorLog.HasErrors) { + if (errorLog.FatalError != null) + { + CheckError(testCaseName, errorLog.FatalError, testCase.Errors); + } + foreach (ErrorRecord errorRecord in errorLog.Errors) { - TestError? expectedError = GetBestMatchingExpectedError(errorRecord, errors); - if (expectedError != null) - { - if (!Enum.TryParse(expectedError.Condition, out ErrorCondition expectedCondition)) - { - Assert.Fail($"Test case '{testCaseName}' contains invalid error condition string '{expectedError.Condition}' in expected errors."); - } - - Assert.Equal(expectedCondition, errorRecord.Condition); - Assert.Equal(expectedError.Filename, errorRecord.Filename); - Assert.Equal(expectedError.LineNumber, errorRecord.LineNumber); - Assert.Equal(expectedError.CfLineNumber, errorRecord.CfLineNumber); - Assert.Equal(expectedError.CrossRef, errorRecord.CrossRef); - } - else - { - Assert.Fail($"Test case '{testCaseName}' returned unexpected error: '{errorRecord.Message}', file: {errorRecord.Filename}, line: {errorRecord.LineNumber}, cfLine: {errorRecord.CfLineNumber}, crossRef: '{errorRecord.CrossRef}'"); - } + CheckError(testCaseName, errorRecord, testCase.Errors); } } else @@ -78,6 +80,63 @@ public void TestProtocolCompilerFailures(string testCaseName, TestCommandLine co } } + [Theory] + [MemberData(nameof(GetSuccessTestCases))] + public async Task TestProtocolCompilerSuccesses(string testCaseName) + { + TestCase? testCase; + using (StreamReader streamReader = File.OpenText($"{successCasesPath}/{testCaseName}.json")) + { + testCase = JsonSerializer.Deserialize(streamReader.ReadToEnd()); + Assert.False(testCase == null, $"Test case '{testCaseName}' descriptor failed to deserialize"); + Assert.True(testCase.Success, $"Test case '{testCaseName}' is in success folder but is marked as failure."); + Assert.True(testCase.Errors.Length == 0, $"Test case '{testCaseName}' is marked as success but descriptor contains 'errors' elements."); + } + + OptionContainer options = GetOptionContainer(testCaseName, testCase.CommandLine); + + if (options.OutputDir.Exists) + { + options.OutputDir.Delete(recursive: true); + } + + ErrorLog errorLog = CommandPerformer.GenerateCode(options, (_, _) => { }, suppressExternalTools: true); + + if (errorLog.HasErrors) + { + if (errorLog.FatalError != null) + { + Assert.Fail($"Test case '{testCaseName}' was expected to succeed but returned fatal error: '{errorLog.FatalError.Message}', file: {errorLog.FatalError.Filename}, line: {errorLog.FatalError.LineNumber}"); + } + else + { + Assert.Fail($"Test case '{testCaseName}' was expected to succeed but returned {errorLog.Errors.Count} error(s) including: '{errorLog.Errors.First().Message}', file: {errorLog.Errors.First().Filename}, line: {errorLog.Errors.First().LineNumber}"); + } + } + } + + private static void CheckError(string testCaseName, ErrorRecord errorRecord, TestError[] errors) + { + TestError? expectedError = GetBestMatchingExpectedError(errorRecord, errors); + if (expectedError != null) + { + if (!Enum.TryParse(expectedError.Condition, out ErrorCondition expectedCondition)) + { + Assert.Fail($"Test case '{testCaseName}' contains invalid error condition string '{expectedError.Condition}' in expected errors."); + } + + Assert.True(expectedCondition == errorRecord.Condition, $"Test case '{testCaseName}' returned error with unexpected condition. Expected: '{expectedCondition}', Actual: '{errorRecord.Condition}'; Message: \"{errorRecord.Message}\""); + Assert.True(expectedError.Filename == errorRecord.Filename, $"Test case '{testCaseName}' returned error with unexpected filename. Expected: '{expectedError.Filename}', Actual: '{errorRecord.Filename}'; Message: \"{errorRecord.Message}\""); + Assert.True(expectedError.LineNumber == errorRecord.LineNumber, $"Test case '{testCaseName}' returned error with unexpected line number. Expected: {expectedError.LineNumber}, Actual: {errorRecord.LineNumber}; Message: \"{errorRecord.Message}\""); + Assert.True(expectedError.CfLineNumber == errorRecord.CfLineNumber, $"Test case '{testCaseName}' returned error with unexpected cfLine number. Expected: {expectedError.CfLineNumber}, Actual: {errorRecord.CfLineNumber}; Message: \"{errorRecord.Message}\""); + Assert.True(expectedError.CrossRef == errorRecord.CrossRef, $"Test case '{testCaseName}' returned error with unexpected crossRef. Expected: '{expectedError.CrossRef}', Actual: '{errorRecord.CrossRef}'; Message: \"{errorRecord.Message}\""); + } + else + { + Assert.Fail($"Test case '{testCaseName}' returned unexpected error: '{errorRecord.Message}', file: {errorRecord.Filename}, line: {errorRecord.LineNumber}, cfLine: {errorRecord.CfLineNumber}, crossRef: '{errorRecord.CrossRef}'"); + } + } + private static TestError? GetBestMatchingExpectedError(ErrorRecord errorRecord, TestError[] errors) { if (errors.Length == 0) diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/json-schemas/AnObjectSchema.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/json-schemas/AnObjectSchema.json new file mode 100644 index 0000000000..309e870032 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/json-schemas/AnObjectSchema.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "AnObjectSchema", + "type": "object", + "additionalProperties": false, + "required": [ "alpha", "beta" ], + "properties": { + "alpha": { + "type": "string" + }, + "beta": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/name-rules/DefaultSchemaNames.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/name-rules/DefaultSchemaNames.json new file mode 100644 index 0000000000..0157789b7a --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/name-rules/DefaultSchemaNames.json @@ -0,0 +1,129 @@ +{ + "suppressTitles": false, + "constantsSchema": "Constants", + "aggregateEventName": "Events", + "aggregateEventSchema": "EventCollection", + "aggregatePropName": "Properties", + "aggregatePropSchema": "PropertyCollection", + "aggregatePropWriteSchema": "PropertyUpdate", + "aggregatePropReadRespSchema": "PropertyCollectionReadRespSchema", + "aggregatePropWriteRespSchema": "PropertyCollectionWriteRespSchema", + "aggregatePropReadErrSchema": "PropertyCollectionReadError", + "aggregatePropWriteErrSchema": "PropertyCollectionWriteError", + "readRequesterBinder": "ReadRequester", + "readResponderBinder": "ReadResponder", + "writeRequesterBinder": "WriteRequester", + "writeResponderBinder": "WriteResponder", + "aggregateReadRespValueField": "_properties", + "aggregateRespErrorField": "_errors", + "eventSchema": { + "in": [ "eventName" ], + "out": "{eventName}Event", + "capitalize": true + }, + "eventValueSchema": { + "in": [ "eventName" ], + "out": "Event{eventName}Value", + "capitalize": true + }, + "eventSenderBinder": { + "in": [ "eventSchema" ], + "out": "{eventSchema}Sender", + "capitalize": true + }, + "eventReceiverBinder": { + "in": [ "eventSchema" ], + "out": "{eventSchema}Receiver", + "capitalize": true + }, + "propSchema": { + "in": [ "propName" ], + "out": "{propName}Property", + "capitalize": true + }, + "writablePropSchema": { + "in": [ "propName" ], + "out": "{propName}WritableProperty", + "capitalize": true + }, + "propReadRespSchema": { + "in": [ "propName" ], + "out": "{propName}ReadRespSchema", + "capitalize": true + }, + "propWriteRespSchema": { + "in": [ "propName" ], + "out": "{propName}WriteRespSchema", + "capitalize": true + }, + "propValueSchema": { + "in": [ "propName" ], + "out": "Property{propName}Value", + "capitalize": true + }, + "propReadActName": { + "in": [ "propName" ], + "out": "Read{propName}", + "capitalize": true + }, + "propWriteActName": { + "in": [ "propName" ], + "out": "Write{propName}", + "capitalize": true + }, + "propMaintainerBinder": { + "in": [ "propSchema" ], + "out": "{propSchema}Maintainer", + "capitalize": true + }, + "propConsumerBinder": { + "in": [ "propSchema" ], + "out": "{propSchema}Consumer", + "capitalize": true + }, + "actionInSchema": { + "in": [ "actionName" ], + "out": "{actionName}InputArguments", + "capitalize": true + }, + "actionOutSchema": { + "in": [ "actionName" ], + "out": "{actionName}OutputArguments", + "capitalize": true + }, + "actionRespSchema": { + "in": [ "actionName" ], + "out": "{actionName}ResponseSchema", + "capitalize": true + }, + "actionExecutorBinder": { + "in": [ "actionName" ], + "out": "{actionName}ActionExecutor", + "capitalize": true + }, + "actionInvokerBinder": { + "in": [ "actionName" ], + "out": "{actionName}ActionInvoker", + "capitalize": true + }, + "propReadRespErrorField": { + "in": [ "propName", "errorSchemaName" ], + "out": "_error", + "capitalize": false + }, + "propWriteRespErrorField": { + "in": [ "propName", "errorSchemaName" ], + "out": "_error", + "capitalize": false + }, + "actionRespErrorField": { + "in": [ "actionName", "errorSchemaName" ], + "out": "_error", + "capitalize": false + }, + "backupSchemaName": { + "in": [ "parentSchemaName", "childName" ], + "out": "{parentSchemaName}{childName}", + "capitalize": true + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/sandbox/SampleTest/SetColorInputArguments.schema.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/sandbox/SampleTest/SetColorInputArguments.schema.json deleted file mode 100644 index caa8eb10a8..0000000000 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/sandbox/SampleTest/SetColorInputArguments.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft-07/schema", - "title": "SetColorInputArguments", - "description": "Input arguments for action 'setColor'", - "type": "object", - "additionalProperties": false, - "required": [ "newColor" ], - "properties": { - "newColor": { - "description": "The 'newColor' Field.", - "type": "string" - } - } -} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/sandbox/SampleTest/SetColorOutputArguments.schema.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/sandbox/SampleTest/SetColorOutputArguments.schema.json deleted file mode 100644 index f63e5a425c..0000000000 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/sandbox/SampleTest/SetColorOutputArguments.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft-07/schema", - "title": "SetColorOutputArguments", - "description": "Output arguments for action 'setColor'", - "type": "object", - "additionalProperties": false, - "required": [ "oldColor" ], - "properties": { - "oldColor": { - "description": "The 'oldColor' Field.", - "type": "string" - } - } -} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SampleTest.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/SampleTest.json similarity index 90% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SampleTest.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/SampleTest.json index d07dd389a0..c7f955b16f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SampleTest.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/SampleTest.json @@ -1,7 +1,7 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalid/OneAction.TD.json" ], + "thingFiles": [ "valid/Noop.TD.json" ], "schemas": [ ], "typeNamer": null, "outDir": "", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeEmpty.json new file mode 100644 index 0000000000..890f03bd1b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseContentTypeEmpty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "ActionFormAdditionalResponseContentTypeEmpty.TD.json", + "line": 45, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeText.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeText.json new file mode 100644 index 0000000000..ce2a0b21cf --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeText.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseContentTypeText.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "ActionFormAdditionalResponseContentTypeText.TD.json", + "line": 45, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoMatchingSchemaDefinition.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoMatchingSchemaDefinition.json new file mode 100644 index 0000000000..d219f95d7d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoMatchingSchemaDefinition.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseNoMatchingSchemaDefinition.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ItemNotFound", + "filename": "ActionFormAdditionalResponseNoMatchingSchemaDefinition.TD.json", + "line": 37, + "cfLine": 16, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchema.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchema.json new file mode 100644 index 0000000000..f4eb7054a5 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchema.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseNoSchema.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyMissing", + "filename": "ActionFormAdditionalResponseNoSchema.TD.json", + "line": 43, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchemaDefinitions.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchemaDefinitions.json new file mode 100644 index 0000000000..618f02b99b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchemaDefinitions.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseNoSchemaDefinitions.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ItemNotFound", + "filename": "ActionFormAdditionalResponseNoSchemaDefinitions.TD.json", + "line": 27, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSuccess.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSuccess.json new file mode 100644 index 0000000000..64289b1ec4 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSuccess.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseNoSuccess.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyMissing", + "filename": "ActionFormAdditionalResponseNoSuccess.TD.json", + "line": 42, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionMap.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionMap.json new file mode 100644 index 0000000000..7d52f12fe1 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionMap.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionMap.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "ActionFormAdditionalResponseSchemaDefinitionMap.TD.json", + "line": 42, + "cfLine": 24, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionNotObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionNotObject.json new file mode 100644 index 0000000000..3b4086a3df --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionNotObject.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionNotObject.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "ActionFormAdditionalResponseSchemaDefinitionNotObject.TD.json", + "line": 44, + "cfLine": 17, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaEmpty.json new file mode 100644 index 0000000000..52cafa87e3 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseSchemaEmpty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "ActionFormAdditionalResponseSchemaEmpty.TD.json", + "line": 45, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSuccessTrue.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSuccessTrue.json new file mode 100644 index 0000000000..c17c80d3e4 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSuccessTrue.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseSuccessTrue.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "ActionFormAdditionalResponseSuccessTrue.TD.json", + "line": 43, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseUnsupportedProperty.json new file mode 100644 index 0000000000..9d1bf5b246 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseUnsupportedProperty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseUnsupportedProperty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "ActionFormAdditionalResponseUnsupportedProperty.TD.json", + "line": 46, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponsesMultiple.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponsesMultiple.json new file mode 100644 index 0000000000..c3eeaaafe9 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponsesMultiple.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponsesMultiple.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ElementsPlural", + "filename": "ActionFormAdditionalResponsesMultiple.TD.json", + "line": 42, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormContentTypeText.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormContentTypeText.json new file mode 100644 index 0000000000..37ec4b099b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormContentTypeText.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormContentTypeText.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "ActionFormContentTypeText.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeEmpty.json new file mode 100644 index 0000000000..b8a538692f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormHeaderCodeEmpty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "ActionFormHeaderCodeEmpty.TD.json", + "line": 24, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoMatchingSchemaDefinition.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoMatchingSchemaDefinition.json new file mode 100644 index 0000000000..72db699950 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoMatchingSchemaDefinition.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormHeaderCodeNoMatchingSchemaDefinition.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ItemNotFound", + "filename": "ActionFormHeaderCodeNoMatchingSchemaDefinition.TD.json", + "line": 29, + "cfLine": 16, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoSchemaDefinitions.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoSchemaDefinitions.json new file mode 100644 index 0000000000..108d67ac9b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoSchemaDefinitions.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormHeaderCodeNoSchemaDefinitions.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ItemNotFound", + "filename": "ActionFormHeaderCodeNoSchemaDefinitions.TD.json", + "line": 24, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeSchemaDefinitionNotEnum.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeSchemaDefinitionNotEnum.json new file mode 100644 index 0000000000..d74d6744cf --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeSchemaDefinitionNotEnum.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormHeaderCodeSchemaDefinitionNotEnum.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "ActionFormHeaderCodeSchemaDefinitionNotEnum.TD.json", + "line": 29, + "cfLine": 17, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeEmpty.json new file mode 100644 index 0000000000..b3a1249234 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoContentTypeEmpty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "ActionFormHeaderInfoContentTypeEmpty.TD.json", + "line": 45, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeNotJson.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeNotJson.json new file mode 100644 index 0000000000..deebcd04b1 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeNotJson.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoContentTypeNotJson.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "ActionFormHeaderInfoContentTypeNotJson.TD.json", + "line": 45, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoContentType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoContentType.json new file mode 100644 index 0000000000..110f8e5405 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoContentType.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoNoContentType.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyMissing", + "filename": "ActionFormHeaderInfoNoContentType.TD.json", + "line": 42, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoMatchingSchemaDefinition.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoMatchingSchemaDefinition.json new file mode 100644 index 0000000000..7003119348 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoMatchingSchemaDefinition.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoNoMatchingSchemaDefinition.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ItemNotFound", + "filename": "ActionFormHeaderInfoNoMatchingSchemaDefinition.TD.json", + "line": 37, + "cfLine": 16, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchema.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchema.json new file mode 100644 index 0000000000..38a0708c79 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchema.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoNoSchema.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyMissing", + "filename": "ActionFormHeaderInfoNoSchema.TD.json", + "line": 43, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchemaDefinitions.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchemaDefinitions.json new file mode 100644 index 0000000000..1c5c517392 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchemaDefinitions.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoNoSchemaDefinitions.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ItemNotFound", + "filename": "ActionFormHeaderInfoNoSchemaDefinitions.TD.json", + "line": 27, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionMap.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionMap.json new file mode 100644 index 0000000000..09c997c457 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionMap.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionMap.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "ActionFormHeaderInfoSchemaDefinitionMap.TD.json", + "line": 42, + "cfLine": 24, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionNotObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionNotObject.json new file mode 100644 index 0000000000..b0a3be70c4 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionNotObject.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionNotObject.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "ActionFormHeaderInfoSchemaDefinitionNotObject.TD.json", + "line": 44, + "cfLine": 17, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaEmpty.json new file mode 100644 index 0000000000..05549d97ef --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoSchemaEmpty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "ActionFormHeaderInfoSchemaEmpty.TD.json", + "line": 45, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSuccessTrue.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSuccessTrue.json new file mode 100644 index 0000000000..05b1ca989f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSuccessTrue.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoSuccessTrue.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "ActionFormHeaderInfoSuccessTrue.TD.json", + "line": 43, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoUnsupportedProperty.json new file mode 100644 index 0000000000..02d965c659 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoUnsupportedProperty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoUnsupportedProperty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "ActionFormHeaderInfoUnsupportedProperty.TD.json", + "line": 46, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfosMultiple.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfosMultiple.json new file mode 100644 index 0000000000..890056db57 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfosMultiple.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfosMultiple.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ElementsPlural", + "filename": "ActionFormHeaderInfosMultiple.TD.json", + "line": 42, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpInvokeDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpInvokeDuplicate.json new file mode 100644 index 0000000000..34e28c6242 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpInvokeDuplicate.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormOpInvokeDuplicate.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "ActionFormOpInvokeDuplicate.TD.json", + "line": 23, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpRead.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpRead.json new file mode 100644 index 0000000000..0785ad8e42 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpRead.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/ActionFormOpRead.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "ActionFormOpRead.TD.json", + "line": 23, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpSub.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpSub.json new file mode 100644 index 0000000000..76d54fe87c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpSub.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/ActionFormOpSub.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "ActionFormOpSub.TD.json", + "line": 23, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpWrite.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpWrite.json new file mode 100644 index 0000000000..c2635d9455 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpWrite.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/ActionFormOpWrite.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "ActionFormOpWrite.TD.json", + "line": 23, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormServiceGroupEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormServiceGroupEmpty.json new file mode 100644 index 0000000000..db21b8364a --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormServiceGroupEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormServiceGroupEmpty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "ActionFormServiceGroupEmpty.TD.json", + "line": 24, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicNoContentType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicNoContentType.json new file mode 100644 index 0000000000..36c47776a4 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicNoContentType.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormTopicNoContentType.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "ActionFormTopicNoContentType.TD.json", + "line": 19, + "cfLine": 21, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenAction.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenAction.json new file mode 100644 index 0000000000..549c791097 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenAction.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormTopicTokenAction.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "ActionFormTopicTokenAction.TD.json", + "line": 22, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenConsumerId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenConsumerId.json new file mode 100644 index 0000000000..6f1009de1a --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenConsumerId.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormTopicTokenConsumerId.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "ActionFormTopicTokenConsumerId.TD.json", + "line": 22, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenMaintainerId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenMaintainerId.json new file mode 100644 index 0000000000..75a0483d9d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenMaintainerId.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormTopicTokenMaintainerId.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "ActionFormTopicTokenMaintainerId.TD.json", + "line": 22, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenSenderId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenSenderId.json new file mode 100644 index 0000000000..dcb82c325d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenSenderId.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormTopicTokenSenderId.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "ActionFormTopicTokenSenderId.TD.json", + "line": 22, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormUnsupportedProperty.json new file mode 100644 index 0000000000..e75ebfb377 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormUnsupportedProperty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormUnsupportedProperty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "ActionFormUnsupportedProperty.TD.json", + "line": 24, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsEmpty.json new file mode 100644 index 0000000000..2a93d7e4f0 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/ActionFormsEmpty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ElementMissing", + "filename": "ActionFormsEmpty.TD.json", + "line": 18, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsMultipleContentTypes.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsMultipleContentTypes.json new file mode 100644 index 0000000000..62ab7cc754 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsMultipleContentTypes.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormsMultipleContentTypes.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "ActionFormsMultipleContentTypes.TD.json", + "line": 21, + "cfLine": 27, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOpInvokeDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOpInvokeDuplicate.json new file mode 100644 index 0000000000..22c5dff41f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOpInvokeDuplicate.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormsOpInvokeDuplicate.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "ActionFormsOpInvokeDuplicate.TD.json", + "line": 23, + "cfLine": 29, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessAndInvoke.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessAndInvoke.json new file mode 100644 index 0000000000..1220d42364 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessAndInvoke.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormsOplessAndInvoke.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "ActionFormsOplessAndInvoke.TD.json", + "line": 25, + "cfLine": 18, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessDuplicate.json new file mode 100644 index 0000000000..965b2aa17d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessDuplicate.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionFormsOplessDuplicate.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "ActionFormsOplessDuplicate.TD.json", + "line": 19, + "cfLine": 18, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputMap.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputMap.json new file mode 100644 index 0000000000..b7476691ea --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputMap.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionInputMap.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "ActionInputMap.TD.json", + "line": 18, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNullAndContentTypeJson.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNullAndContentTypeJson.json new file mode 100644 index 0000000000..8a9e8ca062 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNullAndContentTypeJson.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionInputNullAndContentTypeJson.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "ActionInputNullAndContentTypeJson.TD.json", + "line": 19, + "cfLine": 24, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNumber.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNumber.json new file mode 100644 index 0000000000..dfe7914da0 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNumber.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionInputNumber.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "ActionInputNumber.TD.json", + "line": 18, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeCustom.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeCustom.json new file mode 100644 index 0000000000..6d8db401ed --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeCustom.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionInputObjectAndContentTypeCustom.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "ActionInputObjectAndContentTypeCustom.TD.json", + "line": 19, + "cfLine": 29, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeRaw.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeRaw.json new file mode 100644 index 0000000000..b248680194 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeRaw.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionInputObjectAndContentTypeRaw.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "ActionInputObjectAndContentTypeRaw.TD.json", + "line": 19, + "cfLine": 29, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectConst.json new file mode 100644 index 0000000000..e00b268198 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectConst.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionInputObjectConst.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "ActionInputObjectConst.TD.json", + "line": 25, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectErrorMessage.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectErrorMessage.json new file mode 100644 index 0000000000..59655e2c13 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectErrorMessage.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionInputObjectErrorMessage.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "ActionInputObjectErrorMessage.TD.json", + "line": 25, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputString.json new file mode 100644 index 0000000000..5a76318fe7 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputString.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionInputString.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "ActionInputString.TD.json", + "line": 18, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoForms.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoForms.json new file mode 100644 index 0000000000..c23226607f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoForms.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/ActionNoForms.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyMissing", + "filename": "ActionNoForms.TD.json", + "line": 17, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoFormsWithTopic.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoFormsWithTopic.json new file mode 100644 index 0000000000..7c9057a651 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoFormsWithTopic.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionNoFormsWithTopic.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Unusable", + "filename": "ActionNoFormsWithTopic.TD.json", + "line": 17, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputMap.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputMap.json new file mode 100644 index 0000000000..f9338414fe --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputMap.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionOutputMap.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "ActionOutputMap.TD.json", + "line": 18, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNullAndContentTypeJson.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNullAndContentTypeJson.json new file mode 100644 index 0000000000..e6bbf53182 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNullAndContentTypeJson.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionOutputNullAndContentTypeJson.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "ActionOutputNullAndContentTypeJson.TD.json", + "line": 19, + "cfLine": 24, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNumber.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNumber.json new file mode 100644 index 0000000000..d13bac1f0a --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNumber.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionOutputNumber.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "ActionOutputNumber.TD.json", + "line": 18, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeCustom.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeCustom.json new file mode 100644 index 0000000000..7504684494 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeCustom.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionOutputObjectAndContentTypeCustom.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "ActionOutputObjectAndContentTypeCustom.TD.json", + "line": 19, + "cfLine": 29, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeRaw.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeRaw.json new file mode 100644 index 0000000000..7b6f3fdc01 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeRaw.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionOutputObjectAndContentTypeRaw.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "ActionOutputObjectAndContentTypeRaw.TD.json", + "line": 19, + "cfLine": 29, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectConst.json new file mode 100644 index 0000000000..cc32c1bce7 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectConst.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionOutputObjectConst.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "ActionOutputObjectConst.TD.json", + "line": 25, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectErrorMessage.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectErrorMessage.json new file mode 100644 index 0000000000..236640abcb --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectErrorMessage.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionOutputObjectErrorMessage.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "ActionOutputObjectErrorMessage.TD.json", + "line": 25, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputString.json new file mode 100644 index 0000000000..cf11269050 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputString.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionOutputString.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "ActionOutputString.TD.json", + "line": 18, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionUnsupportedProperty.json new file mode 100644 index 0000000000..d1af49b2a6 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionUnsupportedProperty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionUnsupportedProperty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "ActionUnsupportedProperty.TD.json", + "line": 26, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ArrayKey.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ArrayKey.json new file mode 100644 index 0000000000..a3a7baaf43 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ArrayKey.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidJson/ArrayKey.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "ArrayKey.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/BooleanKey.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/BooleanKey.json new file mode 100644 index 0000000000..e67a1b1ec8 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/BooleanKey.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidJson/BooleanKey.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "BooleanKey.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextDtvWrongPrefix.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextDtvWrongPrefix.json new file mode 100644 index 0000000000..b02cb058bb --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextDtvWrongPrefix.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ContextDtvWrongPrefix.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyMissing", + "filename": "ContextDtvWrongPrefix.TD.json", + "line": 2, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextDtvWrongUri.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextDtvWrongUri.json new file mode 100644 index 0000000000..58c7400669 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextDtvWrongUri.json @@ -0,0 +1,23 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ContextDtvWrongUri.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "ContextDtvWrongUri.TD.json", + "line": 4, + "cfLine": 0, + "crossRef": "" + }, + { + "condition": "PropertyMissing", + "filename": "ContextDtvWrongUri.TD.json", + "line": 2, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextMissingDtv.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextMissingDtv.json new file mode 100644 index 0000000000..ffb1040704 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextMissingDtv.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ContextMissingDtv.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyMissing", + "filename": "ContextMissingDtv.TD.json", + "line": 2, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextMissingWot.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextMissingWot.json new file mode 100644 index 0000000000..396aa66986 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextMissingWot.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/ContextMissingWot.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyMissing", + "filename": "ContextMissingWot.TD.json", + "line": 2, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextWrongType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextWrongType.json new file mode 100644 index 0000000000..a7a5916854 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextWrongType.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/ContextWrongType.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "ContextWrongType.TD.json", + "line": 2, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/DuplicateKey.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/DuplicateKey.json new file mode 100644 index 0000000000..60fa5c2362 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/DuplicateKey.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidJson/DuplicateKey.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "DuplicateKey.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventBooleanConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventBooleanConst.json new file mode 100644 index 0000000000..f5c9578886 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventBooleanConst.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventBooleanConst.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "EventBooleanConst.TD.json", + "line": 24, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormAdditionalResponses.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormAdditionalResponses.json new file mode 100644 index 0000000000..6638ce0fe3 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormAdditionalResponses.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventFormAdditionalResponses.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "EventFormAdditionalResponses.TD.json", + "line": 41, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormContentTypeText.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormContentTypeText.json new file mode 100644 index 0000000000..8fde2cb5ed --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormContentTypeText.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventFormContentTypeText.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "EventFormContentTypeText.TD.json", + "line": 28, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderCode.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderCode.json new file mode 100644 index 0000000000..87b1277894 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderCode.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventFormHeaderCode.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "EventFormHeaderCode.TD.json", + "line": 40, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderInfo.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderInfo.json new file mode 100644 index 0000000000..2353a8f791 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderInfo.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventFormHeaderInfo.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "EventFormHeaderInfo.TD.json", + "line": 41, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpInvoke.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpInvoke.json new file mode 100644 index 0000000000..9d9d2dc3fb --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpInvoke.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/EventFormOpInvoke.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "EventFormOpInvoke.TD.json", + "line": 30, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpRead.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpRead.json new file mode 100644 index 0000000000..ed621a9afa --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpRead.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/EventFormOpRead.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "EventFormOpRead.TD.json", + "line": 30, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubAll.json new file mode 100644 index 0000000000..08b121dcfc --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubAll.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/EventFormOpSubAll.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "EventFormOpSubAll.TD.json", + "line": 30, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubDuplicate.json new file mode 100644 index 0000000000..ffb8ad2b3f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubDuplicate.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventFormOpSubDuplicate.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "EventFormOpSubDuplicate.TD.json", + "line": 30, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpWrite.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpWrite.json new file mode 100644 index 0000000000..5ffccc9a81 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpWrite.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/EventFormOpWrite.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "EventFormOpWrite.TD.json", + "line": 30, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormServiceGroupEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormServiceGroupEmpty.json new file mode 100644 index 0000000000..efc63da34e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormServiceGroupEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventFormServiceGroupEmpty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "EventFormServiceGroupEmpty.TD.json", + "line": 31, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicNoContentType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicNoContentType.json new file mode 100644 index 0000000000..093de0ee49 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicNoContentType.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventFormTopicNoContentType.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "EventFormTopicNoContentType.TD.json", + "line": 26, + "cfLine": 28, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenAction.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenAction.json new file mode 100644 index 0000000000..478f519093 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenAction.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventFormTopicTokenAction.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "EventFormTopicTokenAction.TD.json", + "line": 29, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenConsumerId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenConsumerId.json new file mode 100644 index 0000000000..8d28de7ba5 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenConsumerId.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventFormTopicTokenConsumerId.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "EventFormTopicTokenConsumerId.TD.json", + "line": 29, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenExecutorId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenExecutorId.json new file mode 100644 index 0000000000..e471834a44 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenExecutorId.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventFormTopicTokenExecutorId.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "EventFormTopicTokenExecutorId.TD.json", + "line": 29, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenInvokerId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenInvokerId.json new file mode 100644 index 0000000000..66c59177e3 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenInvokerId.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventFormTopicTokenInvokerId.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "EventFormTopicTokenInvokerId.TD.json", + "line": 29, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenMaintainerId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenMaintainerId.json new file mode 100644 index 0000000000..bf1a0b1125 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenMaintainerId.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventFormTopicTokenMaintainerId.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "EventFormTopicTokenMaintainerId.TD.json", + "line": 29, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormUnsupportedProperty.json new file mode 100644 index 0000000000..aed8dcd0a5 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormUnsupportedProperty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventFormUnsupportedProperty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "EventFormUnsupportedProperty.TD.json", + "line": 31, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsEmpty.json new file mode 100644 index 0000000000..c8ea07362c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/EventFormsEmpty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ElementMissing", + "filename": "EventFormsEmpty.TD.json", + "line": 25, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOpSubDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOpSubDuplicate.json new file mode 100644 index 0000000000..3386662cc2 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOpSubDuplicate.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventFormsOpSubDuplicate.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "EventFormsOpSubDuplicate.TD.json", + "line": 30, + "cfLine": 36, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessAndSub.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessAndSub.json new file mode 100644 index 0000000000..c98117c704 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessAndSub.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventFormsOplessAndSub.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "EventFormsOplessAndSub.TD.json", + "line": 32, + "cfLine": 25, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessDuplicate.json new file mode 100644 index 0000000000..b927e1a63b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessDuplicate.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventFormsOplessDuplicate.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "EventFormsOplessDuplicate.TD.json", + "line": 26, + "cfLine": 25, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventIntegerConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventIntegerConst.json new file mode 100644 index 0000000000..ac53c971f7 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventIntegerConst.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventIntegerConst.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "EventIntegerConst.TD.json", + "line": 24, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoForms.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoForms.json new file mode 100644 index 0000000000..91e5c7a9e7 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoForms.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/EventNoForms.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyMissing", + "filename": "EventNoForms.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoFormsWithTopicAndNoRootFormSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoFormsWithTopicAndNoRootFormSubAll.json new file mode 100644 index 0000000000..2109609ef8 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoFormsWithTopicAndNoRootFormSubAll.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventNoFormsWithTopicAndNoRootFormSubAll.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Unusable", + "filename": "EventNoFormsWithTopicAndNoRootFormSubAll.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNullAndContentTypeJson.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNullAndContentTypeJson.json new file mode 100644 index 0000000000..5ad3632a69 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNullAndContentTypeJson.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventNullAndContentTypeJson.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "EventNullAndContentTypeJson.TD.json", + "line": 23, + "cfLine": 28, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNumberConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNumberConst.json new file mode 100644 index 0000000000..3b241b482a --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNumberConst.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventNumberConst.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "EventNumberConst.TD.json", + "line": 24, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeCustom.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeCustom.json new file mode 100644 index 0000000000..41e55e4712 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeCustom.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventObjectAndContentTypeCustom.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "EventObjectAndContentTypeCustom.TD.json", + "line": 23, + "cfLine": 33, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeRaw.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeRaw.json new file mode 100644 index 0000000000..98a5c2d6bb --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeRaw.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventObjectAndContentTypeRaw.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "EventObjectAndContentTypeRaw.TD.json", + "line": 23, + "cfLine": 33, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectConst.json new file mode 100644 index 0000000000..a2440116cc --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectConst.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventObjectConst.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "EventObjectConst.TD.json", + "line": 29, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectErrorMessage.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectErrorMessage.json new file mode 100644 index 0000000000..514aa135f7 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectErrorMessage.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventObjectErrorMessage.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "EventObjectErrorMessage.TD.json", + "line": 29, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventStringConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventStringConst.json new file mode 100644 index 0000000000..c85a7f8f9a --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventStringConst.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventStringConst.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "EventStringConst.TD.json", + "line": 24, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventUnsupportedProperty.json new file mode 100644 index 0000000000..ab0e422a31 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventUnsupportedProperty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventUnsupportedProperty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "EventUnsupportedProperty.TD.json", + "line": 33, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdEmpty.json new file mode 100644 index 0000000000..a26a571d3c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/IdEmpty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "IdEmpty.TD.json", + "line": 6, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdInvalidCharacters.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdInvalidCharacters.json new file mode 100644 index 0000000000..5720251775 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdInvalidCharacters.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/IdInvalidCharacters.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "IdInvalidCharacters.TD.json", + "line": 6, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdInvalidReplacementForTokenInTopic.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdInvalidReplacementForTokenInTopic.json new file mode 100644 index 0000000000..8967a54c9c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdInvalidReplacementForTokenInTopic.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/IdInvalidReplacementForTokenInTopic.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "IdInvalidReplacementForTokenInTopic.TD.json", + "line": 6, + "cfLine": 22, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdNotString.json new file mode 100644 index 0000000000..6b58a502fe --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdNotString.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/IdNotString.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "IdNotString.TD.json", + "line": 6, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkEmptyHref.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkEmptyHref.json new file mode 100644 index 0000000000..c9ea185141 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkEmptyHref.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/LinkEmptyHref.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "LinkEmptyHref.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkEmptyType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkEmptyType.json new file mode 100644 index 0000000000..3e33ea50eb --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkEmptyType.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/LinkEmptyType.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "LinkEmptyType.TD.json", + "line": 20, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNoHref.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNoHref.json new file mode 100644 index 0000000000..4034b8b1e1 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNoHref.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/LinkNoHref.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyMissing", + "filename": "LinkNoHref.TD.json", + "line": 17, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNoType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNoType.json new file mode 100644 index 0000000000..d8872f7551 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNoType.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/LinkNoType.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyMissing", + "filename": "LinkNoType.TD.json", + "line": 17, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNonJsonFile.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNonJsonFile.json new file mode 100644 index 0000000000..fb6776a39a --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNonJsonFile.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/LinkNonJsonFile.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "LinkNonJsonFile.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNonexistentFile.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNonexistentFile.json new file mode 100644 index 0000000000..6726caa017 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNonexistentFile.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/LinkNonexistentFile.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ItemNotFound", + "filename": "LinkNonexistentFile.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkTypeNotJson.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkTypeNotJson.json new file mode 100644 index 0000000000..3ec04dbfdf --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkTypeNotJson.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/LinkTypeNotJson.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "LinkTypeNotJson.TD.json", + "line": 20, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkUnsupportedProperty.json new file mode 100644 index 0000000000..5a793777f3 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkUnsupportedProperty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/LinkUnsupportedProperty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "LinkUnsupportedProperty.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingColon.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingColon.json new file mode 100644 index 0000000000..d7544faec9 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingColon.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidJson/MissingColon.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "MissingColon.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingComma.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingComma.json new file mode 100644 index 0000000000..a36a1f17e1 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingComma.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidJson/MissingComma.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "MissingComma.TD.json", + "line": 22, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingElement.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingElement.json new file mode 100644 index 0000000000..53f4bf5fad --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingElement.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidJson/MissingElement.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "MissingElement.TD.json", + "line": 17, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingKey.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingKey.json new file mode 100644 index 0000000000..0177151d0f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingKey.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidJson/MissingKey.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "MissingKey.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingValue.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingValue.json new file mode 100644 index 0000000000..ebbb638f74 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingValue.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidJson/MissingValue.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "MissingValue.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MultipleLinks.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MultipleLinks.json new file mode 100644 index 0000000000..4d31c34f2e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MultipleLinks.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/MultipleLinks.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "MultipleLinks.TD.json", + "line": 16, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoClientOrServer.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoClientOrServer.json new file mode 100644 index 0000000000..169bb79419 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoClientOrServer.json @@ -0,0 +1,19 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "valid/OneAction.TD.json" ], + "schemas": [], + "lang": "none", + "clientOnly": true, + "serverOnly": true + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "", + "line": 0, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoContext.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoContext.json new file mode 100644 index 0000000000..d535df67aa --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoContext.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/NoContext.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyMissing", + "filename": "NoContext.TD.json", + "line": 0, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoId.json new file mode 100644 index 0000000000..5f7d1d7039 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoId.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/NoId.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyMissing", + "filename": "NoId.TD.json", + "line": 0, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoThingOrSchema.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoThingOrSchema.json new file mode 100644 index 0000000000..32298c276e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoThingOrSchema.json @@ -0,0 +1,17 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [], + "schemas": [], + "lang": "none" + }, + "errors": [ + { + "condition": "ElementMissing", + "filename": "", + "line": 0, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoTitle.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoTitle.json new file mode 100644 index 0000000000..9fb45c1c8c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoTitle.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/NoTitle.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyMissing", + "filename": "NoTitle.TD.json", + "line": 0, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NonexistentThing.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NonexistentThing.json new file mode 100644 index 0000000000..d249de399b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NonexistentThing.json @@ -0,0 +1,17 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "nothing/Nonexistent.TD.json" ], + "schemas": [], + "lang": "none" + }, + "errors": [ + { + "condition": "ItemNotFound", + "filename": "", + "line": 0, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NumericKey.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NumericKey.json new file mode 100644 index 0000000000..f18ede639c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NumericKey.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidJson/NumericKey.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "NumericKey.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ObjectKey.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ObjectKey.json new file mode 100644 index 0000000000..484c7550e6 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ObjectKey.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidJson/ObjectKey.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "ObjectKey.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyBooleanConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyBooleanConst.json new file mode 100644 index 0000000000..546c288202 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyBooleanConst.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyBooleanConst.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "PropertyBooleanConst.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeEmpty.json new file mode 100644 index 0000000000..633e8fe1b2 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseContentTypeEmpty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "PropertyFormAdditionalResponseContentTypeEmpty.TD.json", + "line": 48, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeText.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeText.json new file mode 100644 index 0000000000..444875b22e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeText.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseContentTypeText.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "PropertyFormAdditionalResponseContentTypeText.TD.json", + "line": 41, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.json new file mode 100644 index 0000000000..537b9397f8 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ItemNotFound", + "filename": "PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TD.json", + "line": 40, + "cfLine": 16, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchema.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchema.json new file mode 100644 index 0000000000..67327eb234 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchema.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseNoSchema.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyMissing", + "filename": "PropertyFormAdditionalResponseNoSchema.TD.json", + "line": 46, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchemaDefinitions.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchemaDefinitions.json new file mode 100644 index 0000000000..088603bba9 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchemaDefinitions.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseNoSchemaDefinitions.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ItemNotFound", + "filename": "PropertyFormAdditionalResponseNoSchemaDefinitions.TD.json", + "line": 30, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSuccess.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSuccess.json new file mode 100644 index 0000000000..e08cc6ce83 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSuccess.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseNoSuccess.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyMissing", + "filename": "PropertyFormAdditionalResponseNoSuccess.TD.json", + "line": 45, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionMap.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionMap.json new file mode 100644 index 0000000000..cfd1464e2e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionMap.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionMap.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "PropertyFormAdditionalResponseSchemaDefinitionMap.TD.json", + "line": 45, + "cfLine": 24, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionNotObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionNotObject.json new file mode 100644 index 0000000000..61efa955a6 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionNotObject.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionNotObject.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "PropertyFormAdditionalResponseSchemaDefinitionNotObject.TD.json", + "line": 47, + "cfLine": 17, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaEmpty.json new file mode 100644 index 0000000000..b6a6eed9b6 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseSchemaEmpty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "PropertyFormAdditionalResponseSchemaEmpty.TD.json", + "line": 48, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSuccessTrue.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSuccessTrue.json new file mode 100644 index 0000000000..1703b05dfe --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSuccessTrue.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseSuccessTrue.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "PropertyFormAdditionalResponseSuccessTrue.TD.json", + "line": 46, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseUnsupportedProperty.json new file mode 100644 index 0000000000..3283e79d53 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseUnsupportedProperty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseUnsupportedProperty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "PropertyFormAdditionalResponseUnsupportedProperty.TD.json", + "line": 49, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponsesMultiple.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponsesMultiple.json new file mode 100644 index 0000000000..e9123d3df9 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponsesMultiple.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponsesMultiple.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ElementsPlural", + "filename": "PropertyFormAdditionalResponsesMultiple.TD.json", + "line": 45, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormContentTypeText.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormContentTypeText.json new file mode 100644 index 0000000000..0fbb7b95d3 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormContentTypeText.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormContentTypeText.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "PropertyFormContentTypeText.TD.json", + "line": 24, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderCode.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderCode.json new file mode 100644 index 0000000000..5045d4236f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderCode.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormHeaderCode.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "PropertyFormHeaderCode.TD.json", + "line": 36, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderInfo.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderInfo.json new file mode 100644 index 0000000000..fc6bf6feeb --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderInfo.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormHeaderInfo.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "PropertyFormHeaderInfo.TD.json", + "line": 37, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpInvoke.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpInvoke.json new file mode 100644 index 0000000000..726561ea65 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpInvoke.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/PropertyFormOpInvoke.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "PropertyFormOpInvoke.TD.json", + "line": 26, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadAll.json new file mode 100644 index 0000000000..2271bccc68 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadAll.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/PropertyFormOpReadAll.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "PropertyFormOpReadAll.TD.json", + "line": 26, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadDuplicate.json new file mode 100644 index 0000000000..6782f6bd29 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadDuplicate.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormOpReadDuplicate.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "PropertyFormOpReadDuplicate.TD.json", + "line": 26, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpSub.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpSub.json new file mode 100644 index 0000000000..b300682d7a --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpSub.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/PropertyFormOpSub.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "PropertyFormOpSub.TD.json", + "line": 26, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteDuplicate.json new file mode 100644 index 0000000000..ff1ac5cbbe --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteDuplicate.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormOpWriteDuplicate.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "PropertyFormOpWriteDuplicate.TD.json", + "line": 26, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteMulti.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteMulti.json new file mode 100644 index 0000000000..e06651d758 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteMulti.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/PropertyFormOpWriteMulti.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "PropertyFormOpWriteMulti.TD.json", + "line": 26, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json new file mode 100644 index 0000000000..6719ffac2f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Unusable", + "filename": "PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json", + "line": 40, + "cfLine": 26, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.json new file mode 100644 index 0000000000..fc32e5ce09 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Unusable", + "filename": "PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TD.json", + "line": 22, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json new file mode 100644 index 0000000000..3fa5910a37 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Unusable", + "filename": "PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json", + "line": 40, + "cfLine": 27, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicAndNoRootFormReadAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicAndNoRootFormReadAll.json new file mode 100644 index 0000000000..5c829f64a6 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicAndNoRootFormReadAll.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormReadWithoutTopicAndNoRootFormReadAll.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Unusable", + "filename": "PropertyFormReadWithoutTopicAndNoRootFormReadAll.TD.json", + "line": 22, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.json new file mode 100644 index 0000000000..b18b66aacf --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TD.json", + "line": 35, + "cfLine": 29, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormServiceGroup.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormServiceGroup.json new file mode 100644 index 0000000000..93279b52c1 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormServiceGroup.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormServiceGroup.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "PropertyFormServiceGroup.TD.json", + "line": 27, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicNoContentType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicNoContentType.json new file mode 100644 index 0000000000..e67b088b39 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicNoContentType.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormTopicNoContentType.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "PropertyFormTopicNoContentType.TD.json", + "line": 22, + "cfLine": 24, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenExecutorId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenExecutorId.json new file mode 100644 index 0000000000..98f564020f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenExecutorId.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormTopicTokenExecutorId.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "PropertyFormTopicTokenExecutorId.TD.json", + "line": 25, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenInvokerId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenInvokerId.json new file mode 100644 index 0000000000..5deb23d39e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenInvokerId.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormTopicTokenInvokerId.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "PropertyFormTopicTokenInvokerId.TD.json", + "line": 25, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.json new file mode 100644 index 0000000000..a60730008e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TD.json", + "line": 25, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.json new file mode 100644 index 0000000000..996f16ca3a --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TD.json", + "line": 26, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenReadAndWrite.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenReadAndWrite.json new file mode 100644 index 0000000000..0f3f5ed8ac --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenReadAndWrite.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormTopicTokenNoActionWhenReadAndWrite.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "PropertyFormTopicTokenNoActionWhenReadAndWrite.TD.json", + "line": 25, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenSenderId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenSenderId.json new file mode 100644 index 0000000000..03be92fe6c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenSenderId.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormTopicTokenSenderId.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "PropertyFormTopicTokenSenderId.TD.json", + "line": 25, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormUnsupportedProperty.json new file mode 100644 index 0000000000..2c2553c3a4 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormUnsupportedProperty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormUnsupportedProperty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "PropertyFormUnsupportedProperty.TD.json", + "line": 27, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.json new file mode 100644 index 0000000000..7afb79a763 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Unusable", + "filename": "PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TD.json", + "line": 62, + "cfLine": 38, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.json new file mode 100644 index 0000000000..cc9efc8436 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Unusable", + "filename": "PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TD.json", + "line": 28, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsEmpty.json new file mode 100644 index 0000000000..7e3ab2c4c5 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/PropertyFormsEmpty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ElementMissing", + "filename": "PropertyFormsEmpty.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpReadDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpReadDuplicate.json new file mode 100644 index 0000000000..b0f863c4cf --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpReadDuplicate.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormsOpReadDuplicate.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "PropertyFormsOpReadDuplicate.TD.json", + "line": 26, + "cfLine": 32, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteDuplicate.json new file mode 100644 index 0000000000..9a177bf907 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteDuplicate.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormsOpWriteDuplicate.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "PropertyFormsOpWriteDuplicate.TD.json", + "line": 26, + "cfLine": 32, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteNoRead.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteNoRead.json new file mode 100644 index 0000000000..a296038eba --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteNoRead.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormsOpWriteNoRead.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "PropertyFormsOpWriteNoRead.TD.json", + "line": 26, + "cfLine": 21, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessAndRead.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessAndRead.json new file mode 100644 index 0000000000..ea99ec6a7d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessAndRead.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormsOplessAndRead.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "PropertyFormsOplessAndRead.TD.json", + "line": 28, + "cfLine": 21, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessDuplicate.json new file mode 100644 index 0000000000..9a4b648050 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessDuplicate.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyFormsOplessDuplicate.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "PropertyFormsOplessDuplicate.TD.json", + "line": 22, + "cfLine": 21, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyIntegerConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyIntegerConst.json new file mode 100644 index 0000000000..0f16f4da10 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyIntegerConst.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyIntegerConst.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "PropertyIntegerConst.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNoForms.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNoForms.json new file mode 100644 index 0000000000..cc28d486cb --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNoForms.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/PropertyNoForms.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyMissing", + "filename": "PropertyNoForms.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNumberConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNumberConst.json new file mode 100644 index 0000000000..bcee450598 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNumberConst.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyNumberConst.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "PropertyNumberConst.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyObjectConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyObjectConst.json new file mode 100644 index 0000000000..5ce2e095a9 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyObjectConst.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyObjectConst.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "PropertyObjectConst.TD.json", + "line": 26, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyObjectErrorMessage.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyObjectErrorMessage.json new file mode 100644 index 0000000000..7188908c89 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyObjectErrorMessage.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyObjectErrorMessage.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "PropertyObjectErrorMessage.TD.json", + "line": 26, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyStringConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyStringConst.json new file mode 100644 index 0000000000..59d42a130b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyStringConst.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyStringConst.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "PropertyStringConst.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyTypeNull.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyTypeNull.json new file mode 100644 index 0000000000..66782ad924 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyTypeNull.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyTypeNull.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "PropertyTypeNull.TD.json", + "line": 20, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyUnsupportedProperty.json new file mode 100644 index 0000000000..f707323742 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyUnsupportedProperty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyUnsupportedProperty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "PropertyUnsupportedProperty.TD.json", + "line": 29, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeEmpty.json new file mode 100644 index 0000000000..82ada1c585 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormAdditionalResponseContentTypeEmpty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "RootFormAdditionalResponseContentTypeEmpty.TD.json", + "line": 23, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeText.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeText.json new file mode 100644 index 0000000000..f281d8dd66 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeText.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormAdditionalResponseContentTypeText.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "RootFormAdditionalResponseContentTypeText.TD.json", + "line": 23, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseNoSuccess.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseNoSuccess.json new file mode 100644 index 0000000000..085576065b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseNoSuccess.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormAdditionalResponseNoSuccess.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyMissing", + "filename": "RootFormAdditionalResponseNoSuccess.TD.json", + "line": 22, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSchema.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSchema.json new file mode 100644 index 0000000000..494109a920 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSchema.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormAdditionalResponseSchema.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "RootFormAdditionalResponseSchema.TD.json", + "line": 30, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSuccessTrue.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSuccessTrue.json new file mode 100644 index 0000000000..688c7ca162 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSuccessTrue.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormAdditionalResponseSuccessTrue.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "RootFormAdditionalResponseSuccessTrue.TD.json", + "line": 24, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseUnsupportedProperty.json new file mode 100644 index 0000000000..7b3b11dd9c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseUnsupportedProperty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormAdditionalResponseUnsupportedProperty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "RootFormAdditionalResponseUnsupportedProperty.TD.json", + "line": 25, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesAndSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesAndSubAll.json new file mode 100644 index 0000000000..ad2059c278 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesAndSubAll.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormAdditionalResponsesAndSubAll.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "RootFormAdditionalResponsesAndSubAll.TD.json", + "line": 21, + "cfLine": 26, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesMultiple.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesMultiple.json new file mode 100644 index 0000000000..8cb259089b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesMultiple.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormAdditionalResponsesMultiple.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ElementsPlural", + "filename": "RootFormAdditionalResponsesMultiple.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeCustom.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeCustom.json new file mode 100644 index 0000000000..30632f2755 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeCustom.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormContentTypeCustom.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "RootFormContentTypeCustom.TD.json", + "line": 20, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeRaw.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeRaw.json new file mode 100644 index 0000000000..8b2857c88b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeRaw.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormContentTypeRaw.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "RootFormContentTypeRaw.TD.json", + "line": 20, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeText.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeText.json new file mode 100644 index 0000000000..40a10b16e3 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeText.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormContentTypeText.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "RootFormContentTypeText.TD.json", + "line": 20, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormEmptyHref.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormEmptyHref.json new file mode 100644 index 0000000000..ab47bf916f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormEmptyHref.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/RootFormEmptyHref.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "RootFormEmptyHref.TD.json", + "line": 18, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderCode.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderCode.json new file mode 100644 index 0000000000..16c1451728 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderCode.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormHeaderCode.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "RootFormHeaderCode.TD.json", + "line": 30, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderInfo.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderInfo.json new file mode 100644 index 0000000000..b8477224dd --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderInfo.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormHeaderInfo.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "RootFormHeaderInfo.TD.json", + "line": 30, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoContentType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoContentType.json new file mode 100644 index 0000000000..5435debf25 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoContentType.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormNoContentType.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "RootFormNoContentType.TD.json", + "line": 17, + "cfLine": 19, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoHref.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoHref.json new file mode 100644 index 0000000000..b8d8822384 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoHref.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/RootFormNoHref.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyMissing", + "filename": "RootFormNoHref.TD.json", + "line": 17, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoOp.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoOp.json new file mode 100644 index 0000000000..8292549485 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoOp.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/RootFormNoOp.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyMissing", + "filename": "RootFormNoOp.TD.json", + "line": 17, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoTopic.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoTopic.json new file mode 100644 index 0000000000..7ad99f1457 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoTopic.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormNoTopic.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyMissing", + "filename": "RootFormNoTopic.TD.json", + "line": 17, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpArrayEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpArrayEmpty.json new file mode 100644 index 0000000000..fe00d45cb6 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpArrayEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/RootFormOpArrayEmpty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ElementMissing", + "filename": "RootFormOpArrayEmpty.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpElementEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpElementEmpty.json new file mode 100644 index 0000000000..67c06c214f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpElementEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/RootFormOpElementEmpty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "RootFormOpElementEmpty.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpEmpty.json new file mode 100644 index 0000000000..78d1458583 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/RootFormOpEmpty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "RootFormOpEmpty.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllAndSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllAndSubAll.json new file mode 100644 index 0000000000..9bdf2ca361 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllAndSubAll.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormOpReadAllAndSubAll.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "RootFormOpReadAllAndSubAll.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllDuplicate.json new file mode 100644 index 0000000000..b6d7af9665 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllDuplicate.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormOpReadAllDuplicate.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "RootFormOpReadAllDuplicate.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadOne.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadOne.json new file mode 100644 index 0000000000..b5991919cd --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadOne.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/RootFormOpReadOne.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "RootFormOpReadOne.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubAllDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubAllDuplicate.json new file mode 100644 index 0000000000..23ec7ae909 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubAllDuplicate.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormOpSubAllDuplicate.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "RootFormOpSubAllDuplicate.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubOne.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubOne.json new file mode 100644 index 0000000000..67c06c214f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubOne.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/RootFormOpElementEmpty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "RootFormOpElementEmpty.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWiteMultiAndSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWiteMultiAndSubAll.json new file mode 100644 index 0000000000..7a2765529c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWiteMultiAndSubAll.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormOpWiteMultiAndSubAll.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "RootFormOpWiteMultiAndSubAll.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteMultiDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteMultiDuplicate.json new file mode 100644 index 0000000000..afb2724925 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteMultiDuplicate.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormOpWriteMultiDuplicate.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "RootFormOpWriteMultiDuplicate.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteOne.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteOne.json new file mode 100644 index 0000000000..67c06c214f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteOne.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/RootFormOpElementEmpty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "RootFormOpElementEmpty.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormReadAllButNoProperties.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormReadAllButNoProperties.json new file mode 100644 index 0000000000..6768230f5d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormReadAllButNoProperties.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormReadAllButNoProperties.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Unusable", + "filename": "RootFormReadAllButNoProperties.TD.json", + "line": 21, + "cfLine": 26, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupEmpty.json new file mode 100644 index 0000000000..093dd302d6 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormServiceGroupEmpty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "RootFormServiceGroupEmpty.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupNoSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupNoSubAll.json new file mode 100644 index 0000000000..151a4ed7a5 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupNoSubAll.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormServiceGroupNoSubAll.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "RootFormServiceGroupNoSubAll.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormSubAllButNoEvents.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormSubAllButNoEvents.json new file mode 100644 index 0000000000..0b7a57b029 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormSubAllButNoEvents.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormSubAllButNoEvents.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Unusable", + "filename": "RootFormSubAllButNoEvents.TD.json", + "line": 21, + "cfLine": 28, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicEmpty.json new file mode 100644 index 0000000000..c02ea477ac --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormTopicEmpty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "RootFormTopicEmpty.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelEmpty.json new file mode 100644 index 0000000000..9811ea2500 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormTopicLevelEmpty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "RootFormTopicLevelEmpty.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelInvalid.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelInvalid.json new file mode 100644 index 0000000000..4781807c8d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelInvalid.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormTopicLevelInvalid.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "RootFormTopicLevelInvalid.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicReservedStart.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicReservedStart.json new file mode 100644 index 0000000000..b1474ee774 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicReservedStart.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormTopicReservedStart.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "RootFormTopicReservedStart.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenActionWhenSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenActionWhenSubAll.json new file mode 100644 index 0000000000..a5f6e79af9 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenActionWhenSubAll.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormTopicTokenActionWhenSubAll.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "RootFormTopicTokenActionWhenSubAll.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenConsumerIdWhenSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenConsumerIdWhenSubAll.json new file mode 100644 index 0000000000..e9f54fb015 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenConsumerIdWhenSubAll.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormTopicTokenConsumerIdWhenSubAll.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "RootFormTopicTokenConsumerIdWhenSubAll.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomEmpty.json new file mode 100644 index 0000000000..6bf713ceb8 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormTopicTokenCustomEmpty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "RootFormTopicTokenCustomEmpty.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomInvalid.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomInvalid.json new file mode 100644 index 0000000000..7014d13273 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomInvalid.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormTopicTokenCustomInvalid.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "RootFormTopicTokenCustomInvalid.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenEmpty.json new file mode 100644 index 0000000000..fdeeb9539b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormTopicTokenEmpty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "RootFormTopicTokenEmpty.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenExecutorId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenExecutorId.json new file mode 100644 index 0000000000..cd26b5936c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenExecutorId.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormTopicTokenExecutorId.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "RootFormTopicTokenExecutorId.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenInvokerId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenInvokerId.json new file mode 100644 index 0000000000..d1068625d4 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenInvokerId.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormTopicTokenInvokerId.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "RootFormTopicTokenInvokerId.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenMaintainerIdWhenSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenMaintainerIdWhenSubAll.json new file mode 100644 index 0000000000..c25cb7061f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenMaintainerIdWhenSubAll.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormTopicTokenMaintainerIdWhenSubAll.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "RootFormTopicTokenMaintainerIdWhenSubAll.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.json new file mode 100644 index 0000000000..ab2bae80c6 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenReadAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenReadAll.json new file mode 100644 index 0000000000..116ca1b984 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenReadAll.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormTopicTokenSenderIdWhenReadAll.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "RootFormTopicTokenSenderIdWhenReadAll.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenWriteMulti.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenWriteMulti.json new file mode 100644 index 0000000000..53263e98d9 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenWriteMulti.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormTopicTokenSenderIdWhenWriteMulti.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "RootFormTopicTokenSenderIdWhenWriteMulti.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenUnrecognized.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenUnrecognized.json new file mode 100644 index 0000000000..fcc38a1c22 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenUnrecognized.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormTopicTokenUnrecognized.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "RootFormTopicTokenUnrecognized.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormWriteMultiButNoWritableProperties.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormWriteMultiButNoWritableProperties.json new file mode 100644 index 0000000000..dd94ce2c68 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormWriteMultiButNoWritableProperties.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormWriteMultiButNoWritableProperties.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Unusable", + "filename": "RootFormWriteMultiButNoWritableProperties.TD.json", + "line": 27, + "cfLine": 32, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsEmpty.json new file mode 100644 index 0000000000..6fabb9fa56 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/RootFormsEmpty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ElementMissing", + "filename": "RootFormsEmpty.TD.json", + "line": 16, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpReadAllDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpReadAllDuplicate.json new file mode 100644 index 0000000000..22480a36f0 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpReadAllDuplicate.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormsOpReadAllDuplicate.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "RootFormsOpReadAllDuplicate.TD.json", + "line": 21, + "cfLine": 27, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpSubAllDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpSubAllDuplicate.json new file mode 100644 index 0000000000..cd4e098fca --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpSubAllDuplicate.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormsOpSubAllDuplicate.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "RootFormsOpSubAllDuplicate.TD.json", + "line": 21, + "cfLine": 27, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiDuplicate.json new file mode 100644 index 0000000000..400415b800 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiDuplicate.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormsOpWriteMultiDuplicate.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "RootFormsOpWriteMultiDuplicate.TD.json", + "line": 21, + "cfLine": 27, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiNoReadAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiNoReadAll.json new file mode 100644 index 0000000000..f53446cefe --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiNoReadAll.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/RootFormsOpWriteMultiNoReadAll.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "RootFormsOpWriteMultiNoReadAll.TD.json", + "line": 21, + "cfLine": 16, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayConst.json new file mode 100644 index 0000000000..cf0774e27d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayConst.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionArrayConst.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "SchemaDefinitionArrayConst.TD.json", + "line": 22, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsNoType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsNoType.json new file mode 100644 index 0000000000..d811e86d99 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsNoType.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionArrayItemsNoType.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyMissing", + "filename": "SchemaDefinitionArrayItemsNoType.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsNotObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsNotObject.json new file mode 100644 index 0000000000..6b34e9682c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsNotObject.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/SchemaDefinitionArrayItemsNotObject.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "SchemaDefinitionArrayItemsNotObject.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsObjectConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsObjectConst.json new file mode 100644 index 0000000000..d73f5ead2a --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsObjectConst.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionArrayItemsObjectConst.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionArrayItemsObjectConst.TD.json", + "line": 26, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsRef.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsRef.json new file mode 100644 index 0000000000..de43f48d5d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsRef.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionArrayItemsRef.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionArrayItemsRef.TD.json", + "line": 20, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsStringConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsStringConst.json new file mode 100644 index 0000000000..fc3f8d2675 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsStringConst.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionArrayItemsStringConst.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionArrayItemsStringConst.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeNotString.json new file mode 100644 index 0000000000..068d936de8 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeNotString.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/SchemaDefinitionArrayItemsTypeNotString.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "SchemaDefinitionArrayItemsTypeNotString.TD.json", + "line": 20, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeNull.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeNull.json new file mode 100644 index 0000000000..502a0604f3 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeNull.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionArrayItemsTypeNull.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "SchemaDefinitionArrayItemsTypeNull.TD.json", + "line": 20, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeUnsupported.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeUnsupported.json new file mode 100644 index 0000000000..3d21c088ea --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeUnsupported.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/SchemaDefinitionArrayItemsTypeUnsupported.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "SchemaDefinitionArrayItemsTypeUnsupported.TD.json", + "line": 20, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayNoItems.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayNoItems.json new file mode 100644 index 0000000000..bb7063b535 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayNoItems.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionArrayNoItems.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyMissing", + "filename": "SchemaDefinitionArrayNoItems.TD.json", + "line": 17, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanConstValueNotBoolean.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanConstValueNotBoolean.json new file mode 100644 index 0000000000..b59904c8b3 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanConstValueNotBoolean.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionBooleanConstValueNotBoolean.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "SchemaDefinitionBooleanConstValueNotBoolean.TD.json", + "line": 19, + "cfLine": 18, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanReadOnly.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanReadOnly.json new file mode 100644 index 0000000000..a52e11f31b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanReadOnly.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionBooleanReadOnly.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionBooleanReadOnly.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanUnsupportedProperty.json new file mode 100644 index 0000000000..62ee5ad39a --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanUnsupportedProperty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionBooleanUnsupportedProperty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionBooleanUnsupportedProperty.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueAboveMax.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueAboveMax.json new file mode 100644 index 0000000000..4e542fdcf2 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueAboveMax.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionIntegerConstValueAboveMax.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "SchemaDefinitionIntegerConstValueAboveMax.TD.json", + "line": 20, + "cfLine": 19, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueBelowMin.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueBelowMin.json new file mode 100644 index 0000000000..053d0d0fee --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueBelowMin.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionIntegerConstValueBelowMin.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "SchemaDefinitionIntegerConstValueBelowMin.TD.json", + "line": 20, + "cfLine": 19, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueNotInteger.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueNotInteger.json new file mode 100644 index 0000000000..2f330f7f89 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueNotInteger.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionIntegerConstValueNotInteger.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "SchemaDefinitionIntegerConstValueNotInteger.TD.json", + "line": 19, + "cfLine": 18, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueNotNumeric.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueNotNumeric.json new file mode 100644 index 0000000000..d8b327ef26 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueNotNumeric.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionIntegerConstValueNotNumeric.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "SchemaDefinitionIntegerConstValueNotNumeric.TD.json", + "line": 19, + "cfLine": 18, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMaxNotInteger.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMaxNotInteger.json new file mode 100644 index 0000000000..5cc9d19e37 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMaxNotInteger.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionIntegerMaxNotInteger.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "SchemaDefinitionIntegerMaxNotInteger.TD.json", + "line": 20, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMaxNotNumeric.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMaxNotNumeric.json new file mode 100644 index 0000000000..8819ffbc74 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMaxNotNumeric.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/SchemaDefinitionIntegerMaxNotNumeric.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "SchemaDefinitionIntegerMaxNotNumeric.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinAboveMax.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinAboveMax.json new file mode 100644 index 0000000000..eba255cc64 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinAboveMax.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionIntegerMinAboveMax.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "SchemaDefinitionIntegerMinAboveMax.TD.json", + "line": 20, + "cfLine": 19, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinNotInteger.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinNotInteger.json new file mode 100644 index 0000000000..57baa90ae9 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinNotInteger.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionIntegerMinNotInteger.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "SchemaDefinitionIntegerMinNotInteger.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinNotNumeric.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinNotNumeric.json new file mode 100644 index 0000000000..33575e9678 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinNotNumeric.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/SchemaDefinitionIntegerMinNotNumeric.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "SchemaDefinitionIntegerMinNotNumeric.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerReadOnly.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerReadOnly.json new file mode 100644 index 0000000000..38d8d5fb9f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerReadOnly.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionIntegerReadOnly.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionIntegerReadOnly.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerUnsupportedProperty.json new file mode 100644 index 0000000000..9a5ac61643 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerUnsupportedProperty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionIntegerUnsupportedProperty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionIntegerUnsupportedProperty.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNoType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNoType.json new file mode 100644 index 0000000000..9d70f6adfe --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNoType.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesNoType.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyMissing", + "filename": "SchemaDefinitionMapAdditionalPropertiesNoType.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNotObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNotObject.json new file mode 100644 index 0000000000..a1c32597b5 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNotObject.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/SchemaDefinitionMapAdditionalPropertiesNotObject.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "SchemaDefinitionMapAdditionalPropertiesNotObject.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesObjectConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesObjectConst.json new file mode 100644 index 0000000000..30913006f0 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesObjectConst.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesObjectConst.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionMapAdditionalPropertiesObjectConst.TD.json", + "line": 26, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesRef.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesRef.json new file mode 100644 index 0000000000..89766f9e9c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesRef.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionMapAdditionalPropertiesRef.TD.json", + "line": 20, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesStringConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesStringConst.json new file mode 100644 index 0000000000..c91e376341 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesStringConst.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesStringConst.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionMapAdditionalPropertiesStringConst.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNotString.json new file mode 100644 index 0000000000..5061d74318 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNotString.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeNotString.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "SchemaDefinitionMapAdditionalPropertiesTypeNotString.TD.json", + "line": 20, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNull.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNull.json new file mode 100644 index 0000000000..94ff482a56 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNull.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesTypeNull.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "SchemaDefinitionMapAdditionalPropertiesTypeNull.TD.json", + "line": 20, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.json new file mode 100644 index 0000000000..dfe79fb7b3 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TD.json", + "line": 20, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapConst.json new file mode 100644 index 0000000000..a3160181fb --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapConst.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionMapConst.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionMapConst.TD.json", + "line": 22, + "cfLine": 19, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNoType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNoType.json new file mode 100644 index 0000000000..c426bfcf14 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNoType.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionNoType.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyMissing", + "filename": "SchemaDefinitionNoType.TD.json", + "line": 17, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueAboveMax.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueAboveMax.json new file mode 100644 index 0000000000..4b6cdd83da --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueAboveMax.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionNumberConstValueAboveMax.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "SchemaDefinitionNumberConstValueAboveMax.TD.json", + "line": 20, + "cfLine": 19, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueBelowMin.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueBelowMin.json new file mode 100644 index 0000000000..f72aa1e8ac --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueBelowMin.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionNumberConstValueBelowMin.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "SchemaDefinitionNumberConstValueBelowMin.TD.json", + "line": 20, + "cfLine": 19, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueNotNumeric.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueNotNumeric.json new file mode 100644 index 0000000000..8bc1c75647 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueNotNumeric.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionNumberConstValueNotNumeric.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "SchemaDefinitionNumberConstValueNotNumeric.TD.json", + "line": 19, + "cfLine": 18, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMaxNotNumeric.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMaxNotNumeric.json new file mode 100644 index 0000000000..9ac3d05494 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMaxNotNumeric.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/SchemaDefinitionNumberMaxNotNumeric.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "SchemaDefinitionNumberMaxNotNumeric.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMinAboveMax.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMinAboveMax.json new file mode 100644 index 0000000000..5731f7914b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMinAboveMax.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionNumberMinAboveMax.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "SchemaDefinitionNumberMinAboveMax.TD.json", + "line": 20, + "cfLine": 19, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMinNotNumeric.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMinNotNumeric.json new file mode 100644 index 0000000000..d0b2f5b922 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMinNotNumeric.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/SchemaDefinitionNumberMinNotNumeric.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "SchemaDefinitionNumberMinNotNumeric.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberReadOnly.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberReadOnly.json new file mode 100644 index 0000000000..d85876fc4a --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberReadOnly.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionNumberReadOnly.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionNumberReadOnly.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberUnsupportedProperty.json new file mode 100644 index 0000000000..3114dca13e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberUnsupportedProperty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionNumberUnsupportedProperty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionNumberUnsupportedProperty.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectBothDeterminants.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectBothDeterminants.json new file mode 100644 index 0000000000..f05d77fa25 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectBothDeterminants.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectBothDeterminants.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "SchemaDefinitionObjectBothDeterminants.TD.json", + "line": 19, + "cfLine": 24, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstNotObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstNotObject.json new file mode 100644 index 0000000000..b726ae7cb3 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstNotObject.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstNotObject.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "SchemaDefinitionObjectConstNotObject.TD.json", + "line": 24, + "cfLine": 18, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanConst.json new file mode 100644 index 0000000000..374215a3e4 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanConst.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanConst.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionObjectConstPropertyBooleanConst.TD.json", + "line": 22, + "cfLine": 25, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.json new file mode 100644 index 0000000000..3c65004ab7 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TD.json", + "line": 25, + "cfLine": 21, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.json new file mode 100644 index 0000000000..dd393f833e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TD.json", + "line": 22, + "cfLine": 25, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerAboveMax.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerAboveMax.json new file mode 100644 index 0000000000..f78fdfd8e2 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerAboveMax.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerAboveMax.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "SchemaDefinitionObjectConstPropertyIntegerAboveMax.TD.json", + "line": 26, + "cfLine": 22, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerBelowMin.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerBelowMin.json new file mode 100644 index 0000000000..b4e0aee0c2 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerBelowMin.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerBelowMin.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "SchemaDefinitionObjectConstPropertyIntegerBelowMin.TD.json", + "line": 26, + "cfLine": 22, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerConst.json new file mode 100644 index 0000000000..a977056566 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerConst.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerConst.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionObjectConstPropertyIntegerConst.TD.json", + "line": 22, + "cfLine": 25, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotInteger.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotInteger.json new file mode 100644 index 0000000000..b589ddde9c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotInteger.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotInteger.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "SchemaDefinitionObjectConstPropertyIntegerNotInteger.TD.json", + "line": 25, + "cfLine": 21, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.json new file mode 100644 index 0000000000..04b7ef1196 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TD.json", + "line": 25, + "cfLine": 21, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.json new file mode 100644 index 0000000000..6ab54fa997 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TD.json", + "line": 22, + "cfLine": 25, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNoType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNoType.json new file mode 100644 index 0000000000..8b2747936e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNoType.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyNoType.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyMissing", + "filename": "SchemaDefinitionObjectConstPropertyNoType.TD.json", + "line": 20, + "cfLine": 23, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNoValue.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNoValue.json new file mode 100644 index 0000000000..eca042c1a6 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNoValue.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyNoValue.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ItemNotFound", + "filename": "SchemaDefinitionObjectConstPropertyNoValue.TD.json", + "line": 20, + "cfLine": 24, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberAboveMax.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberAboveMax.json new file mode 100644 index 0000000000..0e0a75a809 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberAboveMax.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberAboveMax.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "SchemaDefinitionObjectConstPropertyNumberAboveMax.TD.json", + "line": 26, + "cfLine": 22, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberBelowMin.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberBelowMin.json new file mode 100644 index 0000000000..df58b5e57b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberBelowMin.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberBelowMin.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "SchemaDefinitionObjectConstPropertyNumberBelowMin.TD.json", + "line": 26, + "cfLine": 22, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberConst.json new file mode 100644 index 0000000000..15470543f3 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberConst.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberConst.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionObjectConstPropertyNumberConst.TD.json", + "line": 22, + "cfLine": 25, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberNotNumeric.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberNotNumeric.json new file mode 100644 index 0000000000..7761267489 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberNotNumeric.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberNotNumeric.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "SchemaDefinitionObjectConstPropertyNumberNotNumeric.TD.json", + "line": 25, + "cfLine": 21, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.json new file mode 100644 index 0000000000..cb9627731f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TD.json", + "line": 22, + "cfLine": 25, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringConst.json new file mode 100644 index 0000000000..2cb8700f21 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringConst.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyStringConst.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionObjectConstPropertyStringConst.TD.json", + "line": 22, + "cfLine": 25, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.json new file mode 100644 index 0000000000..105ac618ac --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TD.json", + "line": 22, + "cfLine": 25, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringValueNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringValueNotString.json new file mode 100644 index 0000000000..cb4f4c785d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringValueNotString.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyStringValueNotString.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "SchemaDefinitionObjectConstPropertyStringValueNotString.TD.json", + "line": 25, + "cfLine": 21, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeArray.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeArray.json new file mode 100644 index 0000000000..b1f0255987 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeArray.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeArray.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "SchemaDefinitionObjectConstPropertyTypeArray.TD.json", + "line": 21, + "cfLine": 27, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeNull.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeNull.json new file mode 100644 index 0000000000..675cad51fb --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeNull.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeNull.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "SchemaDefinitionObjectConstPropertyTypeNull.TD.json", + "line": 21, + "cfLine": 24, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeObject.json new file mode 100644 index 0000000000..eb86b22902 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeObject.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeObject.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "SchemaDefinitionObjectConstPropertyTypeObject.TD.json", + "line": 21, + "cfLine": 29, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeUnsupported.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeUnsupported.json new file mode 100644 index 0000000000..b7e8521861 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeUnsupported.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/SchemaDefinitionObjectConstPropertyTypeUnsupported.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "SchemaDefinitionObjectConstPropertyTypeUnsupported.TD.json", + "line": 21, + "cfLine": 24, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstUnsupportedProperty.json new file mode 100644 index 0000000000..8d1cda5b10 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstUnsupportedProperty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstUnsupportedProperty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionObjectConstUnsupportedProperty.TD.json", + "line": 24, + "cfLine": 25, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstValueNoSchema.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstValueNoSchema.json new file mode 100644 index 0000000000..e69be1eccb --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstValueNoSchema.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstValueNoSchema.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ItemNotFound", + "filename": "SchemaDefinitionObjectConstValueNoSchema.TD.json", + "line": 22, + "cfLine": 19, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessageNoProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessageNoProperty.json new file mode 100644 index 0000000000..9334c2329a --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessageNoProperty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectErrorMessageNoProperty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ItemNotFound", + "filename": "SchemaDefinitionObjectErrorMessageNoProperty.TD.json", + "line": 21, + "cfLine": 19, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessageNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessageNotString.json new file mode 100644 index 0000000000..0473d40ac8 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessageNotString.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectErrorMessageNotString.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "SchemaDefinitionObjectErrorMessageNotString.TD.json", + "line": 24, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessagePropertyNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessagePropertyNotString.json new file mode 100644 index 0000000000..2bd1693dff --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessagePropertyNotString.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectErrorMessagePropertyNotString.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "SchemaDefinitionObjectErrorMessagePropertyNotString.TD.json", + "line": 24, + "cfLine": 20, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectNoDeterminant.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectNoDeterminant.json new file mode 100644 index 0000000000..687426fa0b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectNoDeterminant.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectNoDeterminant.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyMissing", + "filename": "SchemaDefinitionObjectNoDeterminant.TD.json", + "line": 17, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertiesNotObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertiesNotObject.json new file mode 100644 index 0000000000..1841dee809 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertiesNotObject.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectPropertiesNotObject.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "SchemaDefinitionObjectPropertiesNotObject.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyNoType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyNoType.json new file mode 100644 index 0000000000..9953bd371e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyNoType.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectPropertyNoType.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyMissing", + "filename": "SchemaDefinitionObjectPropertyNoType.TD.json", + "line": 20, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyObjectConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyObjectConst.json new file mode 100644 index 0000000000..c062008470 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyObjectConst.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectPropertyObjectConst.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionObjectPropertyObjectConst.TD.json", + "line": 27, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyRef.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyRef.json new file mode 100644 index 0000000000..9f782c5737 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyRef.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectPropertyRef.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionObjectPropertyRef.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyStringConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyStringConst.json new file mode 100644 index 0000000000..74205b2fa0 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyStringConst.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectPropertyStringConst.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionObjectPropertyStringConst.TD.json", + "line": 22, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeNotString.json new file mode 100644 index 0000000000..795e30fbc5 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeNotString.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/SchemaDefinitionObjectPropertyTypeNotString.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "SchemaDefinitionObjectPropertyTypeNotString.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeNull.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeNull.json new file mode 100644 index 0000000000..5ee9031d1e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeNull.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectPropertyTypeNull.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "SchemaDefinitionObjectPropertyTypeNull.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeUnsupported.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeUnsupported.json new file mode 100644 index 0000000000..581ab0009f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeUnsupported.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/SchemaDefinitionObjectPropertyTypeUnsupported.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "SchemaDefinitionObjectPropertyTypeUnsupported.TD.json", + "line": 21, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectRequiredNoProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectRequiredNoProperty.json new file mode 100644 index 0000000000..703f1ee90d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectRequiredNoProperty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectRequiredNoProperty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ItemNotFound", + "filename": "SchemaDefinitionObjectRequiredNoProperty.TD.json", + "line": 21, + "cfLine": 19, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectRequiredNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectRequiredNotString.json new file mode 100644 index 0000000000..cab2c153cd --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectRequiredNotString.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/SchemaDefinitionObjectRequiredNotString.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "SchemaDefinitionObjectRequiredNotString.TD.json", + "line": 24, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionRef.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionRef.json new file mode 100644 index 0000000000..cee2c233cf --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionRef.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionRef.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionRef.TD.json", + "line": 18, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstContentEncoding.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstContentEncoding.json new file mode 100644 index 0000000000..8de7392776 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstContentEncoding.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringConstContentEncoding.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionStringConstContentEncoding.TD.json", + "line": 20, + "cfLine": 19, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstFormat.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstFormat.json new file mode 100644 index 0000000000..b79435602a --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstFormat.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringConstFormat.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionStringConstFormat.TD.json", + "line": 20, + "cfLine": 19, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstPattern.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstPattern.json new file mode 100644 index 0000000000..56791b7ee5 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstPattern.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringConstPattern.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionStringConstPattern.TD.json", + "line": 20, + "cfLine": 19, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstUnsupportedProperty.json new file mode 100644 index 0000000000..a8852e3605 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstUnsupportedProperty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringConstUnsupportedProperty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionStringConstUnsupportedProperty.TD.json", + "line": 20, + "cfLine": 19, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstValueNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstValueNotString.json new file mode 100644 index 0000000000..28fb05a1a4 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstValueNotString.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringConstValueNotString.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "SchemaDefinitionStringConstValueNotString.TD.json", + "line": 19, + "cfLine": 18, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringContentEncodingNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringContentEncodingNotString.json new file mode 100644 index 0000000000..77e676bd5e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringContentEncodingNotString.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/SchemaDefinitionStringContentEncodingNotString.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "SchemaDefinitionStringContentEncodingNotString.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringContentEncodingUnsupportedValue.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringContentEncodingUnsupportedValue.json new file mode 100644 index 0000000000..90d50a1aee --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringContentEncodingUnsupportedValue.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringContentEncodingUnsupportedValue.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "SchemaDefinitionStringContentEncodingUnsupportedValue.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumConst.json new file mode 100644 index 0000000000..1d3b8efc37 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumConst.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringEnumConst.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionStringEnumConst.TD.json", + "line": 20, + "cfLine": 19, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumContentEncoding.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumContentEncoding.json new file mode 100644 index 0000000000..9a4a257727 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumContentEncoding.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringEnumContentEncoding.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionStringEnumContentEncoding.TD.json", + "line": 20, + "cfLine": 19, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumElementInvalid.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumElementInvalid.json new file mode 100644 index 0000000000..1fd99bc46c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumElementInvalid.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringEnumElementInvalid.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "SchemaDefinitionStringEnumElementInvalid.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumFormat.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumFormat.json new file mode 100644 index 0000000000..d13a7c33ef --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumFormat.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringEnumFormat.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionStringEnumFormat.TD.json", + "line": 20, + "cfLine": 19, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumPattern.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumPattern.json new file mode 100644 index 0000000000..bf183a756a --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumPattern.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringEnumPattern.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionStringEnumPattern.TD.json", + "line": 20, + "cfLine": 19, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumReadOnly.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumReadOnly.json new file mode 100644 index 0000000000..4e11cab18c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumReadOnly.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringEnumReadOnly.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionStringEnumReadOnly.TD.json", + "line": 20, + "cfLine": 19, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumUnsupportedProperty.json new file mode 100644 index 0000000000..ce000a6489 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumUnsupportedProperty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringEnumUnsupportedProperty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionStringEnumUnsupportedProperty.TD.json", + "line": 20, + "cfLine": 19, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatAndContentEncoding.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatAndContentEncoding.json new file mode 100644 index 0000000000..02ab669ff0 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatAndContentEncoding.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringFormatAndContentEncoding.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "SchemaDefinitionStringFormatAndContentEncoding.TD.json", + "line": 17, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatAndPattern.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatAndPattern.json new file mode 100644 index 0000000000..6bc35673d2 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatAndPattern.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringFormatAndPattern.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "SchemaDefinitionStringFormatAndPattern.TD.json", + "line": 17, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatNotString.json new file mode 100644 index 0000000000..ad3f04cbf9 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatNotString.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/SchemaDefinitionStringFormatNotString.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "SchemaDefinitionStringFormatNotString.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatUnsupportedValue.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatUnsupportedValue.json new file mode 100644 index 0000000000..66bd1921e9 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatUnsupportedValue.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringFormatUnsupportedValue.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "SchemaDefinitionStringFormatUnsupportedValue.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternAndContentEncoding.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternAndContentEncoding.json new file mode 100644 index 0000000000..4461cac873 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternAndContentEncoding.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringPatternAndContentEncoding.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "SchemaDefinitionStringPatternAndContentEncoding.TD.json", + "line": 17, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternNotDurationOrDecimal.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternNotDurationOrDecimal.json new file mode 100644 index 0000000000..e8266d6eee --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternNotDurationOrDecimal.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringPatternNotDurationOrDecimal.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "SchemaDefinitionStringPatternNotDurationOrDecimal.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternNotString.json new file mode 100644 index 0000000000..366554f372 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternNotString.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/SchemaDefinitionStringPatternNotString.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "SchemaDefinitionStringPatternNotString.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternRegexInvalid.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternRegexInvalid.json new file mode 100644 index 0000000000..19cb53f801 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternRegexInvalid.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringPatternRegexInvalid.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "SchemaDefinitionStringPatternRegexInvalid.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringReadOnly.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringReadOnly.json new file mode 100644 index 0000000000..f79784d282 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringReadOnly.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringReadOnly.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionStringReadOnly.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringUnsupportedProperty.json new file mode 100644 index 0000000000..b85ab346cc --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringUnsupportedProperty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringUnsupportedProperty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "SchemaDefinitionStringUnsupportedProperty.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeNotString.json new file mode 100644 index 0000000000..289fec49e7 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeNotString.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/SchemaDefinitionTypeNotString.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "SchemaDefinitionTypeNotString.TD.json", + "line": 18, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeNull.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeNull.json new file mode 100644 index 0000000000..54f8150092 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeNull.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/SchemaDefinitionTypeNull.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "SchemaDefinitionTypeNull.TD.json", + "line": 18, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeUnsupported.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeUnsupported.json new file mode 100644 index 0000000000..ff170807e6 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeUnsupported.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/SchemaDefinitionTypeUnsupported.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "SchemaDefinitionTypeUnsupported.TD.json", + "line": 18, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleEmpty.json new file mode 100644 index 0000000000..8a6cee690c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/TitleEmpty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "TitleEmpty.TD.json", + "line": 7, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleInvalid.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleInvalid.json new file mode 100644 index 0000000000..b0aca0d3ba --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleInvalid.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/TitleInvalid.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "TitleInvalid.TD.json", + "line": 7, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleNotString.json new file mode 100644 index 0000000000..3a8b6188b7 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleNotString.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidThing/TitleNotString.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "TitleNotString.TD.json", + "line": 7, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TrailingComma.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TrailingComma.json new file mode 100644 index 0000000000..0c0cd7a4f4 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TrailingComma.json @@ -0,0 +1,23 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidJson/TrailingComma.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "TrailingComma.TD.json", + "line": 19, + "cfLine": 0, + "crossRef": "" + }, + { + "condition": "JsonInvalid", + "filename": "TrailingComma.TD.json", + "line": 24, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedArray.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedArray.json new file mode 100644 index 0000000000..7c3815c838 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedArray.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidJson/UnclosedArray.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "UnclosedArray.TD.json", + "line": 25, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedObject.json new file mode 100644 index 0000000000..508918db1e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedObject.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidJson/UnclosedObject.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "JsonInvalid", + "filename": "UnclosedObject.TD.json", + "line": 24, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnsupportedLanguage.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnsupportedLanguage.json new file mode 100644 index 0000000000..ddae1dac11 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnsupportedLanguage.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "valid/Noop.TD.json" ], + "lang": "haskell" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "", + "line": 0, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/IdInvalidReplacementButNotInTopic.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/IdInvalidReplacementButNotInTopic.json new file mode 100644 index 0000000000..55a0504732 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/IdInvalidReplacementButNotInTopic.json @@ -0,0 +1,7 @@ +{ + "success": true, + "commandLine": { + "thingFiles": [ "valid/IdInvalidReplacementButNotInTopic.TD.json" ], + "lang": "none" + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/LinkNoRel.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/LinkNoRel.json new file mode 100644 index 0000000000..68206dfdef --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/LinkNoRel.json @@ -0,0 +1,7 @@ +{ + "success": true, + "commandLine": { + "thingFiles": [ "valid/LinkNoRel.TD.json" ], + "lang": "none" + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/LinkOtherRel.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/LinkOtherRel.json new file mode 100644 index 0000000000..44419d3c6e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/LinkOtherRel.json @@ -0,0 +1,7 @@ +{ + "success": true, + "commandLine": { + "thingFiles": [ "valid/LinkOtherRel.TD.json" ], + "lang": "none" + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.json new file mode 100644 index 0000000000..09fe1c6b58 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.json @@ -0,0 +1,15 @@ +{ + "success": true, + "commandLine": { + "thingFiles": [ "valid/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TD.json" ], + "lang": "none" + }, + "warnings": [ + { + "filename": "RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TD.json", + "line": 27, + "cfLine": 41, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.json new file mode 100644 index 0000000000..205dfef164 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.json @@ -0,0 +1,15 @@ +{ + "success": true, + "commandLine": { + "thingFiles": [ "valid/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TD.json" ], + "lang": "none" + }, + "warnings": [ + { + "filename": "RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TD.json", + "line": 32, + "cfLine": 47, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/.vscode/settings.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/.vscode/settings.json new file mode 100644 index 0000000000..b36ab1a995 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + "json.schemaDownload.enable": true, + "json.schemas": [ + { + "fileMatch": [ "**/*.TD.json" ], + "url": "../../../schema/aio-td-json-schema.json" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeEmpty.TD.json new file mode 100644 index 0000000000..7e1a44d305 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeEmpty.TD.json @@ -0,0 +1,56 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "string", + "enum": [ + "Success", + "Failure" + ] + }, + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "additionalResponses": [ + { + "success": false, + "schema": "Error", + "contentType": "" + } + ] + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeText.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeText.TD.json new file mode 100644 index 0000000000..158124ccc2 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeText.TD.json @@ -0,0 +1,56 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "string", + "enum": [ + "Success", + "Failure" + ] + }, + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "additionalResponses": [ + { + "success": false, + "schema": "Error", + "contentType": "application/text" + } + ] + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoMatchingSchemaDefinition.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoMatchingSchemaDefinition.TD.json new file mode 100644 index 0000000000..3b6a074c35 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoMatchingSchemaDefinition.TD.json @@ -0,0 +1,48 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "object", + "properties": { + "condition": { + "type": "string" + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "additionalResponses": [ + { + "success": false, + "schema": "Error" + } + ] + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchema.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchema.TD.json new file mode 100644 index 0000000000..aa036d0523 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchema.TD.json @@ -0,0 +1,55 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "object", + "properties": { + "condition": { + "type": "string" + } + } + }, + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "additionalResponses": [ + { + "success": false + } + ] + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchemaDefinitions.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchemaDefinitions.TD.json new file mode 100644 index 0000000000..82488efbc5 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchemaDefinitions.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "additionalResponses": [ + { + "success": false, + "schema": "Error" + } + ] + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSuccess.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSuccess.TD.json new file mode 100644 index 0000000000..7b71a6e8de --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSuccess.TD.json @@ -0,0 +1,55 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "string", + "enum": [ + "Success", + "Failure" + ] + }, + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "additionalResponses": [ + { + "schema": "Error", + "contentType": "application/json" + } + ] + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionMap.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionMap.TD.json new file mode 100644 index 0000000000..aed295edc5 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionMap.TD.json @@ -0,0 +1,53 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "string", + "enum": [ + "Success", + "Failure" + ] + }, + "Error": { + "type": "object", + "dtv:additionalProperties": { + "type": "string" + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "additionalResponses": [ + { + "success": false, + "schema": "Error" + } + ] + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionNotObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionNotObject.TD.json new file mode 100644 index 0000000000..cb2aab2091 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionNotObject.TD.json @@ -0,0 +1,55 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "string", + "enum": [ + "Success", + "Failure" + ] + }, + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "additionalResponses": [ + { + "success": false, + "schema": "Condition" + } + ] + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaEmpty.TD.json new file mode 100644 index 0000000000..487cf3f8c7 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaEmpty.TD.json @@ -0,0 +1,56 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "object", + "properties": { + "condition": { + "type": "string" + } + } + }, + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "additionalResponses": [ + { + "success": false, + "schema": "" + } + ] + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSuccessTrue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSuccessTrue.TD.json new file mode 100644 index 0000000000..178724fc4d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSuccessTrue.TD.json @@ -0,0 +1,56 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "string", + "enum": [ + "Success", + "Failure" + ] + }, + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "additionalResponses": [ + { + "success": true, + "schema": "Error", + "contentType": "application/json" + } + ] + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseUnsupportedProperty.TD.json new file mode 100644 index 0000000000..cb9c2936ff --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseUnsupportedProperty.TD.json @@ -0,0 +1,57 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "string", + "enum": [ + "Success", + "Failure" + ] + }, + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "additionalResponses": [ + { + "success": false, + "schema": "Error", + "contentType": "application/json", + "foobar": "hello" + } + ] + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponsesMultiple.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponsesMultiple.TD.json new file mode 100644 index 0000000000..25f3fe0290 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponsesMultiple.TD.json @@ -0,0 +1,60 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "object", + "properties": { + "condition": { + "type": "string" + } + } + }, + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "additionalResponses": [ + { + "success": false, + "schema": "Condition" + }, + { + "success": false, + "schema": "Error" + } + ] + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormContentTypeText.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormContentTypeText.TD.json new file mode 100644 index 0000000000..93ed2ef6b6 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormContentTypeText.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/text", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeEmpty.TD.json new file mode 100644 index 0000000000..a9f448c725 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeEmpty.TD.json @@ -0,0 +1,33 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "dtv:headerCode": "" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoMatchingSchemaDefinition.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoMatchingSchemaDefinition.TD.json new file mode 100644 index 0000000000..0f2f30cee9 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoMatchingSchemaDefinition.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "string" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "dtv:headerCode": "Status" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoSchemaDefinitions.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoSchemaDefinitions.TD.json new file mode 100644 index 0000000000..9e0835bf23 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoSchemaDefinitions.TD.json @@ -0,0 +1,33 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "dtv:headerCode": "Status" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeSchemaDefinitionNotEnum.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeSchemaDefinitionNotEnum.TD.json new file mode 100644 index 0000000000..30153f1635 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeSchemaDefinitionNotEnum.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "string" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "dtv:headerCode": "Condition" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeEmpty.TD.json new file mode 100644 index 0000000000..09a14add91 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeEmpty.TD.json @@ -0,0 +1,56 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "string", + "enum": [ + "Success", + "Failure" + ] + }, + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "dtv:headerInfo": [ + { + "success": false, + "schema": "Error", + "contentType": "" + } + ] + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeNotJson.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeNotJson.TD.json new file mode 100644 index 0000000000..ccac432754 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeNotJson.TD.json @@ -0,0 +1,56 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "string", + "enum": [ + "Success", + "Failure" + ] + }, + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "dtv:headerInfo": [ + { + "success": false, + "schema": "Error", + "contentType": "application/text" + } + ] + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoContentType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoContentType.TD.json new file mode 100644 index 0000000000..b898bbf397 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoContentType.TD.json @@ -0,0 +1,55 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "string", + "enum": [ + "Success", + "Failure" + ] + }, + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "dtv:headerInfo": [ + { + "success": false, + "schema": "Error" + } + ] + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoMatchingSchemaDefinition.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoMatchingSchemaDefinition.TD.json new file mode 100644 index 0000000000..d2eca71dd6 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoMatchingSchemaDefinition.TD.json @@ -0,0 +1,49 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "object", + "properties": { + "condition": { + "type": "string" + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "dtv:headerInfo": [ + { + "success": false, + "schema": "Error", + "contentType": "application/json" + } + ] + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchema.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchema.TD.json new file mode 100644 index 0000000000..ebe0481e4b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchema.TD.json @@ -0,0 +1,56 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "object", + "properties": { + "condition": { + "type": "string" + } + } + }, + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "dtv:headerInfo": [ + { + "success": false, + "contentType": "application/json" + } + ] + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchemaDefinitions.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchemaDefinitions.TD.json new file mode 100644 index 0000000000..b3221bb827 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchemaDefinitions.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "dtv:headerInfo": [ + { + "success": false, + "schema": "Error", + "contentType": "application/json" + } + ] + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionMap.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionMap.TD.json new file mode 100644 index 0000000000..525e2fed9c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionMap.TD.json @@ -0,0 +1,54 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "string", + "enum": [ + "Success", + "Failure" + ] + }, + "Error": { + "type": "object", + "dtv:additionalProperties": { + "type": "string" + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "dtv:headerInfo": [ + { + "success": false, + "schema": "Error", + "contentType": "application/json" + } + ] + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionNotObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionNotObject.TD.json new file mode 100644 index 0000000000..cc2a886db3 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionNotObject.TD.json @@ -0,0 +1,56 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "string", + "enum": [ + "Success", + "Failure" + ] + }, + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "dtv:headerInfo": [ + { + "success": false, + "schema": "Condition", + "contentType": "application/json" + } + ] + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaEmpty.TD.json new file mode 100644 index 0000000000..881f5c34b8 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaEmpty.TD.json @@ -0,0 +1,57 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "object", + "properties": { + "condition": { + "type": "string" + } + } + }, + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "dtv:headerInfo": [ + { + "success": false, + "schema": "", + "contentType": "application/json" + } + ] + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSuccessTrue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSuccessTrue.TD.json new file mode 100644 index 0000000000..4b52707d77 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSuccessTrue.TD.json @@ -0,0 +1,56 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "string", + "enum": [ + "Success", + "Failure" + ] + }, + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "dtv:headerInfo": [ + { + "success": true, + "schema": "Error", + "contentType": "application/json" + } + ] + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoUnsupportedProperty.TD.json new file mode 100644 index 0000000000..1f98b72b51 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoUnsupportedProperty.TD.json @@ -0,0 +1,57 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "string", + "enum": [ + "Success", + "Failure" + ] + }, + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "dtv:headerInfo": [ + { + "success": false, + "schema": "Error", + "contentType": "application/json", + "foobar": "hello" + } + ] + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfosMultiple.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfosMultiple.TD.json new file mode 100644 index 0000000000..64011f241c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfosMultiple.TD.json @@ -0,0 +1,62 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "object", + "properties": { + "condition": { + "type": "string" + } + } + }, + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "dtv:headerInfo": [ + { + "success": false, + "schema": "Condition", + "contentType": "application/json" + }, + { + "success": false, + "schema": "Error", + "contentType": "application/json" + } + ] + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormOpInvokeDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormOpInvokeDuplicate.TD.json new file mode 100644 index 0000000000..90d54c6c9d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormOpInvokeDuplicate.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": [ "invokeaction", "invokeaction" ] + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormServiceGroupEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormServiceGroupEmpty.TD.json new file mode 100644 index 0000000000..2dc743f868 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormServiceGroupEmpty.TD.json @@ -0,0 +1,33 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "dtv:serviceGroupId": "" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicNoContentType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicNoContentType.TD.json new file mode 100644 index 0000000000..2d4d47aba1 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicNoContentType.TD.json @@ -0,0 +1,31 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenAction.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenAction.TD.json new file mode 100644 index 0000000000..027799421f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenAction.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{action}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenConsumerId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenConsumerId.TD.json new file mode 100644 index 0000000000..7617fdcfae --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenConsumerId.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{consumerClientId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenMaintainerId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenMaintainerId.TD.json new file mode 100644 index 0000000000..7c2d39287a --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenMaintainerId.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{maintainerId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenSenderId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenSenderId.TD.json new file mode 100644 index 0000000000..7ea54e00a3 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenSenderId.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{senderId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormUnsupportedProperty.TD.json new file mode 100644 index 0000000000..319d57adda --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormUnsupportedProperty.TD.json @@ -0,0 +1,33 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction", + "foobar": "hello" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsMultipleContentTypes.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsMultipleContentTypes.TD.json new file mode 100644 index 0000000000..31a9294833 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsMultipleContentTypes.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction" + }, + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/octet-stream", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOpInvokeDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOpInvokeDuplicate.TD.json new file mode 100644 index 0000000000..a2c5cf5f76 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOpInvokeDuplicate.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction" + }, + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessAndInvoke.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessAndInvoke.TD.json new file mode 100644 index 0000000000..5ea439a45f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessAndInvoke.TD.json @@ -0,0 +1,37 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction" + }, + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessDuplicate.TD.json new file mode 100644 index 0000000000..6bc6f714dc --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessDuplicate.TD.json @@ -0,0 +1,36 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}" + }, + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputMap.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputMap.TD.json new file mode 100644 index 0000000000..81e7f9076b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputMap.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "poke": { + "input": { + "type": "object", + "dtv:additionalProperties": { + "type": "string" + } + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:poke;1", + "contentType": "application/json", + "dtv:topic": "sample/poke/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNullAndContentTypeJson.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNullAndContentTypeJson.TD.json new file mode 100644 index 0000000000..e920f557e7 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNullAndContentTypeJson.TD.json @@ -0,0 +1,35 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "poke": { + "input": { + "type": "null" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:poke;1", + "contentType": "application/json", + "dtv:topic": "sample/poke/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNumber.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNumber.TD.json new file mode 100644 index 0000000000..65dd67cb66 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNumber.TD.json @@ -0,0 +1,35 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "poke": { + "input": { + "type": "number" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:poke;1", + "contentType": "application/json", + "dtv:topic": "sample/poke/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeCustom.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeCustom.TD.json new file mode 100644 index 0000000000..04a710a411 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeCustom.TD.json @@ -0,0 +1,40 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "poke": { + "input": { + "type": "object", + "properties": { + "inVal": { + "type": "string" + } + } + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:poke;1", + "contentType": "", + "dtv:topic": "sample/poke/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeRaw.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeRaw.TD.json new file mode 100644 index 0000000000..c3762ab91e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeRaw.TD.json @@ -0,0 +1,40 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "poke": { + "input": { + "type": "object", + "properties": { + "inVal": { + "type": "string" + } + } + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:poke;1", + "contentType": "application/octet-stream", + "dtv:topic": "sample/poke/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectConst.TD.json new file mode 100644 index 0000000000..bb0f957f82 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectConst.TD.json @@ -0,0 +1,43 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "poke": { + "input": { + "type": "object", + "properties": { + "inVal": { + "type": "string" + } + }, + "const": { + "inVal": "hello" + } + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:poke;1", + "contentType": "application/json", + "dtv:topic": "sample/poke/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectErrorMessage.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectErrorMessage.TD.json new file mode 100644 index 0000000000..b9cd7a91d4 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectErrorMessage.TD.json @@ -0,0 +1,41 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "poke": { + "input": { + "type": "object", + "properties": { + "inVal": { + "type": "string" + } + }, + "dtv:errorMessage": "inVal" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:poke;1", + "contentType": "application/json", + "dtv:topic": "sample/poke/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputString.TD.json new file mode 100644 index 0000000000..39f71ea331 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputString.TD.json @@ -0,0 +1,35 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "poke": { + "input": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:poke;1", + "contentType": "application/json", + "dtv:topic": "sample/poke/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionNoFormsWithTopic.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionNoFormsWithTopic.TD.json new file mode 100644 index 0000000000..883fda8ea8 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionNoFormsWithTopic.TD.json @@ -0,0 +1,31 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputMap.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputMap.TD.json new file mode 100644 index 0000000000..6375aa30a5 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputMap.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "peek": { + "output": { + "type": "object", + "dtv:additionalProperties": { + "type": "string" + } + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:peek;1", + "contentType": "application/json", + "dtv:topic": "sample/peek/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNullAndContentTypeJson.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNullAndContentTypeJson.TD.json new file mode 100644 index 0000000000..b011a18f0b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNullAndContentTypeJson.TD.json @@ -0,0 +1,35 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "peek": { + "output": { + "type": "null" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:peek;1", + "contentType": "application/json", + "dtv:topic": "sample/peek/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNumber.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNumber.TD.json new file mode 100644 index 0000000000..1d035aa02c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNumber.TD.json @@ -0,0 +1,35 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "peek": { + "output": { + "type": "number" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:peek;1", + "contentType": "application/json", + "dtv:topic": "sample/peek/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeCustom.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeCustom.TD.json new file mode 100644 index 0000000000..542df8ede0 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeCustom.TD.json @@ -0,0 +1,40 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "peek": { + "output": { + "type": "object", + "properties": { + "outVal": { + "type": "string" + } + } + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:peek;1", + "contentType": "", + "dtv:topic": "sample/peek/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeRaw.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeRaw.TD.json new file mode 100644 index 0000000000..36dba60935 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeRaw.TD.json @@ -0,0 +1,40 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "peek": { + "output": { + "type": "object", + "properties": { + "outVal": { + "type": "string" + } + } + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:peek;1", + "contentType": "application/octet-stream", + "dtv:topic": "sample/peek/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalid/OneAction.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectConst.TD.json similarity index 54% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalid/OneAction.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectConst.TD.json index ab11e2712b..76d9d3cbb3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalid/OneAction.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectConst.TD.json @@ -3,8 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:OneAction;1", - "title": "OneAction", + "id": "dtmi:test:Noop;1", + "title": "Noop", "securityDefinitions": { "nosec_sc": { "scheme": "nosec" @@ -14,30 +14,23 @@ "nosec_sc" ], "actions": { - "setColor": { - "input": { - "type": "object", - "required": [ "newColor" ], - "properties": { - "newColor": { - "type": "string" - } - } - }, + "peek": { "output": { "type": "object", - "required": [ "oldColor" ], "properties": { - "oldColor": { - "type": "foobar" + "outVal": { + "type": "string" } + }, + "const": { + "outVal": "hello" } }, "forms": [ { - "href": "dtmi:jsonTest:TelemetryAndCommand:_contents:__setColor;1", + "href": "dtmi:test:ProtocolCompiler:peek;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/setColor", + "dtv:topic": "sample/peek/{executorId}", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectErrorMessage.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectErrorMessage.TD.json new file mode 100644 index 0000000000..2ae7d85af2 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectErrorMessage.TD.json @@ -0,0 +1,41 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "peek": { + "output": { + "type": "object", + "properties": { + "outVal": { + "type": "string" + } + }, + "dtv:errorMessage": "outVal" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:peek;1", + "contentType": "application/json", + "dtv:topic": "sample/peek/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputString.TD.json new file mode 100644 index 0000000000..79ef15d295 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputString.TD.json @@ -0,0 +1,35 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "peek": { + "output": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:peek;1", + "contentType": "application/json", + "dtv:topic": "sample/peek/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionUnsupportedProperty.TD.json new file mode 100644 index 0000000000..e46cfcc14b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionUnsupportedProperty.TD.json @@ -0,0 +1,33 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction" + } + ], + "foobar": "hello" + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongPrefix.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongPrefix.TD.json new file mode 100644 index 0000000000..191e96e3ba --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongPrefix.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "foo": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongUri.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongUri.TD.json new file mode 100644 index 0000000000..d8628eda3d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongUri.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/SomethingcElse/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextMissingDtv.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextMissingDtv.TD.json new file mode 100644 index 0000000000..50a41cd542 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextMissingDtv.TD.json @@ -0,0 +1,29 @@ +{ + "@context": "https://www.w3.org/2022/wot/td/v1.1", + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventBooleanConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventBooleanConst.TD.json new file mode 100644 index 0000000000..5d52b938ac --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventBooleanConst.TD.json @@ -0,0 +1,36 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "boolean", + "const": true + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/json", + "dtv:topic": "sample/alert/{modelId}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormAdditionalResponses.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormAdditionalResponses.TD.json new file mode 100644 index 0000000000..515184ed7b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormAdditionalResponses.TD.json @@ -0,0 +1,52 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/json", + "dtv:topic": "sample/alert/{modelId}", + "op": "subscribeevent", + "additionalResponses": [ + { + "success": false, + "contentType": "application/json", + "schema": "Error" + } + ] + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormContentTypeText.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormContentTypeText.TD.json new file mode 100644 index 0000000000..b3682059e5 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormContentTypeText.TD.json @@ -0,0 +1,35 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/text", + "dtv:topic": "sample/alert/{modelId}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderCode.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderCode.TD.json new file mode 100644 index 0000000000..d3c5a03579 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderCode.TD.json @@ -0,0 +1,45 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Status": { + "type": "string", + "enum": [ + "Success", + "Failure" + ] + } + }, + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/json", + "dtv:topic": "sample/alert/{modelId}", + "op": "subscribeevent", + "dtv:headerCode": "Status" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderInfo.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderInfo.TD.json new file mode 100644 index 0000000000..e14f458d3a --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderInfo.TD.json @@ -0,0 +1,52 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/json", + "dtv:topic": "sample/alert/{modelId}", + "op": "subscribeevent", + "dtv:headerInfo": [ + { + "success": false, + "contentType": "application/json", + "schema": "Error" + } + ] + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormOpSubDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormOpSubDuplicate.TD.json new file mode 100644 index 0000000000..b8781d792e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormOpSubDuplicate.TD.json @@ -0,0 +1,35 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/json", + "dtv:topic": "sample/alert/{modelId}", + "op": [ "subscribeevent", "subscribeevent" ] + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormServiceGroupEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormServiceGroupEmpty.TD.json new file mode 100644 index 0000000000..3e0c5889f6 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormServiceGroupEmpty.TD.json @@ -0,0 +1,36 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/json", + "dtv:topic": "sample/alert/{modelId}", + "op": "subscribeevent", + "dtv:serviceGroupId": "" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicNoContentType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicNoContentType.TD.json new file mode 100644 index 0000000000..cbfbe52f39 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicNoContentType.TD.json @@ -0,0 +1,34 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "dtv:topic": "sample/alert/{modelId}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenAction.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenAction.TD.json new file mode 100644 index 0000000000..1f26933b96 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenAction.TD.json @@ -0,0 +1,35 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/json", + "dtv:topic": "sample/alert/{action}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenConsumerId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenConsumerId.TD.json new file mode 100644 index 0000000000..ecac7fa5d0 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenConsumerId.TD.json @@ -0,0 +1,35 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/json", + "dtv:topic": "sample/alert/{consumerClientId}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenExecutorId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenExecutorId.TD.json new file mode 100644 index 0000000000..cdfee2f420 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenExecutorId.TD.json @@ -0,0 +1,35 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/json", + "dtv:topic": "sample/alert/{executorId}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenInvokerId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenInvokerId.TD.json new file mode 100644 index 0000000000..19094dc0b7 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenInvokerId.TD.json @@ -0,0 +1,35 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/json", + "dtv:topic": "sample/alert/{invokerClientId}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenMaintainerId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenMaintainerId.TD.json new file mode 100644 index 0000000000..85c452ccf0 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenMaintainerId.TD.json @@ -0,0 +1,35 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/json", + "dtv:topic": "sample/alert/{maintainerId}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormUnsupportedProperty.TD.json new file mode 100644 index 0000000000..361f1fd5cb --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormUnsupportedProperty.TD.json @@ -0,0 +1,36 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/json", + "dtv:topic": "sample/alert/{modelId}", + "op": "subscribeevent", + "foobar": "hello" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOpSubDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOpSubDuplicate.TD.json new file mode 100644 index 0000000000..5ddde71b93 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOpSubDuplicate.TD.json @@ -0,0 +1,41 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/json", + "dtv:topic": "sample/alert/{modelId}", + "op": "subscribeevent" + }, + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/json", + "dtv:topic": "sample/alert/{modelId}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessAndSub.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessAndSub.TD.json new file mode 100644 index 0000000000..f648f16160 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessAndSub.TD.json @@ -0,0 +1,40 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/json", + "dtv:topic": "sample/alert/{modelId}", + "op": "subscribeevent" + }, + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/json", + "dtv:topic": "sample/alert/{modelId}" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessDuplicate.TD.json new file mode 100644 index 0000000000..ceb39e9226 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessDuplicate.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/json", + "dtv:topic": "sample/alert/{modelId}" + }, + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/json", + "dtv:topic": "sample/alert/{modelId}" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventIntegerConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventIntegerConst.TD.json new file mode 100644 index 0000000000..53a1f47a1b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventIntegerConst.TD.json @@ -0,0 +1,36 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "integer", + "const": 78 + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/json", + "dtv:topic": "sample/alert/{modelId}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNoFormsWithTopicAndNoRootFormSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNoFormsWithTopicAndNoRootFormSubAll.TD.json new file mode 100644 index 0000000000..ced4dd76cd --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNoFormsWithTopicAndNoRootFormSubAll.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNullAndContentTypeJson.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNullAndContentTypeJson.TD.json new file mode 100644 index 0000000000..5910d6f828 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNullAndContentTypeJson.TD.json @@ -0,0 +1,35 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "null" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/json", + "dtv:topic": "sample/alert/{modelId}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNumberConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNumberConst.TD.json new file mode 100644 index 0000000000..629f0ef451 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNumberConst.TD.json @@ -0,0 +1,36 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "number", + "const": 3.14 + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/json", + "dtv:topic": "sample/alert/{modelId}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeCustom.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeCustom.TD.json new file mode 100644 index 0000000000..3aed48a1ab --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeCustom.TD.json @@ -0,0 +1,40 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "object", + "properties": { + "val": { + "type": "string" + } + } + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "", + "dtv:topic": "sample/alert/{modelId}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeRaw.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeRaw.TD.json new file mode 100644 index 0000000000..16da45ec28 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeRaw.TD.json @@ -0,0 +1,40 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "object", + "properties": { + "val": { + "type": "string" + } + } + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/octet-stream", + "dtv:topic": "sample/alert/{modelId}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectConst.TD.json new file mode 100644 index 0000000000..f97c6968f1 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectConst.TD.json @@ -0,0 +1,43 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "object", + "properties": { + "val": { + "type": "string" + } + }, + "const": { + "val": "hello" + } + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/json", + "dtv:topic": "sample/alert/{modelId}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectErrorMessage.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectErrorMessage.TD.json new file mode 100644 index 0000000000..3e67b20e43 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectErrorMessage.TD.json @@ -0,0 +1,41 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "object", + "properties": { + "val": { + "type": "string" + } + }, + "dtv:errorMessage": "val" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/json", + "dtv:topic": "sample/alert/{modelId}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventStringConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventStringConst.TD.json new file mode 100644 index 0000000000..81b115bbe7 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventStringConst.TD.json @@ -0,0 +1,36 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "string", + "const": "hello" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/json", + "dtv:topic": "sample/alert/{modelId}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventUnsupportedProperty.TD.json new file mode 100644 index 0000000000..a45138eec9 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventUnsupportedProperty.TD.json @@ -0,0 +1,36 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/json", + "dtv:topic": "sample/alert/{modelId}", + "op": "subscribeevent" + } + ], + "foobar": "hello" + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/IdEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/IdEmpty.TD.json new file mode 100644 index 0000000000..b1f602effb --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/IdEmpty.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/IdInvalidCharacters.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/IdInvalidCharacters.TD.json new file mode 100644 index 0000000000..709815be80 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/IdInvalidCharacters.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "Not a legal ID", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/IdInvalidReplacementForTokenInTopic.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/IdInvalidReplacementForTokenInTopic.TD.json new file mode 100644 index 0000000000..50410d59a6 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/IdInvalidReplacementForTokenInTopic.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "foo://bar", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyHref.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyHref.TD.json new file mode 100644 index 0000000000..9ebc6721be --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyHref.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "links": [ + { + "rel": "service-desc", + "href": "", + "type": "application/json" + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyType.TD.json new file mode 100644 index 0000000000..32de5b0dec --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyType.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "links": [ + { + "rel": "service-desc", + "href": "../../name-rules/DefaultSchemaNames.json", + "type": "" + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoHref.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoHref.TD.json new file mode 100644 index 0000000000..ea1b339cee --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoHref.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "links": [ + { + "rel": "service-desc", + "type": "application/json" + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoType.TD.json new file mode 100644 index 0000000000..d97331fa78 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoType.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "links": [ + { + "rel": "service-desc", + "href": "../../name-rules/DefaultSchemaNames.json" + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonJsonFile.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonJsonFile.TD.json new file mode 100644 index 0000000000..2aa66d85f2 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonJsonFile.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "links": [ + { + "rel": "service-desc", + "href": "../../TestCase.cs", + "type": "application/json" + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonexistentFile.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonexistentFile.TD.json new file mode 100644 index 0000000000..c95420ba73 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonexistentFile.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "links": [ + { + "rel": "service-desc", + "href": "../../Nonexistent.json", + "type": "application/json" + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkTypeNotJson.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkTypeNotJson.TD.json new file mode 100644 index 0000000000..2bf1e63e2e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkTypeNotJson.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "links": [ + { + "rel": "service-desc", + "href": "../../name-rules/DefaultSchemaNames.json", + "type": "application/text" + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkUnsupportedProperty.TD.json new file mode 100644 index 0000000000..905e1f9df0 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkUnsupportedProperty.TD.json @@ -0,0 +1,40 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "links": [ + { + "rel": "service-desc", + "href": "../../name-rules/DefaultSchemaNames.json", + "type": "application/json", + "foo": "bar" + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/MultipleLinks.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/MultipleLinks.TD.json new file mode 100644 index 0000000000..b4941ec4f7 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/MultipleLinks.TD.json @@ -0,0 +1,44 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "links": [ + { + "rel": "service-desc", + "href": "../../name-rules/DefaultSchemaNames.json", + "type": "application/json" + }, + { + "rel": "service-desc", + "href": "../../name-rules/DefaultSchemaNames.json", + "type": "application/json" + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/NoId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/NoId.TD.json new file mode 100644 index 0000000000..1fb1b38520 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/NoId.TD.json @@ -0,0 +1,31 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyBooleanConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyBooleanConst.TD.json new file mode 100644 index 0000000000..0d77846f17 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyBooleanConst.TD.json @@ -0,0 +1,34 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "boolean", + "const": true, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeEmpty.TD.json new file mode 100644 index 0000000000..67d963c929 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeEmpty.TD.json @@ -0,0 +1,57 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "string", + "enum": [ + "Success", + "Failure" + ] + }, + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}", + "op": "readproperty", + "additionalResponses": [ + { + "success": false, + "schema": "Error", + "contentType": "" + } + ] + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeText.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeText.TD.json new file mode 100644 index 0000000000..734a5d422e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeText.TD.json @@ -0,0 +1,50 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "string", + "enum": [ + "Success", + "Failure" + ] + }, + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/text", + "dtv:topic": "sample/alpha/{maintainerId}/{action}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TD.json new file mode 100644 index 0000000000..2be18dc68c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TD.json @@ -0,0 +1,49 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "object", + "properties": { + "condition": { + "type": "string" + } + } + } + }, + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}", + "op": "readproperty", + "additionalResponses": [ + { + "success": false, + "schema": "Error" + } + ] + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchema.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchema.TD.json new file mode 100644 index 0000000000..740f5c4dd7 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchema.TD.json @@ -0,0 +1,56 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "object", + "properties": { + "condition": { + "type": "string" + } + } + }, + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}", + "op": "readproperty", + "additionalResponses": [ + { + "success": false + } + ] + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchemaDefinitions.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchemaDefinitions.TD.json new file mode 100644 index 0000000000..47e93c039d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchemaDefinitions.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}", + "op": "readproperty", + "additionalResponses": [ + { + "success": false, + "schema": "Error" + } + ] + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSuccess.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSuccess.TD.json new file mode 100644 index 0000000000..37ef5a7e7e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSuccess.TD.json @@ -0,0 +1,56 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "string", + "enum": [ + "Success", + "Failure" + ] + }, + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}", + "op": "readproperty", + "additionalResponses": [ + { + "schema": "Error", + "contentType": "application/json" + } + ] + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionMap.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionMap.TD.json new file mode 100644 index 0000000000..74a1018480 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionMap.TD.json @@ -0,0 +1,54 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "string", + "enum": [ + "Success", + "Failure" + ] + }, + "Error": { + "type": "object", + "dtv:additionalProperties": { + "type": "string" + } + } + }, + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}", + "op": "readproperty", + "additionalResponses": [ + { + "success": false, + "schema": "Error" + } + ] + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionNotObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionNotObject.TD.json new file mode 100644 index 0000000000..868d306290 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionNotObject.TD.json @@ -0,0 +1,56 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "string", + "enum": [ + "Success", + "Failure" + ] + }, + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}", + "op": "readproperty", + "additionalResponses": [ + { + "success": false, + "schema": "Condition" + } + ] + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaEmpty.TD.json new file mode 100644 index 0000000000..d7075ff271 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaEmpty.TD.json @@ -0,0 +1,57 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "object", + "properties": { + "condition": { + "type": "string" + } + } + }, + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}", + "op": "readproperty", + "additionalResponses": [ + { + "success": false, + "schema": "" + } + ] + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSuccessTrue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSuccessTrue.TD.json new file mode 100644 index 0000000000..17f4f16823 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSuccessTrue.TD.json @@ -0,0 +1,57 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "string", + "enum": [ + "Success", + "Failure" + ] + }, + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}", + "op": "readproperty", + "additionalResponses": [ + { + "success": true, + "schema": "Error", + "contentType": "application/json" + } + ] + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseUnsupportedProperty.TD.json new file mode 100644 index 0000000000..7cddad7be3 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseUnsupportedProperty.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "string", + "enum": [ + "Success", + "Failure" + ] + }, + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}", + "op": "readproperty", + "additionalResponses": [ + { + "success": false, + "schema": "Error", + "contentType": "application/json", + "foobar": "hello" + } + ] + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponsesMultiple.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponsesMultiple.TD.json new file mode 100644 index 0000000000..94aa1836b4 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponsesMultiple.TD.json @@ -0,0 +1,61 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Condition": { + "type": "object", + "properties": { + "condition": { + "type": "string" + } + } + }, + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}", + "op": "readproperty", + "additionalResponses": [ + { + "success": false, + "schema": "Condition" + }, + { + "success": false, + "schema": "Error" + } + ] + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormContentTypeText.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormContentTypeText.TD.json new file mode 100644 index 0000000000..797c47675d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormContentTypeText.TD.json @@ -0,0 +1,33 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/text", + "dtv:topic": "sample/alpha/{maintainerId}/{action}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderCode.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderCode.TD.json new file mode 100644 index 0000000000..b716c84271 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderCode.TD.json @@ -0,0 +1,43 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Status": { + "type": "string", + "enum": [ + "Success", + "Failure" + ] + } + }, + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}", + "op": "readproperty", + "dtv:headerCode": "Status" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderInfo.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderInfo.TD.json new file mode 100644 index 0000000000..6f9e700e88 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderInfo.TD.json @@ -0,0 +1,50 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}", + "op": "readproperty", + "dtv:headerInfo": [ + { + "success": false, + "contentType": "application/json", + "schema": "Error" + } + ] + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpReadDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpReadDuplicate.TD.json new file mode 100644 index 0000000000..a904e3c8db --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpReadDuplicate.TD.json @@ -0,0 +1,33 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}", + "op": [ "readproperty", "readproperty" ] + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpWriteDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpWriteDuplicate.TD.json new file mode 100644 index 0000000000..8a0d391e53 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpWriteDuplicate.TD.json @@ -0,0 +1,33 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}", + "op": [ "readproperty", "writeproperty", "readproperty" ] + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json new file mode 100644 index 0000000000..927370f47d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json @@ -0,0 +1,55 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/all/events", + "contentType": "application/json", + "op": "readallproperties" + } + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "additionalResponses": [ + { + "success": false, + "schema": "Error" + } + ] + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TD.json new file mode 100644 index 0000000000..7d2d562b53 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TD.json @@ -0,0 +1,31 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json new file mode 100644 index 0000000000..cc8c3aa3da --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json @@ -0,0 +1,56 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/all/events", + "contentType": "application/json", + "op": "readallproperties" + } + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "op": "readproperty", + "additionalResponses": [ + { + "success": false, + "schema": "Error" + } + ] + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicAndNoRootFormReadAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicAndNoRootFormReadAll.TD.json new file mode 100644 index 0000000000..f699a5699a --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicAndNoRootFormReadAll.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TD.json new file mode 100644 index 0000000000..2202c2264b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TD.json @@ -0,0 +1,46 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/all/events", + "contentType": "application/json", + "op": "readallproperties" + } + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "op": "readproperty" + }, + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/write", + "op": "writeproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormServiceGroup.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormServiceGroup.TD.json new file mode 100644 index 0000000000..b82dc7e7cb --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormServiceGroup.TD.json @@ -0,0 +1,34 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}", + "op": "readproperty", + "dtv:serviceGroupId": "MyGroup" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicNoContentType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicNoContentType.TD.json new file mode 100644 index 0000000000..1e2520fdd3 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicNoContentType.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "dtv:topic": "sample/alpha/{maintainerId}/{action}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenExecutorId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenExecutorId.TD.json new file mode 100644 index 0000000000..d42a5fea5d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenExecutorId.TD.json @@ -0,0 +1,33 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{executorId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenInvokerId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenInvokerId.TD.json new file mode 100644 index 0000000000..dfe84a3629 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenInvokerId.TD.json @@ -0,0 +1,33 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{invokerClientId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TD.json new file mode 100644 index 0000000000..650c8e7b8c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TD.json new file mode 100644 index 0000000000..461f1f29b6 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TD.json @@ -0,0 +1,33 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "readOnly": false, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenReadAndWrite.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenReadAndWrite.TD.json new file mode 100644 index 0000000000..350f55b557 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenReadAndWrite.TD.json @@ -0,0 +1,33 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha", + "op": [ "readproperty", "writeproperty" ] + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenSenderId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenSenderId.TD.json new file mode 100644 index 0000000000..e3714e9b48 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenSenderId.TD.json @@ -0,0 +1,33 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{senderId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormUnsupportedProperty.TD.json new file mode 100644 index 0000000000..1ca037fece --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormUnsupportedProperty.TD.json @@ -0,0 +1,34 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/read", + "op": "readproperty", + "foobar": "hello" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TD.json new file mode 100644 index 0000000000..b1e5c39077 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TD.json @@ -0,0 +1,78 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/all/events/read", + "contentType": "application/json", + "op": "readallproperties", + "additionalResponses": [ + { + "success": false + } + ] + }, + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/all/events/write", + "contentType": "application/json", + "op": "writemultipleproperties" + } + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "op": "readproperty", + "additionalResponses": [ + { + "success": false, + "schema": "Error" + } + ] + }, + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "op": "writeproperty", + "additionalResponses": [ + { + "success": false, + "schema": "Error" + } + ] + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TD.json new file mode 100644 index 0000000000..5432756a10 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/read", + "op": "readproperty" + }, + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "op": "writeproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpReadDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpReadDuplicate.TD.json new file mode 100644 index 0000000000..e355baaf28 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpReadDuplicate.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}", + "op": "readproperty" + }, + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}", + "op": [ "readproperty", "writeproperty" ] + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteDuplicate.TD.json new file mode 100644 index 0000000000..a34e9b0657 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteDuplicate.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}", + "op": "writeproperty" + }, + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}", + "op": [ "readproperty", "writeproperty" ] + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteNoRead.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteNoRead.TD.json new file mode 100644 index 0000000000..7370a66371 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteNoRead.TD.json @@ -0,0 +1,33 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/write", + "op": "writeproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessAndRead.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessAndRead.TD.json new file mode 100644 index 0000000000..0b23771a5e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessAndRead.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}", + "op": "readproperty" + }, + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessDuplicate.TD.json new file mode 100644 index 0000000000..2b24da0db9 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessDuplicate.TD.json @@ -0,0 +1,37 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}" + }, + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyIntegerConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyIntegerConst.TD.json new file mode 100644 index 0000000000..436f85aa25 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyIntegerConst.TD.json @@ -0,0 +1,34 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "integer", + "const": 78, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyNumberConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyNumberConst.TD.json new file mode 100644 index 0000000000..525fd49b6a --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyNumberConst.TD.json @@ -0,0 +1,34 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "number", + "const": 3.14, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectConst.TD.json new file mode 100644 index 0000000000..9490c4758f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectConst.TD.json @@ -0,0 +1,41 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "object", + "properties": { + "val": { + "type": "string" + } + }, + "const": { + "val": "hello" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectErrorMessage.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectErrorMessage.TD.json new file mode 100644 index 0000000000..41b02868df --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectErrorMessage.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "object", + "properties": { + "val": { + "type": "string" + } + }, + "dtv:errorMessage": "val", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyStringConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyStringConst.TD.json new file mode 100644 index 0000000000..70d3636d91 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyStringConst.TD.json @@ -0,0 +1,34 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "const": "hello", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyTypeNull.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyTypeNull.TD.json new file mode 100644 index 0000000000..68e83e5c81 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyTypeNull.TD.json @@ -0,0 +1,33 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "null", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyUnsupportedProperty.TD.json new file mode 100644 index 0000000000..0ac8326a7a --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyUnsupportedProperty.TD.json @@ -0,0 +1,34 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/read", + "op": "readproperty" + } + ], + "foobar": "hello" + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeEmpty.TD.json new file mode 100644 index 0000000000..54e1dc32c5 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeEmpty.TD.json @@ -0,0 +1,64 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:read;1", + "dtv:topic": "sample/{modelId}/read", + "contentType": "application/json", + "additionalResponses": [ + { + "contentType": "", + "success": false + } + ], + "op": [ "readallproperties" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeText.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeText.TD.json new file mode 100644 index 0000000000..43248284a6 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeText.TD.json @@ -0,0 +1,64 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:read;1", + "dtv:topic": "sample/{modelId}/read", + "contentType": "application/json", + "additionalResponses": [ + { + "contentType": "application/text", + "success": false + } + ], + "op": [ "readallproperties" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseNoSuccess.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseNoSuccess.TD.json new file mode 100644 index 0000000000..67bdb3582e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseNoSuccess.TD.json @@ -0,0 +1,63 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:read;1", + "dtv:topic": "sample/{modelId}/read", + "contentType": "application/json", + "additionalResponses": [ + { + "contentType": "application/json" + } + ], + "op": [ "readallproperties" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSchema.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSchema.TD.json new file mode 100644 index 0000000000..6a1b316934 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSchema.TD.json @@ -0,0 +1,70 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "myResponse": { + "type": "string" + } + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:read;1", + "dtv:topic": "sample/{modelId}/read", + "contentType": "application/json", + "additionalResponses": [ + { + "contentType": "application/json", + "success": false, + "schema": "myResponse" + } + ], + "op": [ "readallproperties" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSuccessTrue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSuccessTrue.TD.json new file mode 100644 index 0000000000..67f124303d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSuccessTrue.TD.json @@ -0,0 +1,64 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:read;1", + "dtv:topic": "sample/{modelId}/read", + "contentType": "application/json", + "additionalResponses": [ + { + "contentType": "application/json", + "success": true + } + ], + "op": [ "readallproperties" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseUnsupportedProperty.TD.json new file mode 100644 index 0000000000..1b27e5d834 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseUnsupportedProperty.TD.json @@ -0,0 +1,65 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:read;1", + "dtv:topic": "sample/{modelId}/read", + "contentType": "application/json", + "additionalResponses": [ + { + "contentType": "application/json", + "success": false, + "foobar": "hello" + } + ], + "op": [ "readallproperties" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesAndSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesAndSubAll.TD.json new file mode 100644 index 0000000000..52d2bef37f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesAndSubAll.TD.json @@ -0,0 +1,63 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{modelId}/events", + "contentType": "application/json", + "additionalResponses": [ + { + "contentType": "application/json" + } + ], + "op": [ "subscribeallevents" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesMultiple.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesMultiple.TD.json new file mode 100644 index 0000000000..f0783542ea --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesMultiple.TD.json @@ -0,0 +1,68 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:read;1", + "dtv:topic": "sample/{modelId}/read", + "contentType": "application/json", + "additionalResponses": [ + { + "contentType": "application/json", + "success": false + }, + { + "contentType": "application/json", + "success": false + } + ], + "op": [ "readallproperties" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeCustom.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeCustom.TD.json new file mode 100644 index 0000000000..c8625ef7ce --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeCustom.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{modelId}/events", + "contentType": "", + "op": [ "subscribeallevents" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeRaw.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeRaw.TD.json new file mode 100644 index 0000000000..b789f9bc13 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeRaw.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{modelId}/events", + "contentType": "application/octet-stream", + "op": [ "subscribeallevents" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeText.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeText.TD.json new file mode 100644 index 0000000000..f2a5b9a7c8 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeText.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{modelId}/events", + "contentType": "application/text", + "op": [ "subscribeallevents" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderCode.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderCode.TD.json new file mode 100644 index 0000000000..b41f681216 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderCode.TD.json @@ -0,0 +1,68 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "myHeader": { + "type": "string", + "enum": [ + "Hello", + "Goodbye" + ] + } + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{modelId}/events", + "contentType": "application/json", + "dtv:headerCode": "myHeader", + "op": [ "subscribeallevents" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderInfo.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderInfo.TD.json new file mode 100644 index 0000000000..7e856fe49b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderInfo.TD.json @@ -0,0 +1,73 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "myHeader": { + "type": "string", + "enum": [ + "Hello", + "Goodbye" + ] + } + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{modelId}/events", + "contentType": "application/json", + "dtv:headerInfo": [ + { + "contentType": "application/json", + "schema": "myHeader" + } + ], + "op": [ "subscribeallevents" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoContentType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoContentType.TD.json new file mode 100644 index 0000000000..80c5c25b13 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoContentType.TD.json @@ -0,0 +1,57 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{modelId}/events", + "op": [ "subscribeallevents" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoTopic.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoTopic.TD.json new file mode 100644 index 0000000000..17d761e3ea --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoTopic.TD.json @@ -0,0 +1,57 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "contentType": "application/json", + "op": [ "subscribeallevents" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllAndSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllAndSubAll.TD.json new file mode 100644 index 0000000000..658b6696d9 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllAndSubAll.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{modelId}/events", + "contentType": "application/json", + "op": [ "readallproperties", "subscribeallevents" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllDuplicate.TD.json new file mode 100644 index 0000000000..6d494de900 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllDuplicate.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{modelId}/events", + "contentType": "application/json", + "op": [ "readallproperties", "readallproperties" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpSubAllDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpSubAllDuplicate.TD.json new file mode 100644 index 0000000000..4e2d372052 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpSubAllDuplicate.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{modelId}/events", + "contentType": "application/json", + "op": [ "subscribeallevents", "subscribeallevents" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWiteMultiAndSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWiteMultiAndSubAll.TD.json new file mode 100644 index 0000000000..c7c75e1591 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWiteMultiAndSubAll.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{modelId}/events", + "contentType": "application/json", + "op": [ "writemultipleproperties", "subscribeallevents" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWriteMultiDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWriteMultiDuplicate.TD.json new file mode 100644 index 0000000000..2ab70de8a7 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWriteMultiDuplicate.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{modelId}/events", + "contentType": "application/json", + "op": [ "writemultipleproperties", "writemultipleproperties" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormReadAllButNoProperties.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormReadAllButNoProperties.TD.json new file mode 100644 index 0000000000..ff82912ac1 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormReadAllButNoProperties.TD.json @@ -0,0 +1,30 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/all/events", + "contentType": "application/json", + "op": "readallproperties" + } + ], + "actions": { + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupEmpty.TD.json new file mode 100644 index 0000000000..fbb5e2b8fb --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupEmpty.TD.json @@ -0,0 +1,59 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:event;1", + "dtv:topic": "sample/{modelId}/events", + "contentType": "application/json", + "dtv:serviceGroupId": "", + "op": [ "subscribeallevents" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupNoSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupNoSubAll.TD.json new file mode 100644 index 0000000000..5e061e0077 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupNoSubAll.TD.json @@ -0,0 +1,59 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:read;1", + "dtv:topic": "sample/{modelId}/read", + "contentType": "application/json", + "dtv:serviceGroupId": "MyGroup", + "op": [ "readallproperties" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormSubAllButNoEvents.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormSubAllButNoEvents.TD.json new file mode 100644 index 0000000000..ab95d0ec8d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormSubAllButNoEvents.TD.json @@ -0,0 +1,30 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/all/events", + "contentType": "application/json", + "op": "subscribeallevents" + } + ], + "actions": { + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicEmpty.TD.json new file mode 100644 index 0000000000..d7e70b36c1 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicEmpty.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "", + "contentType": "application/json", + "op": [ "subscribeallevents" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelEmpty.TD.json new file mode 100644 index 0000000000..cc836a4eca --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelEmpty.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample//events", + "contentType": "application/json", + "op": [ "subscribeallevents" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelInvalid.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelInvalid.TD.json new file mode 100644 index 0000000000..e42709f39d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelInvalid.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/foo+bar/events", + "contentType": "application/json", + "op": [ "subscribeallevents" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicReservedStart.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicReservedStart.TD.json new file mode 100644 index 0000000000..803443df19 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicReservedStart.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "$sample/{modelId}/events", + "contentType": "application/json", + "op": [ "subscribeallevents" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenActionWhenSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenActionWhenSubAll.TD.json new file mode 100644 index 0000000000..ca1a8b904d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenActionWhenSubAll.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{action}/events", + "contentType": "application/json", + "op": [ "subscribeallevents" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenConsumerIdWhenSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenConsumerIdWhenSubAll.TD.json new file mode 100644 index 0000000000..a968e7e702 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenConsumerIdWhenSubAll.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{consumerClientId}/events", + "contentType": "application/json", + "op": [ "subscribeallevents" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomEmpty.TD.json new file mode 100644 index 0000000000..f72c51e6cc --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomEmpty.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{ex:}/events", + "contentType": "application/json", + "op": [ "subscribeallevents" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomInvalid.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomInvalid.TD.json new file mode 100644 index 0000000000..8e16a9b622 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomInvalid.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{ex:foo1}/events", + "contentType": "application/json", + "op": [ "subscribeallevents" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenEmpty.TD.json new file mode 100644 index 0000000000..d99b38dbbc --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenEmpty.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{}/events", + "contentType": "application/json", + "op": [ "subscribeallevents" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenExecutorId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenExecutorId.TD.json new file mode 100644 index 0000000000..64488adff8 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenExecutorId.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{executorId}/events", + "contentType": "application/json", + "op": [ "subscribeallevents" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenInvokerId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenInvokerId.TD.json new file mode 100644 index 0000000000..675b93eb38 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenInvokerId.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{invokerClientId}/events", + "contentType": "application/json", + "op": [ "subscribeallevents" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenMaintainerIdWhenSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenMaintainerIdWhenSubAll.TD.json new file mode 100644 index 0000000000..472b61c8ec --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenMaintainerIdWhenSubAll.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{maintainerId}/events", + "contentType": "application/json", + "op": [ "subscribeallevents" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TD.json new file mode 100644 index 0000000000..e3a4c9b99c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{modelId}/events", + "contentType": "application/json", + "op": [ "readallproperties", "writemultipleproperties" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenReadAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenReadAll.TD.json new file mode 100644 index 0000000000..7fca6067c4 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenReadAll.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{senderId}/events", + "contentType": "application/json", + "op": [ "readallproperties" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenWriteMulti.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenWriteMulti.TD.json new file mode 100644 index 0000000000..04484d6b98 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenWriteMulti.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{senderId}/events", + "contentType": "application/json", + "op": [ "writemultipleproperties" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenUnrecognized.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenUnrecognized.TD.json new file mode 100644 index 0000000000..81c3c35a23 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenUnrecognized.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{foobar}/events", + "contentType": "application/json", + "op": [ "subscribeallevents" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormWriteMultiButNoWritableProperties.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormWriteMultiButNoWritableProperties.TD.json new file mode 100644 index 0000000000..f6f913bf83 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormWriteMultiButNoWritableProperties.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/all/events/read", + "contentType": "application/json", + "op": "readallproperties" + }, + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/all/events/write", + "contentType": "application/json", + "op": "writemultipleproperties" + } + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "readOnly": true, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}" + } + ] + }, + "beta": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpReadAllDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpReadAllDuplicate.TD.json new file mode 100644 index 0000000000..1a34bf50ea --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpReadAllDuplicate.TD.json @@ -0,0 +1,64 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{modelId}/read", + "contentType": "application/json", + "op": "readallproperties" + }, + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{action}/props", + "contentType": "application/json", + "op": [ "readallproperties", "writemultipleproperties" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpSubAllDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpSubAllDuplicate.TD.json new file mode 100644 index 0000000000..e90e93c17b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpSubAllDuplicate.TD.json @@ -0,0 +1,64 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{modelId}/events", + "contentType": "application/json", + "op": "subscribeallevents" + }, + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/all/events", + "contentType": "application/json", + "op": "subscribeallevents" + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiDuplicate.TD.json new file mode 100644 index 0000000000..cd5aa06a80 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiDuplicate.TD.json @@ -0,0 +1,64 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{modelId}/write", + "contentType": "application/json", + "op": "writemultipleproperties" + }, + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{action}/props", + "contentType": "application/json", + "op": [ "readallproperties", "writemultipleproperties" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiNoReadAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiNoReadAll.TD.json new file mode 100644 index 0000000000..e55acc3860 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiNoReadAll.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/{modelId}/write", + "contentType": "application/json", + "op": "writemultipleproperties" + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayConst.TD.json new file mode 100644 index 0000000000..570214e8c3 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayConst.TD.json @@ -0,0 +1,41 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "array", + "items": { + "type": "string" + }, + "const": [ "foo", "bar" ] + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsNoType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsNoType.TD.json new file mode 100644 index 0000000000..60ae18ce20 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsNoType.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "array", + "items": { + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsObjectConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsObjectConst.TD.json new file mode 100644 index 0000000000..dd64e73145 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsObjectConst.TD.json @@ -0,0 +1,48 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "bar": { + "type": "string" + } + }, + "const": { + "bar": "hello" + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsRef.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsRef.TD.json new file mode 100644 index 0000000000..f6ce3a349e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsRef.TD.json @@ -0,0 +1,40 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "array", + "items": { + "dtv:ref": "../../json-schemas/AnObjectSchema.json" + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsStringConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsStringConst.TD.json new file mode 100644 index 0000000000..482e07e14d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsStringConst.TD.json @@ -0,0 +1,41 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "array", + "items": { + "type": "string", + "const": "hello" + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsTypeNull.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsTypeNull.TD.json new file mode 100644 index 0000000000..93ce98455d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsTypeNull.TD.json @@ -0,0 +1,40 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "array", + "items": { + "type": "null" + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayNoItems.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayNoItems.TD.json new file mode 100644 index 0000000000..04f212bc25 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayNoItems.TD.json @@ -0,0 +1,37 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "array" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanConstValueNotBoolean.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanConstValueNotBoolean.TD.json new file mode 100644 index 0000000000..2271555737 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanConstValueNotBoolean.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "boolean", + "const": "false" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanReadOnly.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanReadOnly.TD.json new file mode 100644 index 0000000000..dab42e0ea7 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanReadOnly.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "boolean", + "readOnly": true + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanUnsupportedProperty.TD.json new file mode 100644 index 0000000000..98f168c409 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanUnsupportedProperty.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "boolean", + "foo": "hello" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueAboveMax.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueAboveMax.TD.json new file mode 100644 index 0000000000..c7d5629cfa --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueAboveMax.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "integer", + "maximum": 10, + "const": 15 + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueBelowMin.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueBelowMin.TD.json new file mode 100644 index 0000000000..567b18bc52 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueBelowMin.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "integer", + "minimum": 10, + "const": 5 + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotInteger.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotInteger.TD.json new file mode 100644 index 0000000000..be564020c4 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotInteger.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "integer", + "const": 2.345 + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotNumeric.TD.json new file mode 100644 index 0000000000..0efee1655c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotNumeric.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "integer", + "const": "two" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMaxNotInteger.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMaxNotInteger.TD.json new file mode 100644 index 0000000000..da49906b5b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMaxNotInteger.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "integer", + "minimum": 10, + "maximum": 49.5 + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinAboveMax.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinAboveMax.TD.json new file mode 100644 index 0000000000..1707d5dc6f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinAboveMax.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "integer", + "minimum": 10, + "maximum": 5 + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinNotInteger.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinNotInteger.TD.json new file mode 100644 index 0000000000..111f97cb20 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinNotInteger.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "integer", + "minimum": 10.5, + "maximum": 50 + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerReadOnly.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerReadOnly.TD.json new file mode 100644 index 0000000000..15dbc102ba --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerReadOnly.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "integer", + "readOnly": true + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerUnsupportedProperty.TD.json new file mode 100644 index 0000000000..9da76e2bdb --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerUnsupportedProperty.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "integer", + "foo": "hello" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesNoType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesNoType.TD.json new file mode 100644 index 0000000000..88ecd35af0 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesNoType.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "dtv:additionalProperties": { + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesObjectConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesObjectConst.TD.json new file mode 100644 index 0000000000..bc5f0da35f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesObjectConst.TD.json @@ -0,0 +1,48 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "dtv:additionalProperties": { + "type": "object", + "properties": { + "bar": { + "type": "string" + } + }, + "const": { + "bar": "hello" + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TD.json new file mode 100644 index 0000000000..e9bf3e6df0 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TD.json @@ -0,0 +1,40 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "dtv:additionalProperties": { + "dtv:ref": "../../json-schemas/AnObjectSchema.json" + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesStringConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesStringConst.TD.json new file mode 100644 index 0000000000..0074a17903 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesStringConst.TD.json @@ -0,0 +1,41 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "dtv:additionalProperties": { + "type": "string", + "const": "hello" + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesTypeNull.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesTypeNull.TD.json new file mode 100644 index 0000000000..5ced60d75e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesTypeNull.TD.json @@ -0,0 +1,40 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "dtv:additionalProperties": { + "type": "null" + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapConst.TD.json new file mode 100644 index 0000000000..7fec047c36 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapConst.TD.json @@ -0,0 +1,43 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "dtv:additionalProperties": { + "type": "string" + }, + "const": { + "foo": "hello" + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNoType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNoType.TD.json new file mode 100644 index 0000000000..8323c28666 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNoType.TD.json @@ -0,0 +1,36 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueAboveMax.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueAboveMax.TD.json new file mode 100644 index 0000000000..01530955cc --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueAboveMax.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "number", + "maximum": 10, + "const": 15 + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueBelowMin.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueBelowMin.TD.json new file mode 100644 index 0000000000..9ece109e24 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueBelowMin.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "number", + "minimum": 10, + "const": 5 + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueNotNumeric.TD.json new file mode 100644 index 0000000000..c507b0cebd --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueNotNumeric.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "number", + "const": "two" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberMinAboveMax.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberMinAboveMax.TD.json new file mode 100644 index 0000000000..fd50f1a324 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberMinAboveMax.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "number", + "minimum": 10, + "maximum": 5 + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberReadOnly.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberReadOnly.TD.json new file mode 100644 index 0000000000..9cdfce15b6 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberReadOnly.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "number", + "readOnly": true + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberUnsupportedProperty.TD.json new file mode 100644 index 0000000000..4bbfa184d2 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberUnsupportedProperty.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "number", + "foo": "hello" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectBothDeterminants.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectBothDeterminants.TD.json new file mode 100644 index 0000000000..b2ec0bb55a --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectBothDeterminants.TD.json @@ -0,0 +1,45 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "string" + } + }, + "dtv:additionalProperties": { + "type": "string" + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstNotObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstNotObject.TD.json new file mode 100644 index 0000000000..fff847ddf6 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstNotObject.TD.json @@ -0,0 +1,43 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "string" + } + }, + "const": "hello" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanConst.TD.json new file mode 100644 index 0000000000..fe5114913e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanConst.TD.json @@ -0,0 +1,46 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "boolean", + "const": true + } + }, + "const": { + "foo": true + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TD.json new file mode 100644 index 0000000000..74157ed11f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TD.json @@ -0,0 +1,45 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "boolean" + } + }, + "const": { + "foo": "true" + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TD.json new file mode 100644 index 0000000000..5122f0c7fb --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TD.json @@ -0,0 +1,46 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "boolean", + "foo": "bar" + } + }, + "const": { + "foo": true + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerAboveMax.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerAboveMax.TD.json new file mode 100644 index 0000000000..b1e2b0f70f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerAboveMax.TD.json @@ -0,0 +1,46 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "integer", + "maximum": 10 + } + }, + "const": { + "foo": 15 + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerBelowMin.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerBelowMin.TD.json new file mode 100644 index 0000000000..d93658e3f3 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerBelowMin.TD.json @@ -0,0 +1,46 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "integer", + "minimum": 10 + } + }, + "const": { + "foo": 5 + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerConst.TD.json new file mode 100644 index 0000000000..94b728ef5e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerConst.TD.json @@ -0,0 +1,46 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "integer", + "const": 616 + } + }, + "const": { + "foo": 616 + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotInteger.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotInteger.TD.json new file mode 100644 index 0000000000..de148a9098 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotInteger.TD.json @@ -0,0 +1,45 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "integer" + } + }, + "const": { + "foo": 3.33 + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TD.json new file mode 100644 index 0000000000..60da0a66b8 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TD.json @@ -0,0 +1,45 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "integer" + } + }, + "const": { + "foo": "three" + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TD.json new file mode 100644 index 0000000000..ba0cfde7a1 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TD.json @@ -0,0 +1,46 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "integer", + "foo": "bar" + } + }, + "const": { + "foo": 98052 + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoType.TD.json new file mode 100644 index 0000000000..86e24a8f57 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoType.TD.json @@ -0,0 +1,44 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + } + }, + "const": { + "foo": "hello" + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoValue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoValue.TD.json new file mode 100644 index 0000000000..f16f24b8a7 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoValue.TD.json @@ -0,0 +1,44 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "string" + } + }, + "const": { + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberAboveMax.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberAboveMax.TD.json new file mode 100644 index 0000000000..7d82dce887 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberAboveMax.TD.json @@ -0,0 +1,46 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "number", + "maximum": 10 + } + }, + "const": { + "foo": 15 + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberBelowMin.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberBelowMin.TD.json new file mode 100644 index 0000000000..9ac875f783 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberBelowMin.TD.json @@ -0,0 +1,46 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "number", + "minimum": 10 + } + }, + "const": { + "foo": 5 + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberConst.TD.json new file mode 100644 index 0000000000..13cfed2571 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberConst.TD.json @@ -0,0 +1,46 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "number", + "const": 616 + } + }, + "const": { + "foo": 616 + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberNotNumeric.TD.json new file mode 100644 index 0000000000..03a5d2072f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberNotNumeric.TD.json @@ -0,0 +1,45 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "number" + } + }, + "const": { + "foo": "three" + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TD.json new file mode 100644 index 0000000000..b91109677d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TD.json @@ -0,0 +1,46 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "number", + "foo": "bar" + } + }, + "const": { + "foo": 98052 + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringConst.TD.json new file mode 100644 index 0000000000..a7beafcf2e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringConst.TD.json @@ -0,0 +1,46 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "string", + "const": "hello" + } + }, + "const": { + "foo": "hello" + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TD.json new file mode 100644 index 0000000000..e450724559 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TD.json @@ -0,0 +1,46 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "string", + "format": "date" + } + }, + "const": { + "foo": "7/8/2010" + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringValueNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringValueNotString.TD.json new file mode 100644 index 0000000000..37eb006b36 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringValueNotString.TD.json @@ -0,0 +1,45 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "string" + } + }, + "const": { + "foo": 538 + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeArray.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeArray.TD.json new file mode 100644 index 0000000000..69562dfbc8 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeArray.TD.json @@ -0,0 +1,48 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "const": { + "foo": [ "hello", "goodbye" ] + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeNull.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeNull.TD.json new file mode 100644 index 0000000000..e19ac07209 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeNull.TD.json @@ -0,0 +1,45 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "null" + } + }, + "const": { + "foo": "hello" + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeObject.TD.json new file mode 100644 index 0000000000..751a6fe219 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeObject.TD.json @@ -0,0 +1,52 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "object", + "properties": { + "bar": { + "type": "string" + } + } + } + }, + "const": { + "foo": { + "bar": "hello" + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstUnsupportedProperty.TD.json new file mode 100644 index 0000000000..7c67a97a46 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstUnsupportedProperty.TD.json @@ -0,0 +1,46 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "string" + } + }, + "required": [ "foo" ], + "const": { + "foo": "hello" + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstValueNoSchema.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstValueNoSchema.TD.json new file mode 100644 index 0000000000..6344671b66 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstValueNoSchema.TD.json @@ -0,0 +1,42 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + }, + "const": { + "foo": "hello" + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNoProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNoProperty.TD.json new file mode 100644 index 0000000000..72521f269f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNoProperty.TD.json @@ -0,0 +1,40 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + }, + "dtv:errorMessage": "foo" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNotString.TD.json new file mode 100644 index 0000000000..3d6dca49b4 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNotString.TD.json @@ -0,0 +1,43 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "string" + } + }, + "dtv:errorMessage": 555 + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessagePropertyNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessagePropertyNotString.TD.json new file mode 100644 index 0000000000..f35d14d027 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessagePropertyNotString.TD.json @@ -0,0 +1,43 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "integer" + } + }, + "dtv:errorMessage": "foo" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectNoDeterminant.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectNoDeterminant.TD.json new file mode 100644 index 0000000000..76c9536e36 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectNoDeterminant.TD.json @@ -0,0 +1,37 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertiesNotObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertiesNotObject.TD.json new file mode 100644 index 0000000000..1f0629c353 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertiesNotObject.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": [ "foo" ] + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyNoType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyNoType.TD.json new file mode 100644 index 0000000000..1bb6b4187d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyNoType.TD.json @@ -0,0 +1,41 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyObjectConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyObjectConst.TD.json new file mode 100644 index 0000000000..ba2f2191cf --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyObjectConst.TD.json @@ -0,0 +1,50 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "object", + "properties": { + "bar": { + "type": "string" + } + }, + "const": { + "bar": "hello" + } + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyRef.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyRef.TD.json new file mode 100644 index 0000000000..d312c911e2 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyRef.TD.json @@ -0,0 +1,42 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "dtv:ref": "../../json-schemas/AnObjectSchema.json" + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyStringConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyStringConst.TD.json new file mode 100644 index 0000000000..ce294f3d66 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyStringConst.TD.json @@ -0,0 +1,43 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "string", + "const": "hello" + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyTypeNull.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyTypeNull.TD.json new file mode 100644 index 0000000000..94dfc1f07b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyTypeNull.TD.json @@ -0,0 +1,42 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "null" + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectRequiredNoProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectRequiredNoProperty.TD.json new file mode 100644 index 0000000000..0ceb7099d4 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectRequiredNoProperty.TD.json @@ -0,0 +1,40 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + }, + "required": [ "foo" ] + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionRef.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionRef.TD.json new file mode 100644 index 0000000000..519a12169e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionRef.TD.json @@ -0,0 +1,37 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "dtv:ref": "../../json-schemas/AnObjectSchema.json" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstContentEncoding.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstContentEncoding.TD.json new file mode 100644 index 0000000000..1671c02771 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstContentEncoding.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "string", + "const": "foo", + "contentEncoding": "base64" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstFormat.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstFormat.TD.json new file mode 100644 index 0000000000..41e402c72c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstFormat.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "string", + "const": "2/2/2022", + "format": "date" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstPattern.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstPattern.TD.json new file mode 100644 index 0000000000..eb9d4469a2 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstPattern.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "string", + "const": "222", + "pattern": "^(?:\\+|-)?(?:[1-9][0-9]*|0)(?:\\.[0-9]*)?$" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstUnsupportedProperty.TD.json new file mode 100644 index 0000000000..e63ef1fed0 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstUnsupportedProperty.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "string", + "const": "bar", + "foo": "hello" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstValueNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstValueNotString.TD.json new file mode 100644 index 0000000000..76095b2058 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstValueNotString.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "string", + "const": 678 + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringContentEncodingUnsupportedValue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringContentEncodingUnsupportedValue.TD.json new file mode 100644 index 0000000000..291ea6212d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringContentEncodingUnsupportedValue.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "string", + "contentEncoding": "foobar" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumConst.TD.json new file mode 100644 index 0000000000..9b31e099c6 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumConst.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "string", + "enum": [ "foo", "bar" ], + "const": "bar" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumContentEncoding.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumContentEncoding.TD.json new file mode 100644 index 0000000000..3b481349de --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumContentEncoding.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "string", + "enum": [ "foo", "bar" ], + "contentEncoding": "base64" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumElementInvalid.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumElementInvalid.TD.json new file mode 100644 index 0000000000..77ecea0204 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumElementInvalid.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "string", + "enum": [ 222, "bar" ] + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumFormat.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumFormat.TD.json new file mode 100644 index 0000000000..aeb92aca73 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumFormat.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "string", + "enum": [ "foo", "bar" ], + "format": "date" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumPattern.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumPattern.TD.json new file mode 100644 index 0000000000..9c53faaa2c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumPattern.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "string", + "enum": [ "foo", "bar" ], + "pattern": "^(?:\\+|-)?(?:[1-9][0-9]*|0)(?:\\.[0-9]*)?$" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumReadOnly.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumReadOnly.TD.json new file mode 100644 index 0000000000..84c0dd199f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumReadOnly.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "string", + "enum": [ "foo", "bar" ], + "readOnly": true + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumUnsupportedProperty.TD.json new file mode 100644 index 0000000000..3ad027f6d4 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumUnsupportedProperty.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "string", + "enum": [ "foo", "bar" ], + "foo": "hello" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndContentEncoding.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndContentEncoding.TD.json new file mode 100644 index 0000000000..d2ba4d558e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndContentEncoding.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "string", + "format": "date", + "contentEncoding": "base64" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndPattern.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndPattern.TD.json new file mode 100644 index 0000000000..64b6dc7c3e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndPattern.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "string", + "format": "date", + "pattern": "^(?:\\+|-)?(?:[1-9][0-9]*|0)(?:\\.[0-9]*)?$" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatUnsupportedValue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatUnsupportedValue.TD.json new file mode 100644 index 0000000000..34a15aa7e2 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatUnsupportedValue.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "string", + "format": "foobar" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternAndContentEncoding.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternAndContentEncoding.TD.json new file mode 100644 index 0000000000..fe8c12b6a1 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternAndContentEncoding.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "string", + "pattern": "^(?:\\+|-)?(?:[1-9][0-9]*|0)(?:\\.[0-9]*)?$", + "contentEncoding": "base64" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternNotDurationOrDecimal.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternNotDurationOrDecimal.TD.json new file mode 100644 index 0000000000..6dd96d9aaf --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternNotDurationOrDecimal.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "string", + "pattern": "^a+$" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternRegexInvalid.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternRegexInvalid.TD.json new file mode 100644 index 0000000000..34c726bae2 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternRegexInvalid.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "string", + "pattern": "*??" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringReadOnly.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringReadOnly.TD.json new file mode 100644 index 0000000000..1b9879b0a6 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringReadOnly.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "string", + "readOnly": true + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringUnsupportedProperty.TD.json new file mode 100644 index 0000000000..90dbfd91d7 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringUnsupportedProperty.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "string", + "foo": "hello" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionTypeNull.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionTypeNull.TD.json new file mode 100644 index 0000000000..679495da59 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionTypeNull.TD.json @@ -0,0 +1,37 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "null" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleEmpty.TD.json new file mode 100644 index 0000000000..7621643232 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleEmpty.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleInvalid.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleInvalid.TD.json new file mode 100644 index 0000000000..b2fe0d379b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleInvalid.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Not codegen legal", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ArrayKey.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ArrayKey.TD.json new file mode 100644 index 0000000000..9ec49c2c10 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ArrayKey.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + [ "contentType" ]: "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/BooleanKey.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/BooleanKey.TD.json new file mode 100644 index 0000000000..73ba2ffc94 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/BooleanKey.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + true: "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/DuplicateKey.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/DuplicateKey.TD.json new file mode 100644 index 0000000000..22bffd8094 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/DuplicateKey.TD.json @@ -0,0 +1,33 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "contentType": "application/text", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingColon.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingColon.TD.json new file mode 100644 index 0000000000..afba22078c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingColon.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType" "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingComma.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingComma.TD.json new file mode 100644 index 0000000000..a8596ee262 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingComma.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json" + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingElement.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingElement.TD.json new file mode 100644 index 0000000000..8cfac1bf4d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingElement.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + }, + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingKey.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingKey.TD.json new file mode 100644 index 0000000000..e16cbc9ff7 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingKey.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + : "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingValue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingValue.TD.json new file mode 100644 index 0000000000..d8d2a625c8 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingValue.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": , + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/NumericKey.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/NumericKey.TD.json new file mode 100644 index 0000000000..da07f43f65 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/NumericKey.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + 626: "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ObjectKey.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ObjectKey.TD.json new file mode 100644 index 0000000000..ec1c067bf3 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ObjectKey.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + { "contentType": true }: "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/TrailingComma.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/TrailingComma.TD.json new file mode 100644 index 0000000000..8bd802f202 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/TrailingComma.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction", + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedArray.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedArray.TD.json new file mode 100644 index 0000000000..6c8566bcb6 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedArray.TD.json @@ -0,0 +1,31 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedObject.TD.json new file mode 100644 index 0000000000..4043b61224 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedObject.TD.json @@ -0,0 +1,31 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpRead.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpRead.TD.json new file mode 100644 index 0000000000..27d8754cac --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpRead.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "readproperty" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpSub.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpSub.TD.json new file mode 100644 index 0000000000..9bc338c3dd --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpSub.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "subscribeevent" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpWrite.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpWrite.TD.json new file mode 100644 index 0000000000..20c6f19f75 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpWrite.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:noop;1", + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "writeproperty" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormsEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormsEmpty.TD.json new file mode 100644 index 0000000000..d74d20780f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormsEmpty.TD.json @@ -0,0 +1,26 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionNoForms.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionNoForms.TD.json new file mode 100644 index 0000000000..eb5970cc70 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionNoForms.TD.json @@ -0,0 +1,24 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextMissingWot.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextMissingWot.TD.json new file mode 100644 index 0000000000..1bc91ccec1 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextMissingWot.TD.json @@ -0,0 +1,31 @@ +{ + "@context": [ + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextWrongType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextWrongType.TD.json new file mode 100644 index 0000000000..b1713971dc --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextWrongType.TD.json @@ -0,0 +1,29 @@ +{ + "@context": 404, + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpInvoke.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpInvoke.TD.json new file mode 100644 index 0000000000..fdd77dbde4 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpInvoke.TD.json @@ -0,0 +1,35 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/json", + "dtv:topic": "sample/alert/{modelId}", + "op": "invokeaction" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpRead.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpRead.TD.json new file mode 100644 index 0000000000..b32b8d7624 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpRead.TD.json @@ -0,0 +1,35 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/json", + "dtv:topic": "sample/alert/{modelId}", + "op": "readproperty" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpSubAll.TD.json new file mode 100644 index 0000000000..7e9f5e207f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpSubAll.TD.json @@ -0,0 +1,35 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/json", + "dtv:topic": "sample/alert/{modelId}", + "op": "subscribeallevents" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpWrite.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpWrite.TD.json new file mode 100644 index 0000000000..140741af9c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpWrite.TD.json @@ -0,0 +1,35 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:alert;1", + "contentType": "application/json", + "dtv:topic": "sample/alert/{modelId}", + "op": "writeproperty" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormsEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormsEmpty.TD.json new file mode 100644 index 0000000000..3e745833dd --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormsEmpty.TD.json @@ -0,0 +1,29 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventNoForms.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventNoForms.TD.json new file mode 100644 index 0000000000..96364a254e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventNoForms.TD.json @@ -0,0 +1,27 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "type": "string" + } + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/IdNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/IdNotString.TD.json new file mode 100644 index 0000000000..e82bd5f039 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/IdNotString.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": 555, + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoContext.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoContext.TD.json new file mode 100644 index 0000000000..d72a6324d2 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoContext.TD.json @@ -0,0 +1,28 @@ +{ + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoTitle.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoTitle.TD.json new file mode 100644 index 0000000000..7fcf9eeaae --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoTitle.TD.json @@ -0,0 +1,31 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpInvoke.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpInvoke.TD.json new file mode 100644 index 0000000000..817babcd88 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpInvoke.TD.json @@ -0,0 +1,33 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "invokeaction" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpReadAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpReadAll.TD.json new file mode 100644 index 0000000000..8823a32b45 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpReadAll.TD.json @@ -0,0 +1,33 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readallproperties" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpSub.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpSub.TD.json new file mode 100644 index 0000000000..b8986ec202 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpSub.TD.json @@ -0,0 +1,33 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "subscribeevent" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpWriteMulti.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpWriteMulti.TD.json new file mode 100644 index 0000000000..af094da5a3 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpWriteMulti.TD.json @@ -0,0 +1,33 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "writemultipleproperties" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormsEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormsEmpty.TD.json new file mode 100644 index 0000000000..6e6a8be3e4 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormsEmpty.TD.json @@ -0,0 +1,27 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyNoForms.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyNoForms.TD.json new file mode 100644 index 0000000000..d76ae24929 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyNoForms.TD.json @@ -0,0 +1,25 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string" + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormEmptyHref.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormEmptyHref.TD.json new file mode 100644 index 0000000000..26b5211815 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormEmptyHref.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/read", + "op": "readallproperties" + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormNoHref.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormNoHref.TD.json new file mode 100644 index 0000000000..6ae7646759 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormNoHref.TD.json @@ -0,0 +1,57 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/read", + "op": "readallproperties" + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormNoOp.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormNoOp.TD.json new file mode 100644 index 0000000000..6b6d5a4ff5 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormNoOp.TD.json @@ -0,0 +1,57 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:read;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/read" + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpArrayEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpArrayEmpty.TD.json new file mode 100644 index 0000000000..eb24830e64 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpArrayEmpty.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:read;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/read", + "op": [ ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpElementEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpElementEmpty.TD.json new file mode 100644 index 0000000000..53f0688c3a --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpElementEmpty.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:read;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/read", + "op": [ "" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpEmpty.TD.json new file mode 100644 index 0000000000..33f13b5c51 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpEmpty.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:read;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/read", + "op": "" + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpReadOne.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpReadOne.TD.json new file mode 100644 index 0000000000..86a14ce94c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpReadOne.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:read;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/read", + "op": [ "readproperty" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpSubOne.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpSubOne.TD.json new file mode 100644 index 0000000000..5b5cd5cee7 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpSubOne.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/evens", + "op": [ "subscribeevent" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpWriteOne.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpWriteOne.TD.json new file mode 100644 index 0000000000..39d4c6e65f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpWriteOne.TD.json @@ -0,0 +1,58 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:write;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/write", + "op": [ "writeproperty" ] + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormsEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormsEmpty.TD.json new file mode 100644 index 0000000000..a0f959a7eb --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormsEmpty.TD.json @@ -0,0 +1,52 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "forms": [ + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" + } + ] + } + }, + "events": { + "alert": { + "data": { + "type": "string" + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsNotObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsNotObject.TD.json new file mode 100644 index 0000000000..9adf9878c1 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsNotObject.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "array", + "items": "string" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeNotString.TD.json new file mode 100644 index 0000000000..b1c4f38c81 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeNotString.TD.json @@ -0,0 +1,40 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "array", + "items": { + "type": 666 + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeUnsupported.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeUnsupported.TD.json new file mode 100644 index 0000000000..d9eb10b1c7 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeUnsupported.TD.json @@ -0,0 +1,40 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "array", + "items": { + "type": "foobar" + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMaxNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMaxNotNumeric.TD.json new file mode 100644 index 0000000000..db86ddcad7 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMaxNotNumeric.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "integer", + "maximum": "100" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMinNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMinNotNumeric.TD.json new file mode 100644 index 0000000000..abbe84c1f2 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMinNotNumeric.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "integer", + "minimum": "zero" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesNotObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesNotObject.TD.json new file mode 100644 index 0000000000..99a0da86e5 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesNotObject.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "dtv:additionalProperties": "string" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeNotString.TD.json new file mode 100644 index 0000000000..8f9c7951be --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeNotString.TD.json @@ -0,0 +1,40 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "dtv:additionalProperties": { + "type": 666 + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TD.json new file mode 100644 index 0000000000..d4f9d9ef38 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TD.json @@ -0,0 +1,40 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "dtv:additionalProperties": { + "type": "foobar" + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMaxNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMaxNotNumeric.TD.json new file mode 100644 index 0000000000..929bdc8049 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMaxNotNumeric.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "number", + "maximum": "100" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMinNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMinNotNumeric.TD.json new file mode 100644 index 0000000000..988c3b3031 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMinNotNumeric.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "number", + "minimum": "zero" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectConstPropertyTypeUnsupported.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectConstPropertyTypeUnsupported.TD.json new file mode 100644 index 0000000000..3ff2f12876 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectConstPropertyTypeUnsupported.TD.json @@ -0,0 +1,45 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "foobar" + } + }, + "const": { + "foo": "hello" + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeNotString.TD.json new file mode 100644 index 0000000000..26332e4ca8 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeNotString.TD.json @@ -0,0 +1,42 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": 888 + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeUnsupported.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeUnsupported.TD.json new file mode 100644 index 0000000000..bf007a74bd --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeUnsupported.TD.json @@ -0,0 +1,42 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "foobar" + } + } + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectRequiredNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectRequiredNotString.TD.json new file mode 100644 index 0000000000..ee51b8fd0b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectRequiredNotString.TD.json @@ -0,0 +1,43 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "object", + "properties": { + "foo": { + "type": "string" + } + }, + "required": [ 555 ] + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringContentEncodingNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringContentEncodingNotString.TD.json new file mode 100644 index 0000000000..cb4cb8319d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringContentEncodingNotString.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "string", + "contentEncoding": 444 + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringFormatNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringFormatNotString.TD.json new file mode 100644 index 0000000000..0af3ffddc6 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringFormatNotString.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "string", + "format": 444 + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringPatternNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringPatternNotString.TD.json new file mode 100644 index 0000000000..6ed9fbe50b --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringPatternNotString.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "string", + "pattern": 444 + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeNotString.TD.json new file mode 100644 index 0000000000..846dceabd8 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeNotString.TD.json @@ -0,0 +1,37 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": 767 + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeUnsupported.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeUnsupported.TD.json new file mode 100644 index 0000000000..b3d07bf011 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeUnsupported.TD.json @@ -0,0 +1,37 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "someSchema": { + "type": "foobar" + } + }, + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TitleNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TitleNotString.TD.json new file mode 100644 index 0000000000..641c06c68f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TitleNotString.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": 444, + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/IdInvalidReplacementButNotInTopic.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/IdInvalidReplacementButNotInTopic.TD.json new file mode 100644 index 0000000000..6ae1b264c9 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/IdInvalidReplacementButNotInTopic.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "foo://bar", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/fixed/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkNoRel.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkNoRel.TD.json new file mode 100644 index 0000000000..2fe8a825e4 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkNoRel.TD.json @@ -0,0 +1,38 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "links": [ + { + "href": "../../TestCase.cs", + "type": "application/text" + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkOtherRel.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkOtherRel.TD.json new file mode 100644 index 0000000000..e24ec03d20 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkOtherRel.TD.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "links": [ + { + "rel": "service-doc", + "href": "../../TestCase.cs", + "type": "application/text" + } + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/Noop.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/Noop.TD.json new file mode 100644 index 0000000000..c4427ac432 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/Noop.TD.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "actions": { + "noop": { + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", + "contentType": "application/json", + "dtv:topic": "sample/{modelId}/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TD.json new file mode 100644 index 0000000000..b1eaadaa0c --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TD.json @@ -0,0 +1,68 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/all/events", + "contentType": "application/json", + "op": "readallproperties", + "additionalResponses": [ + { + "success": false + } + ] + } + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}", + "op": "readproperty" + }, + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}", + "op": "writeproperty", + "additionalResponses": [ + { + "success": false, + "schema": "Error" + } + ] + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TD.json new file mode 100644 index 0000000000..c6c2d70a67 --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TD.json @@ -0,0 +1,74 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "id": "dtmi:test:Noop;1", + "title": "Noop", + "securityDefinitions": { + "nosec_sc": { + "scheme": "nosec" + } + }, + "security": [ + "nosec_sc" + ], + "schemaDefinitions": { + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + }, + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/all/events/read", + "contentType": "application/json", + "op": "readallproperties" + }, + { + "href": "dtmi:test:ProtocolCompiler:events;1", + "dtv:topic": "sample/all/events/write", + "contentType": "application/json", + "op": "writemultipleproperties", + "additionalResponses": [ + { + "success": false + } + ] + } + ], + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}", + "op": "readproperty", + "additionalResponses": [ + { + "success": false, + "schema": "Error" + } + ] + }, + { + "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}/{action}", + "op": "writeproperty" + } + ] + } + }, + "events": { + } +} From 473689ccd0c75babc444a0bf471663b0359ead23 Mon Sep 17 00:00:00 2001 From: "John (JD) Douceur" Date: Wed, 7 Jan 2026 10:02:48 -0800 Subject: [PATCH 33/52] switch from Thing Descriptions to Thing Models --- .../schema/tm-json-schema-validation.json | 2063 +++++++++++++++++ .../ErrorLog.cs | 24 - .../ErrorReporter.cs | 5 - .../MqttTopicTokens.cs | 5 - .../TDValues.cs | 2 + .../ThingValidator.cs | 179 +- .../ActionEnvoyGenerator.cs | 1 - .../EnvoyTransformFactory.cs | 19 +- .../EventEnvoyGenerator.cs | 4 +- .../PropertyEnvoyGenerator.cs | 2 - .../Actions/code/DotNetCommandExecutor.cs | 3 - .../Actions/code/DotNetCommandInvoker.cs | 3 - .../Actions/t4/DotNetCommandExecutor.tt | 1 - .../dotnet/Actions/t4/DotNetCommandInvoker.tt | 1 - .../Events/code/DotNetTelemetryReceiver.cs | 3 - .../Events/code/DotNetTelemetrySender.cs | 3 - .../Events/t4/DotNetTelemetryReceiver.tt | 1 - .../dotnet/Events/t4/DotNetTelemetrySender.tt | 1 - .../Properties/code/DotNetPropertyConsumer.cs | 3 - .../code/DotNetPropertyMaintainer.cs | 3 - .../Properties/t4/DotNetPropertyConsumer.tt | 2 - .../Properties/t4/DotNetPropertyMaintainer.tt | 2 - .../dotnet/Service/t4/DotNetService.tt | 4 +- .../rust/Actions/code/RustCommandExecutor.cs | 3 - .../rust/Actions/code/RustCommandInvoker.cs | 3 - .../rust/Actions/t4/RustCommandExecutor.tt | 1 - .../rust/Actions/t4/RustCommandInvoker.tt | 1 - .../rust/Events/code/RustTelemetryReceiver.cs | 4 +- .../rust/Events/code/RustTelemetrySender.cs | 4 +- .../rust/Events/t4/RustTelemetryReceiver.tt | 2 - .../rust/Events/t4/RustTelemetrySender.tt | 1 - .../Properties/code/RustPropertyConsumer.cs | 3 - .../Properties/code/RustPropertyMaintainer.cs | 3 - .../Properties/t4/RustPropertyConsumer.tt | 2 - .../Properties/t4/RustPropertyMaintainer.tt | 2 - .../Model/TDThing.cs | 16 +- codegen2/src/Dtdl2Wot/DtdlMqttTopicTokens.cs | 5 + .../Dtdl2Wot/Interface/code/InterfaceThing.cs | 6 +- .../Dtdl2Wot/Interface/t4/InterfaceThing.tt | 10 +- codegen2/src/TDParse/Program.cs | 2 +- ...ormAdditionalResponseContentTypeEmpty.json | 2 +- ...FormAdditionalResponseContentTypeText.json | 2 +- ...nalResponseNoMatchingSchemaDefinition.json | 4 +- .../ActionFormAdditionalResponseNoSchema.json | 2 +- ...AdditionalResponseNoSchemaDefinitions.json | 2 +- ...ActionFormAdditionalResponseNoSuccess.json | 2 +- ...AdditionalResponseSchemaDefinitionMap.json | 4 +- ...onalResponseSchemaDefinitionNotObject.json | 4 +- ...tionFormAdditionalResponseSchemaEmpty.json | 2 +- ...tionFormAdditionalResponseSuccessTrue.json | 2 +- ...AdditionalResponseUnsupportedProperty.json | 2 +- ...ActionFormAdditionalResponsesMultiple.json | 2 +- .../failure/ActionFormContentTypeText.json | 2 +- .../failure/ActionFormHeaderCodeEmpty.json | 2 +- ...mHeaderCodeNoMatchingSchemaDefinition.json | 4 +- ...tionFormHeaderCodeNoSchemaDefinitions.json | 2 +- ...FormHeaderCodeSchemaDefinitionNotEnum.json | 4 +- .../ActionFormHeaderInfoContentTypeEmpty.json | 2 +- ...ctionFormHeaderInfoContentTypeNotJson.json | 2 +- .../ActionFormHeaderInfoNoContentType.json | 2 +- ...mHeaderInfoNoMatchingSchemaDefinition.json | 4 +- .../failure/ActionFormHeaderInfoNoSchema.json | 2 +- ...tionFormHeaderInfoNoSchemaDefinitions.json | 2 +- ...tionFormHeaderInfoSchemaDefinitionMap.json | 4 +- ...rmHeaderInfoSchemaDefinitionNotObject.json | 4 +- .../ActionFormHeaderInfoSchemaEmpty.json | 2 +- .../ActionFormHeaderInfoSuccessTrue.json | 2 +- ...tionFormHeaderInfoUnsupportedProperty.json | 2 +- .../ActionFormHeaderInfosMultiple.json | 2 +- .../failure/ActionFormOpInvokeDuplicate.json | 2 +- .../test-cases/failure/ActionFormOpRead.json | 2 +- .../test-cases/failure/ActionFormOpSub.json | 2 +- .../test-cases/failure/ActionFormOpWrite.json | 2 +- .../failure/ActionFormServiceGroupEmpty.json | 2 +- .../failure/ActionFormTopicNoContentType.json | 4 +- .../failure/ActionFormTopicTokenAction.json | 2 +- .../ActionFormTopicTokenConsumerId.json | 2 +- .../ActionFormTopicTokenMaintainerId.json | 2 +- .../failure/ActionFormTopicTokenSenderId.json | 2 +- .../ActionFormUnsupportedProperty.json | 2 +- .../test-cases/failure/ActionFormsEmpty.json | 2 +- .../ActionFormsMultipleContentTypes.json | 4 +- .../failure/ActionFormsOpInvokeDuplicate.json | 4 +- .../failure/ActionFormsOplessAndInvoke.json | 4 +- .../failure/ActionFormsOplessDuplicate.json | 4 +- .../test-cases/failure/ActionInputMap.json | 2 +- .../ActionInputNullAndContentTypeJson.json | 4 +- .../test-cases/failure/ActionInputNumber.json | 2 +- ...ActionInputObjectAndContentTypeCustom.json | 4 +- .../ActionInputObjectAndContentTypeRaw.json | 4 +- .../failure/ActionInputObjectConst.json | 2 +- .../ActionInputObjectErrorMessage.json | 2 +- .../test-cases/failure/ActionInputString.json | 2 +- .../test-cases/failure/ActionNoForms.json | 4 +- .../failure/ActionNoFormsWithTopic.json | 2 +- .../test-cases/failure/ActionOutputMap.json | 2 +- .../ActionOutputNullAndContentTypeJson.json | 4 +- .../failure/ActionOutputNumber.json | 2 +- ...ctionOutputObjectAndContentTypeCustom.json | 4 +- .../ActionOutputObjectAndContentTypeRaw.json | 4 +- .../failure/ActionOutputObjectConst.json | 2 +- .../ActionOutputObjectErrorMessage.json | 2 +- .../failure/ActionOutputString.json | 2 +- .../failure/ActionUnsupportedProperty.json | 2 +- .../test-cases/failure/ArrayKey.json | 2 +- .../test-cases/failure/BooleanKey.json | 2 +- .../test-cases/failure/DuplicateKey.json | 2 +- .../test-cases/failure/EventBooleanConst.json | 2 +- .../failure/EventFormAdditionalResponses.json | 2 +- .../failure/EventFormContentTypeText.json | 2 +- .../failure/EventFormHeaderCode.json | 2 +- .../failure/EventFormHeaderInfo.json | 2 +- .../test-cases/failure/EventFormOpInvoke.json | 2 +- .../test-cases/failure/EventFormOpRead.json | 2 +- .../test-cases/failure/EventFormOpSubAll.json | 2 +- .../failure/EventFormOpSubDuplicate.json | 2 +- .../test-cases/failure/EventFormOpWrite.json | 2 +- .../failure/EventFormServiceGroupEmpty.json | 2 +- .../failure/EventFormTopicNoContentType.json | 4 +- .../failure/EventFormTopicTokenAction.json | 2 +- .../EventFormTopicTokenConsumerId.json | 2 +- .../EventFormTopicTokenExecutorId.json | 2 +- .../failure/EventFormTopicTokenInvokerId.json | 2 +- .../EventFormTopicTokenMaintainerId.json | 2 +- .../failure/EventFormUnsupportedProperty.json | 2 +- .../test-cases/failure/EventFormsEmpty.json | 2 +- .../failure/EventFormsOpSubDuplicate.json | 4 +- .../failure/EventFormsOplessAndSub.json | 4 +- .../failure/EventFormsOplessDuplicate.json | 4 +- .../test-cases/failure/EventIntegerConst.json | 2 +- .../test-cases/failure/EventNoForms.json | 4 +- ...ntNoFormsWithTopicAndNoRootFormSubAll.json | 2 +- .../failure/EventNullAndContentTypeJson.json | 4 +- .../test-cases/failure/EventNumberConst.json | 2 +- .../EventObjectAndContentTypeCustom.json | 4 +- .../failure/EventObjectAndContentTypeRaw.json | 4 +- .../test-cases/failure/EventObjectConst.json | 2 +- .../failure/EventObjectErrorMessage.json | 2 +- .../test-cases/failure/EventStringConst.json | 2 +- .../failure/EventUnsupportedProperty.json | 2 +- .../IdInvalidReplacementForTokenInTopic.json | 16 - .../test-cases/failure/IdNotString.json | 16 - .../test-cases/failure/LinkEmptyHref.json | 2 +- .../test-cases/failure/LinkEmptyType.json | 2 +- .../test-cases/failure/LinkNoHref.json | 2 +- .../test-cases/failure/LinkNoType.json | 2 +- .../test-cases/failure/LinkNonJsonFile.json | 2 +- .../failure/LinkNonexistentFile.json | 2 +- .../test-cases/failure/LinkTypeNotJson.json | 2 +- .../failure/LinkUnsupportedProperty.json | 2 +- .../test-cases/failure/MissingColon.json | 2 +- .../test-cases/failure/MissingComma.json | 2 +- .../test-cases/failure/MissingElement.json | 2 +- .../test-cases/failure/MissingKey.json | 2 +- .../test-cases/failure/MissingValue.json | 2 +- .../test-cases/failure/MultipleLinks.json | 2 +- .../test-cases/failure/NoTitle.json | 2 +- .../failure/{NoId.json => NoType.json} | 4 +- .../test-cases/failure/NumericKey.json | 2 +- .../test-cases/failure/ObjectKey.json | 2 +- .../failure/PropertyBooleanConst.json | 2 +- ...ormAdditionalResponseContentTypeEmpty.json | 2 +- ...FormAdditionalResponseContentTypeText.json | 2 +- ...nalResponseNoMatchingSchemaDefinition.json | 4 +- ...ropertyFormAdditionalResponseNoSchema.json | 2 +- ...AdditionalResponseNoSchemaDefinitions.json | 2 +- ...opertyFormAdditionalResponseNoSuccess.json | 2 +- ...AdditionalResponseSchemaDefinitionMap.json | 4 +- ...onalResponseSchemaDefinitionNotObject.json | 4 +- ...ertyFormAdditionalResponseSchemaEmpty.json | 2 +- ...ertyFormAdditionalResponseSuccessTrue.json | 2 +- ...AdditionalResponseUnsupportedProperty.json | 2 +- ...opertyFormAdditionalResponsesMultiple.json | 2 +- .../failure/PropertyFormContentTypeText.json | 2 +- .../failure/PropertyFormHeaderCode.json | 2 +- .../failure/PropertyFormHeaderInfo.json | 2 +- .../failure/PropertyFormOpInvoke.json | 2 +- .../failure/PropertyFormOpReadAll.json | 2 +- .../failure/PropertyFormOpReadDuplicate.json | 2 +- .../test-cases/failure/PropertyFormOpSub.json | 2 +- .../failure/PropertyFormOpWriteDuplicate.json | 2 +- .../failure/PropertyFormOpWriteMulti.json | 2 +- ...FormReadAllWithoutAdditionalResponses.json | 4 +- ...plessWithoutTopicAndNoRootFormReadAll.json | 2 +- ...FormReadAllWithoutAdditionalResponses.json | 4 +- ...mReadWithoutTopicAndNoRootFormReadAll.json | 2 +- ...TopicWriteWithTopicAndRootFormReadAll.json | 4 +- .../failure/PropertyFormServiceGroup.json | 2 +- .../PropertyFormTopicNoContentType.json | 4 +- .../PropertyFormTopicTokenExecutorId.json | 2 +- .../PropertyFormTopicTokenInvokerId.json | 2 +- ...picTokenNoActionWhenNoOpAndNoReadOnly.json | 2 +- ...TokenNoActionWhenNoOpAndReadOnlyFalse.json | 2 +- ...ormTopicTokenNoActionWhenReadAndWrite.json | 2 +- .../PropertyFormTopicTokenSenderId.json | 2 +- .../PropertyFormUnsupportedProperty.json | 2 +- ...mWriteMultiWithoutAdditionalResponses.json | 4 +- ...teWithoutTopicAndNoRootFormWriteMulti.json | 2 +- .../failure/PropertyFormsEmpty.json | 2 +- .../failure/PropertyFormsOpReadDuplicate.json | 4 +- .../PropertyFormsOpWriteDuplicate.json | 4 +- .../failure/PropertyFormsOpWriteNoRead.json | 4 +- .../failure/PropertyFormsOplessAndRead.json | 4 +- .../failure/PropertyFormsOplessDuplicate.json | 4 +- .../failure/PropertyIntegerConst.json | 2 +- .../test-cases/failure/PropertyNoForms.json | 4 +- .../failure/PropertyNumberConst.json | 2 +- .../failure/PropertyObjectConst.json | 2 +- .../failure/PropertyObjectErrorMessage.json | 2 +- .../failure/PropertyStringConst.json | 2 +- .../test-cases/failure/PropertyTypeNull.json | 2 +- .../failure/PropertyUnsupportedProperty.json | 2 +- ...ormAdditionalResponseContentTypeEmpty.json | 2 +- ...FormAdditionalResponseContentTypeText.json | 2 +- .../RootFormAdditionalResponseNoSuccess.json | 2 +- .../RootFormAdditionalResponseSchema.json | 2 +- ...RootFormAdditionalResponseSuccessTrue.json | 2 +- ...AdditionalResponseUnsupportedProperty.json | 2 +- .../RootFormAdditionalResponsesAndSubAll.json | 4 +- .../RootFormAdditionalResponsesMultiple.json | 2 +- .../failure/RootFormContentTypeCustom.json | 2 +- .../failure/RootFormContentTypeRaw.json | 2 +- .../failure/RootFormContentTypeText.json | 2 +- .../test-cases/failure/RootFormEmptyHref.json | 16 - .../failure/RootFormHeaderCode.json | 2 +- .../failure/RootFormHeaderInfo.json | 2 +- .../failure/RootFormNoContentType.json | 4 +- .../test-cases/failure/RootFormNoHref.json | 16 - .../test-cases/failure/RootFormNoOp.json | 2 +- .../test-cases/failure/RootFormNoTopic.json | 2 +- .../failure/RootFormOpArrayEmpty.json | 2 +- .../failure/RootFormOpElementEmpty.json | 2 +- .../test-cases/failure/RootFormOpEmpty.json | 2 +- .../failure/RootFormOpReadAllAndSubAll.json | 2 +- .../failure/RootFormOpReadAllDuplicate.json | 2 +- .../test-cases/failure/RootFormOpReadOne.json | 2 +- .../failure/RootFormOpSubAllDuplicate.json | 2 +- .../test-cases/failure/RootFormOpSubOne.json | 2 +- .../failure/RootFormOpWiteMultiAndSubAll.json | 2 +- .../RootFormOpWriteMultiDuplicate.json | 2 +- .../failure/RootFormOpWriteOne.json | 2 +- .../RootFormReadAllButNoProperties.json | 4 +- .../failure/RootFormServiceGroupEmpty.json | 2 +- .../failure/RootFormServiceGroupNoSubAll.json | 2 +- .../failure/RootFormSubAllButNoEvents.json | 4 +- .../failure/RootFormTopicEmpty.json | 2 +- .../failure/RootFormTopicLevelEmpty.json | 2 +- .../failure/RootFormTopicLevelInvalid.json | 2 +- .../failure/RootFormTopicReservedStart.json | 2 +- .../RootFormTopicTokenActionWhenSubAll.json | 2 +- ...ootFormTopicTokenConsumerIdWhenSubAll.json | 2 +- .../RootFormTopicTokenCustomEmpty.json | 2 +- .../RootFormTopicTokenCustomInvalid.json | 2 +- .../failure/RootFormTopicTokenEmpty.json | 2 +- .../failure/RootFormTopicTokenExecutorId.json | 2 +- .../failure/RootFormTopicTokenInvokerId.json | 2 +- ...tFormTopicTokenMaintainerIdWhenSubAll.json | 2 +- ...TokenNoActionWhenReadAllAndWriteMulti.json | 2 +- ...RootFormTopicTokenSenderIdWhenReadAll.json | 2 +- ...tFormTopicTokenSenderIdWhenWriteMulti.json | 2 +- .../RootFormTopicTokenUnrecognized.json | 2 +- ...FormWriteMultiButNoWritableProperties.json | 4 +- .../test-cases/failure/RootFormsEmpty.json | 2 +- .../failure/RootFormsOpReadAllDuplicate.json | 4 +- .../failure/RootFormsOpSubAllDuplicate.json | 4 +- .../RootFormsOpWriteMultiDuplicate.json | 4 +- .../RootFormsOpWriteMultiNoReadAll.json | 4 +- .../failure/SchemaDefinitionArrayConst.json | 2 +- .../SchemaDefinitionArrayItemsNoType.json | 2 +- .../SchemaDefinitionArrayItemsNotObject.json | 2 +- ...SchemaDefinitionArrayItemsObjectConst.json | 2 +- .../SchemaDefinitionArrayItemsRef.json | 2 +- ...SchemaDefinitionArrayItemsStringConst.json | 2 +- ...hemaDefinitionArrayItemsTypeNotString.json | 2 +- .../SchemaDefinitionArrayItemsTypeNull.json | 2 +- ...maDefinitionArrayItemsTypeUnsupported.json | 2 +- .../failure/SchemaDefinitionArrayNoItems.json | 2 +- ...DefinitionBooleanConstValueNotBoolean.json | 4 +- .../SchemaDefinitionBooleanReadOnly.json | 2 +- ...aDefinitionBooleanUnsupportedProperty.json | 2 +- ...maDefinitionIntegerConstValueAboveMax.json | 4 +- ...maDefinitionIntegerConstValueBelowMin.json | 4 +- ...DefinitionIntegerConstValueNotInteger.json | 4 +- ...DefinitionIntegerConstValueNotNumeric.json | 4 +- .../SchemaDefinitionIntegerMaxNotInteger.json | 2 +- .../SchemaDefinitionIntegerMaxNotNumeric.json | 2 +- .../SchemaDefinitionIntegerMinAboveMax.json | 4 +- .../SchemaDefinitionIntegerMinNotInteger.json | 2 +- .../SchemaDefinitionIntegerMinNotNumeric.json | 2 +- .../SchemaDefinitionIntegerReadOnly.json | 2 +- ...aDefinitionIntegerUnsupportedProperty.json | 2 +- ...finitionMapAdditionalPropertiesNoType.json | 2 +- ...itionMapAdditionalPropertiesNotObject.json | 2 +- ...ionMapAdditionalPropertiesObjectConst.json | 2 +- ...aDefinitionMapAdditionalPropertiesRef.json | 2 +- ...ionMapAdditionalPropertiesStringConst.json | 2 +- ...nMapAdditionalPropertiesTypeNotString.json | 2 +- ...nitionMapAdditionalPropertiesTypeNull.json | 2 +- ...apAdditionalPropertiesTypeUnsupported.json | 2 +- .../failure/SchemaDefinitionMapConst.json | 4 +- .../failure/SchemaDefinitionNoType.json | 2 +- ...emaDefinitionNumberConstValueAboveMax.json | 4 +- ...emaDefinitionNumberConstValueBelowMin.json | 4 +- ...aDefinitionNumberConstValueNotNumeric.json | 4 +- .../SchemaDefinitionNumberMaxNotNumeric.json | 2 +- .../SchemaDefinitionNumberMinAboveMax.json | 4 +- .../SchemaDefinitionNumberMinNotNumeric.json | 2 +- .../SchemaDefinitionNumberReadOnly.json | 2 +- ...maDefinitionNumberUnsupportedProperty.json | 2 +- ...chemaDefinitionObjectBothDeterminants.json | 4 +- .../SchemaDefinitionObjectConstNotObject.json | 4 +- ...nitionObjectConstPropertyBooleanConst.json | 4 +- ...nObjectConstPropertyBooleanNotBoolean.json | 4 +- ...nstPropertyBooleanUnsupportedProperty.json | 4 +- ...ionObjectConstPropertyIntegerAboveMax.json | 4 +- ...ionObjectConstPropertyIntegerBelowMin.json | 4 +- ...nitionObjectConstPropertyIntegerConst.json | 4 +- ...nObjectConstPropertyIntegerNotInteger.json | 4 +- ...nObjectConstPropertyIntegerNotNumeric.json | 4 +- ...nstPropertyIntegerUnsupportedProperty.json | 4 +- ...maDefinitionObjectConstPropertyNoType.json | 4 +- ...aDefinitionObjectConstPropertyNoValue.json | 4 +- ...tionObjectConstPropertyNumberAboveMax.json | 4 +- ...tionObjectConstPropertyNumberBelowMin.json | 4 +- ...initionObjectConstPropertyNumberConst.json | 4 +- ...onObjectConstPropertyNumberNotNumeric.json | 4 +- ...onstPropertyNumberUnsupportedProperty.json | 4 +- ...initionObjectConstPropertyStringConst.json | 4 +- ...onstPropertyStringUnsupportedProperty.json | 4 +- ...jectConstPropertyStringValueNotString.json | 4 +- ...efinitionObjectConstPropertyTypeArray.json | 4 +- ...DefinitionObjectConstPropertyTypeNull.json | 4 +- ...finitionObjectConstPropertyTypeObject.json | 4 +- ...ionObjectConstPropertyTypeUnsupported.json | 4 +- ...initionObjectConstUnsupportedProperty.json | 4 +- ...emaDefinitionObjectConstValueNoSchema.json | 4 +- ...efinitionObjectErrorMessageNoProperty.json | 4 +- ...DefinitionObjectErrorMessageNotString.json | 2 +- ...onObjectErrorMessagePropertyNotString.json | 4 +- .../SchemaDefinitionObjectNoDeterminant.json | 2 +- ...maDefinitionObjectPropertiesNotObject.json | 2 +- .../SchemaDefinitionObjectPropertyNoType.json | 2 +- ...maDefinitionObjectPropertyObjectConst.json | 2 +- .../SchemaDefinitionObjectPropertyRef.json | 2 +- ...maDefinitionObjectPropertyStringConst.json | 2 +- ...DefinitionObjectPropertyTypeNotString.json | 2 +- ...chemaDefinitionObjectPropertyTypeNull.json | 2 +- ...finitionObjectPropertyTypeUnsupported.json | 2 +- ...emaDefinitionObjectRequiredNoProperty.json | 4 +- ...hemaDefinitionObjectRequiredNotString.json | 2 +- .../failure/SchemaDefinitionRef.json | 2 +- ...aDefinitionStringConstContentEncoding.json | 4 +- .../SchemaDefinitionStringConstFormat.json | 4 +- .../SchemaDefinitionStringConstPattern.json | 4 +- ...initionStringConstUnsupportedProperty.json | 4 +- ...maDefinitionStringConstValueNotString.json | 4 +- ...initionStringContentEncodingNotString.json | 2 +- ...StringContentEncodingUnsupportedValue.json | 2 +- .../SchemaDefinitionStringEnumConst.json | 4 +- ...maDefinitionStringEnumContentEncoding.json | 4 +- ...emaDefinitionStringEnumElementInvalid.json | 2 +- .../SchemaDefinitionStringEnumFormat.json | 4 +- .../SchemaDefinitionStringEnumPattern.json | 4 +- .../SchemaDefinitionStringEnumReadOnly.json | 4 +- ...finitionStringEnumUnsupportedProperty.json | 4 +- ...initionStringFormatAndContentEncoding.json | 2 +- ...chemaDefinitionStringFormatAndPattern.json | 2 +- ...SchemaDefinitionStringFormatNotString.json | 2 +- ...efinitionStringFormatUnsupportedValue.json | 2 +- ...nitionStringPatternAndContentEncoding.json | 2 +- ...tionStringPatternNotDurationOrDecimal.json | 2 +- ...chemaDefinitionStringPatternNotString.json | 2 +- ...maDefinitionStringPatternRegexInvalid.json | 2 +- .../SchemaDefinitionStringReadOnly.json | 2 +- ...maDefinitionStringUnsupportedProperty.json | 2 +- .../SchemaDefinitionTypeNotString.json | 2 +- .../failure/SchemaDefinitionTypeNull.json | 2 +- .../SchemaDefinitionTypeUnsupported.json | 2 +- .../test-cases/failure/TrailingComma.json | 4 +- .../failure/{IdEmpty.json => TypeEmpty.json} | 4 +- ...Characters.json => TypeNotThingModel.json} | 4 +- .../test-cases/failure/UnclosedArray.json | 2 +- .../test-cases/failure/UnclosedObject.json | 2 +- ...AdditionalResponseContentTypeEmpty.TD.json | 10 +- ...mAdditionalResponseContentTypeText.TD.json | 10 +- ...ResponseNoMatchingSchemaDefinition.TD.json | 10 +- ...tionFormAdditionalResponseNoSchema.TD.json | 10 +- ...itionalResponseNoSchemaDefinitions.TD.json | 10 +- ...ionFormAdditionalResponseNoSuccess.TD.json | 10 +- ...itionalResponseSchemaDefinitionMap.TD.json | 10 +- ...lResponseSchemaDefinitionNotObject.TD.json | 10 +- ...nFormAdditionalResponseSchemaEmpty.TD.json | 10 +- ...nFormAdditionalResponseSuccessTrue.TD.json | 10 +- ...itionalResponseUnsupportedProperty.TD.json | 10 +- ...ionFormAdditionalResponsesMultiple.TD.json | 10 +- .../ActionFormContentTypeText.TD.json | 10 +- .../ActionFormHeaderCodeEmpty.TD.json | 10 +- ...aderCodeNoMatchingSchemaDefinition.TD.json | 10 +- ...nFormHeaderCodeNoSchemaDefinitions.TD.json | 10 +- ...mHeaderCodeSchemaDefinitionNotEnum.TD.json | 10 +- ...tionFormHeaderInfoContentTypeEmpty.TD.json | 10 +- ...onFormHeaderInfoContentTypeNotJson.TD.json | 10 +- .../ActionFormHeaderInfoNoContentType.TD.json | 10 +- ...aderInfoNoMatchingSchemaDefinition.TD.json | 10 +- .../ActionFormHeaderInfoNoSchema.TD.json | 10 +- ...nFormHeaderInfoNoSchemaDefinitions.TD.json | 10 +- ...nFormHeaderInfoSchemaDefinitionMap.TD.json | 10 +- ...eaderInfoSchemaDefinitionNotObject.TD.json | 10 +- .../ActionFormHeaderInfoSchemaEmpty.TD.json | 10 +- .../ActionFormHeaderInfoSuccessTrue.TD.json | 10 +- ...nFormHeaderInfoUnsupportedProperty.TD.json | 10 +- .../ActionFormHeaderInfosMultiple.TD.json | 10 +- .../ActionFormOpInvokeDuplicate.TD.json | 10 +- .../ActionFormServiceGroupEmpty.TD.json | 10 +- .../ActionFormTopicNoContentType.TD.json | 10 +- .../ActionFormTopicTokenAction.TD.json | 10 +- .../ActionFormTopicTokenConsumerId.TD.json | 10 +- .../ActionFormTopicTokenMaintainerId.TD.json | 10 +- .../ActionFormTopicTokenSenderId.TD.json | 10 +- .../ActionFormUnsupportedProperty.TD.json | 10 +- .../ActionFormsMultipleContentTypes.TD.json | 10 +- .../ActionFormsOpInvokeDuplicate.TD.json | 10 +- .../ActionFormsOplessAndInvoke.TD.json | 10 +- .../ActionFormsOplessDuplicate.TD.json | 10 +- .../invalidAioBinding/ActionInputMap.TD.json | 10 +- .../ActionInputNullAndContentTypeJson.TD.json | 10 +- .../ActionInputNumber.TD.json | 10 +- ...ionInputObjectAndContentTypeCustom.TD.json | 10 +- ...ActionInputObjectAndContentTypeRaw.TD.json | 10 +- .../ActionInputObjectConst.TD.json | 10 +- .../ActionInputObjectErrorMessage.TD.json | 10 +- .../ActionInputString.TD.json | 10 +- .../ActionNoForms.TD.json | 10 +- .../ActionNoFormsWithTopic.TD.json | 10 +- .../invalidAioBinding/ActionOutputMap.TD.json | 10 +- ...ActionOutputNullAndContentTypeJson.TD.json | 10 +- .../ActionOutputNumber.TD.json | 10 +- ...onOutputObjectAndContentTypeCustom.TD.json | 10 +- ...ctionOutputObjectAndContentTypeRaw.TD.json | 10 +- .../ActionOutputObjectConst.TD.json | 10 +- .../ActionOutputObjectErrorMessage.TD.json | 10 +- .../ActionOutputString.TD.json | 10 +- .../ActionUnsupportedProperty.TD.json | 10 +- .../ContextDtvWrongPrefix.TD.json | 12 +- .../ContextDtvWrongUri.TD.json | 12 +- .../ContextMissingDtv.TD.json | 12 +- .../EventBooleanConst.TD.json | 12 +- .../EventFormAdditionalResponses.TD.json | 12 +- .../EventFormContentTypeText.TD.json | 12 +- .../EventFormHeaderCode.TD.json | 12 +- .../EventFormHeaderInfo.TD.json | 12 +- .../EventFormOpSubDuplicate.TD.json | 12 +- .../EventFormServiceGroupEmpty.TD.json | 12 +- .../EventFormTopicNoContentType.TD.json | 12 +- .../EventFormTopicTokenAction.TD.json | 10 +- .../EventFormTopicTokenConsumerId.TD.json | 10 +- .../EventFormTopicTokenExecutorId.TD.json | 10 +- .../EventFormTopicTokenInvokerId.TD.json | 10 +- .../EventFormTopicTokenMaintainerId.TD.json | 10 +- .../EventFormUnsupportedProperty.TD.json | 12 +- .../EventFormsOpSubDuplicate.TD.json | 14 +- .../EventFormsOplessAndSub.TD.json | 14 +- .../EventFormsOplessDuplicate.TD.json | 14 +- .../EventIntegerConst.TD.json | 12 +- .../EventNoForms.TD.json | 10 +- ...oFormsWithTopicAndNoRootFormSubAll.TD.json | 10 +- .../EventNullAndContentTypeJson.TD.json | 12 +- .../EventNumberConst.TD.json | 12 +- .../EventObjectAndContentTypeCustom.TD.json | 12 +- .../EventObjectAndContentTypeRaw.TD.json | 12 +- .../EventObjectConst.TD.json | 12 +- .../EventObjectErrorMessage.TD.json | 12 +- .../EventStringConst.TD.json | 12 +- .../EventUnsupportedProperty.TD.json | 12 +- .../IdInvalidCharacters.TD.json | 32 - ...dInvalidReplacementForTokenInTopic.TD.json | 32 - .../invalidAioBinding/LinkEmptyHref.TD.json | 12 +- .../invalidAioBinding/LinkEmptyType.TD.json | 12 +- .../invalidAioBinding/LinkNoHref.TD.json | 12 +- .../invalidAioBinding/LinkNoType.TD.json | 12 +- .../invalidAioBinding/LinkNonJsonFile.TD.json | 12 +- .../LinkNonexistentFile.TD.json | 12 +- .../invalidAioBinding/LinkTypeNotJson.TD.json | 12 +- .../LinkUnsupportedProperty.TD.json | 12 +- .../invalidAioBinding/MultipleLinks.TD.json | 12 +- .../NoTitle.TD.json | 12 +- .../PropertyBooleanConst.TD.json | 10 +- ...AdditionalResponseContentTypeEmpty.TD.json | 10 +- ...mAdditionalResponseContentTypeText.TD.json | 10 +- ...ResponseNoMatchingSchemaDefinition.TD.json | 10 +- ...ertyFormAdditionalResponseNoSchema.TD.json | 10 +- ...itionalResponseNoSchemaDefinitions.TD.json | 10 +- ...rtyFormAdditionalResponseNoSuccess.TD.json | 10 +- ...itionalResponseSchemaDefinitionMap.TD.json | 10 +- ...lResponseSchemaDefinitionNotObject.TD.json | 10 +- ...yFormAdditionalResponseSchemaEmpty.TD.json | 10 +- ...yFormAdditionalResponseSuccessTrue.TD.json | 10 +- ...itionalResponseUnsupportedProperty.TD.json | 10 +- ...rtyFormAdditionalResponsesMultiple.TD.json | 10 +- .../PropertyFormContentTypeText.TD.json | 10 +- .../PropertyFormHeaderCode.TD.json | 10 +- .../PropertyFormHeaderInfo.TD.json | 10 +- .../PropertyFormOpReadDuplicate.TD.json | 10 +- .../PropertyFormOpWriteDuplicate.TD.json | 10 +- ...mReadAllWithoutAdditionalResponses.TD.json | 10 +- ...ssWithoutTopicAndNoRootFormReadAll.TD.json | 10 +- ...mReadAllWithoutAdditionalResponses.TD.json | 10 +- ...adWithoutTopicAndNoRootFormReadAll.TD.json | 10 +- ...icWriteWithTopicAndRootFormReadAll.TD.json | 10 +- .../PropertyFormServiceGroup.TD.json | 10 +- .../PropertyFormTopicNoContentType.TD.json | 10 +- .../PropertyFormTopicTokenExecutorId.TD.json | 10 +- .../PropertyFormTopicTokenInvokerId.TD.json | 10 +- ...TokenNoActionWhenNoOpAndNoReadOnly.TD.json | 10 +- ...enNoActionWhenNoOpAndReadOnlyFalse.TD.json | 10 +- ...TopicTokenNoActionWhenReadAndWrite.TD.json | 10 +- .../PropertyFormTopicTokenSenderId.TD.json | 10 +- .../PropertyFormUnsupportedProperty.TD.json | 10 +- ...iteMultiWithoutAdditionalResponses.TD.json | 10 +- ...ithoutTopicAndNoRootFormWriteMulti.TD.json | 10 +- .../PropertyFormsOpReadDuplicate.TD.json | 10 +- .../PropertyFormsOpWriteDuplicate.TD.json | 10 +- .../PropertyFormsOpWriteNoRead.TD.json | 10 +- .../PropertyFormsOplessAndRead.TD.json | 10 +- .../PropertyFormsOplessDuplicate.TD.json | 10 +- .../PropertyIntegerConst.TD.json | 10 +- .../PropertyNoForms.TD.json | 10 +- .../PropertyNumberConst.TD.json | 10 +- .../PropertyObjectConst.TD.json | 10 +- .../PropertyObjectErrorMessage.TD.json | 10 +- .../PropertyStringConst.TD.json | 10 +- .../PropertyTypeNull.TD.json | 10 +- .../PropertyUnsupportedProperty.TD.json | 10 +- ...AdditionalResponseContentTypeEmpty.TD.json | 14 +- ...mAdditionalResponseContentTypeText.TD.json | 14 +- ...ootFormAdditionalResponseNoSuccess.TD.json | 14 +- .../RootFormAdditionalResponseSchema.TD.json | 14 +- ...tFormAdditionalResponseSuccessTrue.TD.json | 14 +- ...itionalResponseUnsupportedProperty.TD.json | 14 +- ...otFormAdditionalResponsesAndSubAll.TD.json | 14 +- ...ootFormAdditionalResponsesMultiple.TD.json | 14 +- .../RootFormContentTypeCustom.TD.json | 14 +- .../RootFormContentTypeRaw.TD.json | 14 +- .../RootFormContentTypeText.TD.json | 14 +- .../RootFormHeaderCode.TD.json | 14 +- .../RootFormHeaderInfo.TD.json | 14 +- .../RootFormNoContentType.TD.json | 14 +- .../invalidAioBinding/RootFormNoTopic.TD.json | 12 +- .../RootFormOpReadAllAndSubAll.TD.json | 14 +- .../RootFormOpReadAllDuplicate.TD.json | 14 +- .../RootFormOpSubAllDuplicate.TD.json | 14 +- .../RootFormOpWiteMultiAndSubAll.TD.json | 14 +- .../RootFormOpWriteMultiDuplicate.TD.json | 14 +- .../RootFormReadAllButNoProperties.TD.json | 10 +- .../RootFormServiceGroupEmpty.TD.json | 14 +- .../RootFormServiceGroupNoSubAll.TD.json | 14 +- .../RootFormSubAllButNoEvents.TD.json | 10 +- .../RootFormTopicEmpty.TD.json | 12 +- .../RootFormTopicLevelEmpty.TD.json | 12 +- .../RootFormTopicLevelInvalid.TD.json | 12 +- .../RootFormTopicReservedStart.TD.json | 14 +- ...RootFormTopicTokenActionWhenSubAll.TD.json | 12 +- ...FormTopicTokenConsumerIdWhenSubAll.TD.json | 12 +- .../RootFormTopicTokenCustomEmpty.TD.json | 12 +- .../RootFormTopicTokenCustomInvalid.TD.json | 12 +- .../RootFormTopicTokenEmpty.TD.json | 12 +- .../RootFormTopicTokenExecutorId.TD.json | 12 +- .../RootFormTopicTokenInvokerId.TD.json | 12 +- ...rmTopicTokenMaintainerIdWhenSubAll.TD.json | 12 +- ...enNoActionWhenReadAllAndWriteMulti.TD.json | 14 +- ...tFormTopicTokenSenderIdWhenReadAll.TD.json | 12 +- ...rmTopicTokenSenderIdWhenWriteMulti.TD.json | 12 +- .../RootFormTopicTokenUnrecognized.TD.json | 12 +- ...mWriteMultiButNoWritableProperties.TD.json | 10 +- .../RootFormsOpReadAllDuplicate.TD.json | 14 +- .../RootFormsOpSubAllDuplicate.TD.json | 14 +- .../RootFormsOpWriteMultiDuplicate.TD.json | 14 +- .../RootFormsOpWriteMultiNoReadAll.TD.json | 14 +- .../SchemaDefinitionArrayConst.TD.json | 12 +- .../SchemaDefinitionArrayItemsNoType.TD.json | 12 +- ...emaDefinitionArrayItemsObjectConst.TD.json | 12 +- .../SchemaDefinitionArrayItemsRef.TD.json | 12 +- ...emaDefinitionArrayItemsStringConst.TD.json | 12 +- ...SchemaDefinitionArrayItemsTypeNull.TD.json | 12 +- .../SchemaDefinitionArrayNoItems.TD.json | 12 +- ...initionBooleanConstValueNotBoolean.TD.json | 12 +- .../SchemaDefinitionBooleanReadOnly.TD.json | 12 +- ...finitionBooleanUnsupportedProperty.TD.json | 12 +- ...efinitionIntegerConstValueAboveMax.TD.json | 12 +- ...efinitionIntegerConstValueBelowMin.TD.json | 12 +- ...initionIntegerConstValueNotInteger.TD.json | 12 +- ...initionIntegerConstValueNotNumeric.TD.json | 12 +- ...hemaDefinitionIntegerMaxNotInteger.TD.json | 12 +- ...SchemaDefinitionIntegerMinAboveMax.TD.json | 12 +- ...hemaDefinitionIntegerMinNotInteger.TD.json | 12 +- .../SchemaDefinitionIntegerReadOnly.TD.json | 12 +- ...finitionIntegerUnsupportedProperty.TD.json | 12 +- ...itionMapAdditionalPropertiesNoType.TD.json | 12 +- ...MapAdditionalPropertiesObjectConst.TD.json | 12 +- ...finitionMapAdditionalPropertiesRef.TD.json | 12 +- ...MapAdditionalPropertiesStringConst.TD.json | 12 +- ...ionMapAdditionalPropertiesTypeNull.TD.json | 12 +- .../SchemaDefinitionMapConst.TD.json | 12 +- .../SchemaDefinitionNoType.TD.json | 12 +- ...DefinitionNumberConstValueAboveMax.TD.json | 12 +- ...DefinitionNumberConstValueBelowMin.TD.json | 12 +- ...finitionNumberConstValueNotNumeric.TD.json | 12 +- .../SchemaDefinitionNumberMinAboveMax.TD.json | 12 +- .../SchemaDefinitionNumberReadOnly.TD.json | 12 +- ...efinitionNumberUnsupportedProperty.TD.json | 12 +- ...maDefinitionObjectBothDeterminants.TD.json | 12 +- ...hemaDefinitionObjectConstNotObject.TD.json | 12 +- ...ionObjectConstPropertyBooleanConst.TD.json | 12 +- ...jectConstPropertyBooleanNotBoolean.TD.json | 12 +- ...PropertyBooleanUnsupportedProperty.TD.json | 12 +- ...ObjectConstPropertyIntegerAboveMax.TD.json | 12 +- ...ObjectConstPropertyIntegerBelowMin.TD.json | 12 +- ...ionObjectConstPropertyIntegerConst.TD.json | 12 +- ...jectConstPropertyIntegerNotInteger.TD.json | 12 +- ...jectConstPropertyIntegerNotNumeric.TD.json | 12 +- ...PropertyIntegerUnsupportedProperty.TD.json | 12 +- ...efinitionObjectConstPropertyNoType.TD.json | 12 +- ...finitionObjectConstPropertyNoValue.TD.json | 12 +- ...nObjectConstPropertyNumberAboveMax.TD.json | 12 +- ...nObjectConstPropertyNumberBelowMin.TD.json | 12 +- ...tionObjectConstPropertyNumberConst.TD.json | 12 +- ...bjectConstPropertyNumberNotNumeric.TD.json | 12 +- ...tPropertyNumberUnsupportedProperty.TD.json | 12 +- ...tionObjectConstPropertyStringConst.TD.json | 12 +- ...tPropertyStringUnsupportedProperty.TD.json | 12 +- ...tConstPropertyStringValueNotString.TD.json | 12 +- ...nitionObjectConstPropertyTypeArray.TD.json | 12 +- ...initionObjectConstPropertyTypeNull.TD.json | 12 +- ...itionObjectConstPropertyTypeObject.TD.json | 12 +- ...tionObjectConstUnsupportedProperty.TD.json | 12 +- ...DefinitionObjectConstValueNoSchema.TD.json | 12 +- ...nitionObjectErrorMessageNoProperty.TD.json | 12 +- ...initionObjectErrorMessageNotString.TD.json | 12 +- ...bjectErrorMessagePropertyNotString.TD.json | 12 +- ...chemaDefinitionObjectNoDeterminant.TD.json | 12 +- ...efinitionObjectPropertiesNotObject.TD.json | 12 +- ...hemaDefinitionObjectPropertyNoType.TD.json | 12 +- ...efinitionObjectPropertyObjectConst.TD.json | 12 +- .../SchemaDefinitionObjectPropertyRef.TD.json | 12 +- ...efinitionObjectPropertyStringConst.TD.json | 12 +- ...maDefinitionObjectPropertyTypeNull.TD.json | 12 +- ...DefinitionObjectRequiredNoProperty.TD.json | 12 +- .../SchemaDefinitionRef.TD.json | 12 +- ...finitionStringConstContentEncoding.TD.json | 12 +- .../SchemaDefinitionStringConstFormat.TD.json | 12 +- ...SchemaDefinitionStringConstPattern.TD.json | 12 +- ...tionStringConstUnsupportedProperty.TD.json | 12 +- ...efinitionStringConstValueNotString.TD.json | 12 +- ...ingContentEncodingUnsupportedValue.TD.json | 12 +- .../SchemaDefinitionStringEnumConst.TD.json | 12 +- ...efinitionStringEnumContentEncoding.TD.json | 12 +- ...DefinitionStringEnumElementInvalid.TD.json | 12 +- .../SchemaDefinitionStringEnumFormat.TD.json | 12 +- .../SchemaDefinitionStringEnumPattern.TD.json | 12 +- ...SchemaDefinitionStringEnumReadOnly.TD.json | 12 +- ...itionStringEnumUnsupportedProperty.TD.json | 12 +- ...tionStringFormatAndContentEncoding.TD.json | 12 +- ...maDefinitionStringFormatAndPattern.TD.json | 12 +- ...nitionStringFormatUnsupportedValue.TD.json | 12 +- ...ionStringPatternAndContentEncoding.TD.json | 12 +- ...nStringPatternNotDurationOrDecimal.TD.json | 12 +- ...efinitionStringPatternRegexInvalid.TD.json | 12 +- .../SchemaDefinitionStringReadOnly.TD.json | 12 +- ...efinitionStringUnsupportedProperty.TD.json | 12 +- .../SchemaDefinitionTypeNull.TD.json | 12 +- .../invalidAioBinding/TitleEmpty.TD.json | 12 +- .../invalidAioBinding/TitleInvalid.TD.json | 12 +- .../invalidJson/ArrayKey.TD.json | 12 +- .../invalidJson/BooleanKey.TD.json | 12 +- .../invalidJson/DuplicateKey.TD.json | 12 +- .../invalidJson/MissingColon.TD.json | 12 +- .../invalidJson/MissingComma.TD.json | 12 +- .../invalidJson/MissingElement.TD.json | 12 +- .../invalidJson/MissingKey.TD.json | 12 +- .../invalidJson/MissingValue.TD.json | 12 +- .../invalidJson/NumericKey.TD.json | 12 +- .../invalidJson/ObjectKey.TD.json | 12 +- .../invalidJson/TrailingComma.TD.json | 12 +- .../invalidJson/UnclosedArray.TD.json | 12 +- .../invalidJson/UnclosedObject.TD.json | 12 +- .../invalidThing/ActionFormOpRead.TD.json | 10 +- .../invalidThing/ActionFormOpSub.TD.json | 10 +- .../invalidThing/ActionFormOpWrite.TD.json | 10 +- .../invalidThing/ActionFormsEmpty.TD.json | 10 +- .../invalidThing/ContextMissingWot.TD.json | 12 +- .../invalidThing/ContextWrongType.TD.json | 12 +- .../invalidThing/EventFormOpInvoke.TD.json | 12 +- .../invalidThing/EventFormOpRead.TD.json | 12 +- .../invalidThing/EventFormOpSubAll.TD.json | 12 +- .../invalidThing/EventFormOpWrite.TD.json | 12 +- .../invalidThing/EventFormsEmpty.TD.json | 10 +- .../invalidThing/NoContext.TD.json | 12 +- .../NoType.TD.json} | 10 +- .../invalidThing/PropertyFormOpInvoke.TD.json | 10 +- .../PropertyFormOpReadAll.TD.json | 10 +- .../invalidThing/PropertyFormOpSub.TD.json | 10 +- .../PropertyFormOpWriteMulti.TD.json | 10 +- .../invalidThing/PropertyFormsEmpty.TD.json | 10 +- .../invalidThing/RootFormEmptyHref.TD.json | 58 - .../invalidThing/RootFormNoHref.TD.json | 57 - .../invalidThing/RootFormNoOp.TD.json | 14 +- .../invalidThing/RootFormOpArrayEmpty.TD.json | 14 +- .../RootFormOpElementEmpty.TD.json | 14 +- .../invalidThing/RootFormOpEmpty.TD.json | 14 +- .../invalidThing/RootFormOpReadOne.TD.json | 14 +- .../invalidThing/RootFormOpSubOne.TD.json | 14 +- .../invalidThing/RootFormOpWriteOne.TD.json | 14 +- .../invalidThing/RootFormsEmpty.TD.json | 12 +- ...chemaDefinitionArrayItemsNotObject.TD.json | 12 +- ...aDefinitionArrayItemsTypeNotString.TD.json | 12 +- ...efinitionArrayItemsTypeUnsupported.TD.json | 12 +- ...hemaDefinitionIntegerMaxNotNumeric.TD.json | 12 +- ...hemaDefinitionIntegerMinNotNumeric.TD.json | 12 +- ...onMapAdditionalPropertiesNotObject.TD.json | 12 +- ...pAdditionalPropertiesTypeNotString.TD.json | 12 +- ...dditionalPropertiesTypeUnsupported.TD.json | 12 +- ...chemaDefinitionNumberMaxNotNumeric.TD.json | 12 +- ...chemaDefinitionNumberMinNotNumeric.TD.json | 12 +- ...ObjectConstPropertyTypeUnsupported.TD.json | 12 +- ...initionObjectPropertyTypeNotString.TD.json | 12 +- ...itionObjectPropertyTypeUnsupported.TD.json | 12 +- ...aDefinitionObjectRequiredNotString.TD.json | 12 +- ...tionStringContentEncodingNotString.TD.json | 12 +- ...emaDefinitionStringFormatNotString.TD.json | 12 +- ...maDefinitionStringPatternNotString.TD.json | 12 +- .../SchemaDefinitionTypeNotString.TD.json | 12 +- .../SchemaDefinitionTypeUnsupported.TD.json | 12 +- .../invalidThing/TitleNotString.TD.json | 12 +- .../TypeEmpty.TD.json} | 12 +- ...ring.TD.json => TypeNotThingModel.TD.json} | 12 +- .../IdInvalidReplacementButNotInTopic.TD.json | 10 +- .../valid/LinkNoRel.TD.json | 12 +- .../valid/LinkOtherRel.TD.json | 12 +- .../thing-descriptions/valid/Noop.TD.json | 12 +- ...eadablePropertyAdditionalResponses.TD.json | 10 +- ...ritablePropertyAdditionalResponses.TD.json | 10 +- 741 files changed, 3236 insertions(+), 4361 deletions(-) create mode 100644 codegen2/schema/tm-json-schema-validation.json delete mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdInvalidReplacementForTokenInTopic.json delete mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdNotString.json rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/{NoId.json => NoType.json} (68%) delete mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormEmptyHref.json delete mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoHref.json rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/{IdEmpty.json => TypeEmpty.json} (66%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/{IdInvalidCharacters.json => TypeNotThingModel.json} (61%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/{invalidThing => invalidAioBinding}/ActionNoForms.TD.json (60%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/{invalidThing => invalidAioBinding}/EventNoForms.TD.json (65%) delete mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/IdInvalidCharacters.TD.json delete mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/IdInvalidReplacementForTokenInTopic.TD.json rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/{invalidThing => invalidAioBinding}/NoTitle.TD.json (66%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/{invalidThing => invalidAioBinding}/PropertyNoForms.TD.json (62%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/{invalidAioBinding/NoId.TD.json => invalidThing/NoType.TD.json} (70%) delete mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormEmptyHref.TD.json delete mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormNoHref.TD.json rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/{invalidAioBinding/IdEmpty.TD.json => invalidThing/TypeEmpty.TD.json} (68%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{IdNotString.TD.json => TypeNotThingModel.TD.json} (68%) diff --git a/codegen2/schema/tm-json-schema-validation.json b/codegen2/schema/tm-json-schema-validation.json new file mode 100644 index 0000000000..0b502d812e --- /dev/null +++ b/codegen2/schema/tm-json-schema-validation.json @@ -0,0 +1,2063 @@ +{ + "title": "Thing Model", + "version": "1.1-12-March-2025", + "description": "JSON Schema for validating Thing Models. This is automatically generated from the WoT TD Schema.", + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://raw.githubusercontent.com/w3c/wot-thing-description/main/validation/tm-json-schema-validation.json", + "definitions": { + "anyUri": { + "type": "string" + }, + "description": { + "type": "string" + }, + "descriptions": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "title": { + "type": "string" + }, + "titles": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "security": { + "oneOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "scopes": { + "oneOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "subprotocol": { + "type": "string", + "examples": [ + "longpoll", + "websub", + "sse" + ] + }, + "thing-context-td-uri-v1": { + "type": "string", + "const": "https://www.w3.org/2019/wot/td/v1" + }, + "thing-context-td-uri-v1.1": { + "type": "string", + "const": "https://www.w3.org/2022/wot/td/v1.1" + }, + "thing-context-td-uri-temp": { + "type": "string", + "const": "http://www.w3.org/ns/td" + }, + "thing-context": { + "anyOf": [ + { + "$comment": "New context URI with other vocabularies after it but not the old one", + "type": "array", + "items": [ + { + "$ref": "#/definitions/thing-context-td-uri-v1.1" + } + ], + "additionalItems": { + "anyOf": [ + { + "$ref": "#/definitions/anyUri" + }, + { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + ], + "not": { + "$ref": "#/definitions/thing-context-td-uri-v1" + } + } + }, + { + "$comment": "Only the new context URI", + "$ref": "#/definitions/thing-context-td-uri-v1.1" + }, + { + "$comment": "Old context URI, followed by the new one and possibly other vocabularies. minItems and contains are required since prefixItems does not say all items should be provided", + "type": "array", + "items": [ + { + "$ref": "#/definitions/thing-context-td-uri-v1" + }, + { + "$ref": "#/definitions/thing-context-td-uri-v1.1" + } + ], + "minItems": 2, + "additionalItems": { + "anyOf": [ + { + "$ref": "#/definitions/anyUri" + }, + { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + ] + } + }, + { + "$comment": "Old context URI, followed by possibly other vocabularies. minItems and contains are required since prefixItems does not say all items should be provided", + "type": "array", + "items": [ + { + "$ref": "#/definitions/thing-context-td-uri-v1" + } + ], + "minItems": 1, + "additionalItems": { + "anyOf": [ + { + "$ref": "#/definitions/anyUri" + }, + { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + ] + } + }, + { + "$comment": "Only the old context URI", + "$ref": "#/definitions/thing-context-td-uri-v1" + } + ] + }, + "bcp47_string": { + "type": "string", + "pattern": "^(((([A-Za-z]{2,3}(-([A-Za-z]{3}(-[A-Za-z]{3}){0,2}))?)|[A-Za-z]{4}|[A-Za-z]{5,8})(-([A-Za-z]{4}))?(-([A-Za-z]{2}|[0-9]{3}))?(-([A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3}))*(-([0-9A-WY-Za-wy-z](-[A-Za-z0-9]{2,8})+))*(-(x(-[A-Za-z0-9]{1,8})+))?)|(x(-[A-Za-z0-9]{1,8})+)|((en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE)|(art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang)))$" + }, + "type_declaration": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "dataSchema-type": { + "type": "string", + "anyOf": [ + { + "enum": [ + "boolean", + "integer", + "number", + "string", + "object", + "array", + "null" + ] + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "dataSchema": { + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "title": { + "$ref": "#/definitions/title" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "titles": { + "$ref": "#/definitions/titles" + }, + "writeOnly": { + "anyOf": [ + { + "type": "boolean" + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "readOnly": { + "anyOf": [ + { + "type": "boolean" + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "oneOf": { + "type": "array", + "items": { + "$ref": "#/definitions/dataSchema" + } + }, + "unit": { + "type": "string" + }, + "enum": { + "anyOf": [ + { + "type": "array", + "minItems": 1, + "uniqueItems": true + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "format": { + "type": "string" + }, + "const": {}, + "default": {}, + "contentEncoding": { + "type": "string" + }, + "contentMediaType": { + "type": "string" + }, + "type": { + "$ref": "#/definitions/dataSchema-type" + }, + "items": { + "oneOf": [ + { + "$ref": "#/definitions/dataSchema" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/dataSchema" + } + } + ] + }, + "maxItems": { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "minItems": { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "minimum": { + "anyOf": [ + { + "type": "number" + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "maximum": { + "anyOf": [ + { + "type": "number" + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "exclusiveMinimum": { + "type": "number" + }, + "exclusiveMaximum": { + "type": "number" + }, + "minLength": { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "maxLength": { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "multipleOf": { + "$ref": "#/definitions/multipleOfDefinition" + }, + "properties": { + "additionalProperties": { + "$ref": "#/definitions/dataSchema" + } + }, + "required": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "tm:ref": { + "$ref": "#/definitions/tm_ref" + } + }, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "additionalResponsesDefinition": { + "type": "array", + "items": { + "type": "object", + "properties": { + "contentType": { + "type": "string" + }, + "schema": { + "type": "string" + }, + "success": { + "type": "boolean" + } + } + } + }, + "multipleOfDefinition": { + "anyOf": [ + { + "type": [ + "integer", + "number" + ], + "exclusiveMinimum": 0 + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "expectedResponse": { + "type": "object", + "properties": { + "contentType": { + "type": "string" + } + }, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "form_element_base": { + "type": "object", + "properties": { + "op": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "href": { + "$ref": "#/definitions/anyUri" + }, + "contentType": { + "type": "string" + }, + "contentCoding": { + "type": "string" + }, + "subprotocol": { + "$ref": "#/definitions/subprotocol" + }, + "security": { + "$ref": "#/definitions/security" + }, + "scopes": { + "$ref": "#/definitions/scopes" + }, + "response": { + "$ref": "#/definitions/expectedResponse" + }, + "additionalResponses": { + "$ref": "#/definitions/additionalResponsesDefinition" + } + }, + "additionalProperties": true, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "form_element_property": { + "allOf": [ + { + "$ref": "#/definitions/form_element_base" + } + ], + "type": "object", + "properties": { + "op": { + "oneOf": [ + { + "type": "string", + "anyOf": [ + { + "enum": [ + "readproperty", + "writeproperty", + "observeproperty", + "unobserveproperty" + ] + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + { + "type": "array", + "items": { + "type": "string", + "anyOf": [ + { + "enum": [ + "readproperty", + "writeproperty", + "observeproperty", + "unobserveproperty" + ] + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "minItems": 1 + } + ] + }, + "tm:ref": { + "$ref": "#/definitions/tm_ref" + } + }, + "additionalProperties": true, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "form_element_action": { + "allOf": [ + { + "$ref": "#/definitions/form_element_base" + } + ], + "type": "object", + "properties": { + "op": { + "oneOf": [ + { + "type": "string", + "anyOf": [ + { + "enum": [ + "invokeaction", + "queryaction", + "cancelaction" + ] + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + { + "type": "array", + "items": { + "type": "string", + "anyOf": [ + { + "enum": [ + "invokeaction", + "queryaction", + "cancelaction" + ] + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "minItems": 1 + } + ] + }, + "tm:ref": { + "$ref": "#/definitions/tm_ref" + } + }, + "additionalProperties": true, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "form_element_event": { + "allOf": [ + { + "$ref": "#/definitions/form_element_base" + } + ], + "type": "object", + "properties": { + "op": { + "oneOf": [ + { + "type": "string", + "anyOf": [ + { + "enum": [ + "subscribeevent", + "unsubscribeevent" + ] + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + { + "type": "array", + "items": { + "type": "string", + "anyOf": [ + { + "enum": [ + "subscribeevent", + "unsubscribeevent" + ] + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "minItems": 1 + } + ] + }, + "tm:ref": { + "$ref": "#/definitions/tm_ref" + } + }, + "additionalProperties": true, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "form_element_root": { + "allOf": [ + { + "$ref": "#/definitions/form_element_base" + } + ], + "type": "object", + "properties": { + "op": { + "oneOf": [ + { + "type": "string", + "anyOf": [ + { + "enum": [ + "readallproperties", + "writeallproperties", + "readmultipleproperties", + "writemultipleproperties", + "observeallproperties", + "unobserveallproperties", + "queryallactions", + "subscribeallevents", + "unsubscribeallevents" + ] + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + { + "type": "array", + "items": { + "type": "string", + "anyOf": [ + { + "enum": [ + "readallproperties", + "writeallproperties", + "readmultipleproperties", + "writemultipleproperties", + "observeallproperties", + "unobserveallproperties", + "queryallactions", + "subscribeallevents", + "unsubscribeallevents" + ] + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "minItems": 1 + } + ] + }, + "tm:ref": { + "$ref": "#/definitions/tm_ref" + } + }, + "additionalProperties": true, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "form": { + "$comment": "This is NOT for validation purposes but for automatic generation of TS types. For more info, please see: https://github.com/w3c/wot-thing-description/pull/1319#issuecomment-994950057", + "oneOf": [ + { + "$ref": "#/definitions/form_element_property" + }, + { + "$ref": "#/definitions/form_element_action" + }, + { + "$ref": "#/definitions/form_element_event" + }, + { + "$ref": "#/definitions/form_element_root" + } + ] + }, + "property_element": { + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "title": { + "$ref": "#/definitions/title" + }, + "titles": { + "$ref": "#/definitions/titles" + }, + "forms": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/form_element_property" + } + }, + "uriVariables": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/dataSchema" + }, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "observable": { + "anyOf": [ + { + "type": "boolean" + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "writeOnly": { + "anyOf": [ + { + "type": "boolean" + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "readOnly": { + "anyOf": [ + { + "type": "boolean" + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "oneOf": { + "type": "array", + "items": { + "$ref": "#/definitions/dataSchema" + } + }, + "unit": { + "type": "string" + }, + "enum": { + "anyOf": [ + { + "type": "array", + "minItems": 1, + "uniqueItems": true + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "format": { + "type": "string" + }, + "const": {}, + "default": {}, + "type": { + "$ref": "#/definitions/dataSchema-type" + }, + "items": { + "oneOf": [ + { + "$ref": "#/definitions/dataSchema" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/dataSchema" + } + } + ] + }, + "maxItems": { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "minItems": { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "minimum": { + "anyOf": [ + { + "type": "number" + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "maximum": { + "anyOf": [ + { + "type": "number" + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "exclusiveMinimum": { + "type": "number" + }, + "exclusiveMaximum": { + "type": "number" + }, + "minLength": { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "maxLength": { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "multipleOf": { + "$ref": "#/definitions/multipleOfDefinition" + }, + "properties": { + "additionalProperties": { + "$ref": "#/definitions/dataSchema" + } + }, + "required": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "tm:ref": { + "$ref": "#/definitions/tm_ref" + } + }, + "additionalProperties": true, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "action_element": { + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "title": { + "$ref": "#/definitions/title" + }, + "titles": { + "$ref": "#/definitions/titles" + }, + "forms": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/form_element_action" + } + }, + "uriVariables": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/dataSchema" + }, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "input": { + "$ref": "#/definitions/dataSchema" + }, + "output": { + "$ref": "#/definitions/dataSchema" + }, + "safe": { + "anyOf": [ + { + "type": "boolean" + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "idempotent": { + "anyOf": [ + { + "type": "boolean" + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "synchronous": { + "anyOf": [ + { + "type": "boolean" + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "tm:ref": { + "$ref": "#/definitions/tm_ref" + } + }, + "additionalProperties": true, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "event_element": { + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "title": { + "$ref": "#/definitions/title" + }, + "titles": { + "$ref": "#/definitions/titles" + }, + "forms": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/form_element_event" + } + }, + "uriVariables": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/dataSchema" + }, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "subscription": { + "$ref": "#/definitions/dataSchema" + }, + "data": { + "$ref": "#/definitions/dataSchema" + }, + "dataResponse": { + "$ref": "#/definitions/dataSchema" + }, + "cancellation": { + "$ref": "#/definitions/dataSchema" + }, + "tm:ref": { + "$ref": "#/definitions/tm_ref" + } + }, + "additionalProperties": true, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "base_link_element": { + "type": "object", + "properties": { + "href": { + "$ref": "#/definitions/anyUri" + }, + "type": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "anchor": { + "$ref": "#/definitions/anyUri" + }, + "hreflang": { + "anyOf": [ + { + "$ref": "#/definitions/bcp47_string" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/bcp47_string" + } + } + ] + }, + "instanceName": { + "type": "string" + } + }, + "additionalProperties": true, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "link_element": { + "allOf": [ + { + "$ref": "#/definitions/base_link_element" + }, + { + "not": { + "description": "A basic link element should not contain sizes", + "type": "object", + "properties": { + "sizes": {} + }, + "required": [ + "sizes" + ] + } + }, + { + "not": { + "description": "A basic link element should not contain icon", + "properties": { + "rel": { + "anyOf": [ + { + "enum": [ + "icon" + ] + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + } + }, + "required": [ + "rel" + ] + } + } + ] + }, + "icon_link_element": { + "allOf": [ + { + "$ref": "#/definitions/base_link_element" + }, + { + "properties": { + "rel": { + "const": "icon" + }, + "sizes": { + "type": "string", + "pattern": "[0-9]*x[0-9]+" + } + }, + "required": [ + "rel" + ] + } + ] + }, + "additionalSecurityScheme": { + "description": "Applies to additional SecuritySchemes not defined in the WoT TD specification.", + "$comment": "Additional SecuritySchemes should always be defined via a context extension, using a prefixed value for the scheme. This prefix (e.g. 'ace', see the example below) must contain at least one character in order to reference a valid JSON-LD context extension.", + "examples": [ + { + "scheme": "ace:ACESecurityScheme", + "ace:as": "coaps://as.example.com/token", + "ace:audience": "coaps://rs.example.com", + "ace:scopes": [ + "limited", + "special" + ], + "ace:cnonce": true + } + ], + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "proxy": { + "$ref": "#/definitions/anyUri" + }, + "scheme": { + "type": "string", + "pattern": ".+:.*" + } + }, + "additionalProperties": true, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "noSecurityScheme": { + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "proxy": { + "$ref": "#/definitions/anyUri" + }, + "scheme": { + "type": "string", + "anyOf": [ + { + "enum": [ + "nosec" + ] + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "tm:ref": { + "$ref": "#/definitions/tm_ref" + } + }, + "additionalProperties": true, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "autoSecurityScheme": { + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "proxy": { + "$ref": "#/definitions/anyUri" + }, + "scheme": { + "type": "string", + "anyOf": [ + { + "enum": [ + "auto" + ] + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + } + }, + "not": { + "required": [ + "name" + ] + }, + "additionalProperties": true, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "comboSecurityScheme": { + "oneOf": [ + { + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "proxy": { + "$ref": "#/definitions/anyUri" + }, + "scheme": { + "type": "string", + "anyOf": [ + { + "enum": [ + "combo" + ] + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "oneOf": { + "type": "array", + "minItems": 2, + "items": { + "type": "string" + } + }, + "tm:ref": { + "$ref": "#/definitions/tm_ref" + } + }, + "additionalProperties": true + }, + { + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "proxy": { + "$ref": "#/definitions/anyUri" + }, + "scheme": { + "type": "string", + "anyOf": [ + { + "enum": [ + "combo" + ] + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "allOf": { + "type": "array", + "minItems": 2, + "items": { + "type": "string" + } + }, + "tm:ref": { + "$ref": "#/definitions/tm_ref" + } + }, + "additionalProperties": true + } + ] + }, + "basicSecurityScheme": { + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "proxy": { + "$ref": "#/definitions/anyUri" + }, + "scheme": { + "type": "string", + "anyOf": [ + { + "enum": [ + "basic" + ] + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "in": { + "type": "string", + "anyOf": [ + { + "enum": [ + "header", + "query", + "body", + "cookie", + "auto" + ] + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "name": { + "type": "string" + }, + "tm:ref": { + "$ref": "#/definitions/tm_ref" + } + }, + "additionalProperties": true, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "digestSecurityScheme": { + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "proxy": { + "$ref": "#/definitions/anyUri" + }, + "scheme": { + "type": "string", + "anyOf": [ + { + "enum": [ + "digest" + ] + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "qop": { + "type": "string", + "anyOf": [ + { + "enum": [ + "auth", + "auth-int" + ] + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "in": { + "type": "string", + "anyOf": [ + { + "enum": [ + "header", + "query", + "body", + "cookie", + "auto" + ] + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "name": { + "type": "string" + }, + "tm:ref": { + "$ref": "#/definitions/tm_ref" + } + }, + "additionalProperties": true, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "apiKeySecurityScheme": { + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "proxy": { + "$ref": "#/definitions/anyUri" + }, + "scheme": { + "type": "string", + "anyOf": [ + { + "enum": [ + "apikey" + ] + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "in": { + "type": "string", + "anyOf": [ + { + "enum": [ + "header", + "query", + "body", + "cookie", + "uri", + "auto" + ] + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "name": { + "type": "string" + }, + "tm:ref": { + "$ref": "#/definitions/tm_ref" + } + }, + "additionalProperties": true, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "bearerSecurityScheme": { + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "proxy": { + "$ref": "#/definitions/anyUri" + }, + "scheme": { + "type": "string", + "anyOf": [ + { + "enum": [ + "bearer" + ] + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "authorization": { + "$ref": "#/definitions/anyUri" + }, + "alg": { + "type": "string" + }, + "format": { + "type": "string" + }, + "in": { + "type": "string", + "anyOf": [ + { + "enum": [ + "header", + "query", + "body", + "cookie", + "auto" + ] + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "name": { + "type": "string" + }, + "tm:ref": { + "$ref": "#/definitions/tm_ref" + } + }, + "additionalProperties": true, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "pskSecurityScheme": { + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "proxy": { + "$ref": "#/definitions/anyUri" + }, + "scheme": { + "type": "string", + "anyOf": [ + { + "enum": [ + "psk" + ] + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "identity": { + "type": "string" + }, + "tm:ref": { + "$ref": "#/definitions/tm_ref" + } + }, + "additionalProperties": true, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "oAuth2SecurityScheme": { + "type": "object", + "properties": { + "@type": { + "$ref": "#/definitions/type_declaration" + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "proxy": { + "$ref": "#/definitions/anyUri" + }, + "scheme": { + "type": "string", + "anyOf": [ + { + "enum": [ + "oauth2" + ] + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "authorization": { + "$ref": "#/definitions/anyUri" + }, + "token": { + "$ref": "#/definitions/anyUri" + }, + "refresh": { + "$ref": "#/definitions/anyUri" + }, + "scopes": { + "oneOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "flow": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "string", + "anyOf": [ + { + "enum": [ + "code", + "client" + ] + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + } + ] + }, + "tm:ref": { + "$ref": "#/definitions/tm_ref" + } + }, + "additionalProperties": true, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "securityScheme": { + "anyOf": [ + { + "$ref": "#/definitions/noSecurityScheme" + }, + { + "$ref": "#/definitions/autoSecurityScheme" + }, + { + "$ref": "#/definitions/comboSecurityScheme" + }, + { + "$ref": "#/definitions/basicSecurityScheme" + }, + { + "$ref": "#/definitions/digestSecurityScheme" + }, + { + "$ref": "#/definitions/apiKeySecurityScheme" + }, + { + "$ref": "#/definitions/bearerSecurityScheme" + }, + { + "$ref": "#/definitions/pskSecurityScheme" + }, + { + "$ref": "#/definitions/oAuth2SecurityScheme" + }, + { + "$ref": "#/definitions/additionalSecurityScheme" + } + ] + }, + "tm_type_declaration": { + "oneOf": [ + { + "type": "string", + "const": "tm:ThingModel" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "contains": { + "const": "tm:ThingModel" + } + } + ] + }, + "placeholder-pattern": { + "type": "string", + "pattern": "^.*[{]{2}[ -~]+[}]{2}.*$" + }, + "tm_optional": { + "type": "array", + "items": { + "$comment": "this first checks for the general structure of /properties/myProp and then prohibits using / 3 times", + "allOf": [ + { + "type": "string", + "pattern": "^((/properties/)|(/actions/)|(/events/))(([^/]))", + "$comment": "regex tests available at https://regex101.com/r/UgOzrJ/1" + }, + { + "not": { + "type": "string", + "pattern": "(/)(.*/){2}", + "$comment": "regex tests available at https://regex101.com/r/r7vB0r/2" + } + } + ] + } + }, + "tm_ref": { + "type": "string", + "format": "uri-reference" + } + }, + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "title": { + "$ref": "#/definitions/title" + }, + "titles": { + "$ref": "#/definitions/titles" + }, + "properties": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/property_element" + }, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "actions": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/action_element" + }, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "events": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/event_element" + }, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "description": { + "$ref": "#/definitions/description" + }, + "descriptions": { + "$ref": "#/definitions/descriptions" + }, + "version": { + "anyOf": [ + { + "type": "object", + "properties": { + "model": { + "type": "string" + } + }, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + }, + "not": { + "type": "object", + "properties": { + "instance": { + "type": "string" + } + }, + "required": [ + "instance" + ] + } + }, + { + "$ref": "#/definitions/placeholder-pattern" + } + ] + }, + "links": { + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "#/definitions/link_element" + }, + { + "$ref": "#/definitions/icon_link_element" + } + ] + } + }, + "forms": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/form_element_root" + } + }, + "base": { + "$ref": "#/definitions/anyUri" + }, + "securityDefinitions": { + "type": "object", + "minProperties": 1, + "additionalProperties": { + "$ref": "#/definitions/securityScheme" + }, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "schemaDefinitions": { + "type": "object", + "minProperties": 1, + "additionalProperties": { + "$ref": "#/definitions/dataSchema" + }, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "support": { + "$ref": "#/definitions/anyUri" + }, + "created": { + "type": "string" + }, + "modified": { + "type": "string" + }, + "profile": { + "oneOf": [ + { + "$ref": "#/definitions/anyUri" + }, + { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/anyUri" + } + } + ] + }, + "security": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + } + ] + }, + "uriVariables": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/dataSchema" + }, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + } + }, + "@type": { + "$ref": "#/definitions/tm_type_declaration" + }, + "@context": { + "$ref": "#/definitions/thing-context" + }, + "tm:optional": { + "$ref": "#/definitions/tm_optional" + } + }, + "additionalProperties": true, + "propertyNames": { + "not": { + "$ref": "#/definitions/placeholder-pattern" + } + }, + "required": [ + "@context", + "@type" + ] +} \ No newline at end of file diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs index a5cd5ac75c..dec3f9f945 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs @@ -6,7 +6,6 @@ public class ErrorLog { - private readonly Dictionary>> idsOfThings; private readonly Dictionary> referencesFromThings; private readonly Dictionary<(string, string), List> typedReferencesFromThings; private readonly Dictionary> namesInThings; @@ -26,7 +25,6 @@ public class ErrorLog public ErrorLog(string defaultFolder) { - this.idsOfThings = new Dictionary>>(); this.referencesFromThings = new Dictionary>(); this.typedReferencesFromThings = new Dictionary<(string, string), List>(); this.namesInThings = new Dictionary>(); @@ -41,17 +39,6 @@ public ErrorLog(string defaultFolder) public void CheckForDuplicatesInThings() { - foreach (var (id, idSites) in idsOfThings) - { - if (idSites.Count > 1) - { - foreach (var (filename, lineNumber) in idSites) - { - AddError(ErrorLevel.Error, ErrorCondition.Duplication, $"Duplicate use of '{TDThing.IdName}' value '{id}' across TDs.", filename, lineNumber, crossRef: id); - } - } - } - foreach (var (name, nameSites) in namesInThings) { if (nameSites.Count > 1) @@ -127,17 +114,6 @@ public void RegisterTypedReferenceFromThing(string refPath, string filename, int typedReferences.Add(new ValueReference(filename, lineNumber, refValue)); } - public void RegisterIdOfThing(string id, string filename, int lineNumber) - { - if (!idsOfThings.TryGetValue(id, out List>? idSites)) - { - idSites = new(); - idsOfThings[id] = idSites; - } - - idSites.Add(new KeyValuePair(filename, lineNumber)); - } - public void RegisterNameInThing(string name, string filename, int lineNumber) { if (!namesInThings.TryGetValue(name, out Dictionary? nameSites)) diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs index 9faec33079..7f2cb54d08 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs @@ -34,11 +34,6 @@ public void RegisterTypedReferenceFromThing(long byteIndex, string type, string this.errorLog.RegisterTypedReferenceFromThing(refPath, this.filename, GetLineNumber(byteIndex), type, refValue); } - public void RegisterIdOfThing(ValueTracker id) - { - this.errorLog.RegisterIdOfThing(id.Value.Value, this.filename, GetLineNumber(id.TokenIndex)); - } - public void RegisterNameInThing(string name, long byteIndex) { this.errorLog.RegisterNameInThing(name, this.filename, GetLineNumber(byteIndex)); diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/MqttTopicTokens.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/MqttTopicTokens.cs index 1f557d8026..ad987f42f8 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/MqttTopicTokens.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/MqttTopicTokens.cs @@ -10,11 +10,6 @@ public static class MqttTopicTokens /// public const string PrefixCustom = "ex:"; - /// - /// Token representing the ID of a service. - /// - public const string ModelId = "modelId"; - /// /// Token representing the ID of an Action executor, should be used only in Action topic patterns. /// diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/TDValues.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/TDValues.cs index 643c54ad7d..7d19760cb4 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/TDValues.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/TDValues.cs @@ -10,6 +10,8 @@ public static class TDValues public const string ContentTypeRaw = "application/octet-stream"; public const string ContentTypeCustom = ""; + public const string TypeThingModel = "tm:ThingModel"; + public const string OpInvokeAction = "invokeaction"; public const string OpReadProp = "readproperty"; public const string OpWriteProp = "writeproperty"; diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs index 31ec4706ba..4b6d4e2cfb 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs @@ -39,44 +39,42 @@ public bool TryValidateThng(TDThing thing, HashSet serializ hasError = true; } - if (!TryValidateTitle(thing.Title)) + if (!TryValidateType(thing.Type)) { hasError = true; } - if (!TryValidateLinks(thing.Links)) + if (!TryValidateTitle(thing.Title)) { hasError = true; } - if (!TryValidateSchemaDefinitions(thing.SchemaDefinitions)) + if (!TryValidateLinks(thing.Links)) { hasError = true; } - ValueTracker? modelIdTopic = null; - - if (!TryValidateRootForms(thing.Forms, thing.SchemaDefinitions, thing.Id, serializationFormats, ref modelIdTopic)) + if (!TryValidateSchemaDefinitions(thing.SchemaDefinitions)) { hasError = true; } - if (!TryValidateActions(thing.Actions, thing.SchemaDefinitions, thing.Id, serializationFormats, ref modelIdTopic)) + if (!TryValidateRootForms(thing.Forms, thing.SchemaDefinitions, serializationFormats)) { hasError = true; } - if (!TryValidateProperties(thing.Properties, thing.SchemaDefinitions, thing.Id, serializationFormats, ref modelIdTopic)) + if (!TryValidateActions(thing.Actions, thing.SchemaDefinitions, serializationFormats)) { hasError = true; } - if (!TryValidateEvents(thing.Events, thing.SchemaDefinitions, thing.Id, serializationFormats, ref modelIdTopic)) + if (!TryValidateProperties(thing.Properties, thing.SchemaDefinitions, serializationFormats)) { hasError = true; } - if (!TryValidateId(thing.Id, modelIdTopic)) + if (!TryValidateEvents(thing.Events, thing.SchemaDefinitions, serializationFormats)) { hasError = true; } @@ -101,6 +99,23 @@ public bool TryValidateThng(TDThing thing, HashSet serializ hasError = true; } + HashSet supportedProperties = new() + { + TDThing.ContextName, + TDThing.TypeName, + TDThing.TitleName, + TDThing.LinksName, + TDThing.SchemaDefinitionsName, + TDThing.FormsName, + TDThing.ActionsName, + TDThing.PropertiesName, + TDThing.EventsName, + }; + if (!TryValidateResidualProperties(thing.PropertyNames, supportedProperties, null, "an AIO Thing Model")) + { + hasError = true; + } + CheckSchemaDefinitionsCoverage(thing.SchemaDefinitions, thing.Actions, thing.Properties); if ((thing.Actions?.Entries?.Count ?? 0) == 0 && (thing.Properties?.Entries?.Count ?? 0) == 0 && (thing.Events?.Entries?.Count ?? 0) == 0) @@ -173,14 +188,14 @@ private void CheckSchemaDefinitionsCoverage(MapTracker? schemaDefi } } - private bool TryValidateRootForms(ArrayTracker? forms, MapTracker? schemaDefinitions, ValueTracker? id, HashSet serializationFormats, ref ValueTracker? modelIdTopic) + private bool TryValidateRootForms(ArrayTracker? forms, MapTracker? schemaDefinitions, HashSet serializationFormats) { if (forms?.Elements == null) { return true; } - if (!TryValidateForms(forms, FormsKind.Root, schemaDefinitions, id, out ValueTracker? contentType, ref modelIdTopic)) + if (!TryValidateForms(forms, FormsKind.Root, schemaDefinitions, out ValueTracker? contentType)) { return false; } @@ -433,43 +448,26 @@ private bool TryValidateContext(ArrayTracker? context) return !hasError; } - private bool TryValidateId(ValueTracker? id, ValueTracker? modelIdTopic) + private bool TryValidateType(ValueTracker? type) { - if (id == null) + if (type == null) { - errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Thing Description is missing required '{TDThing.IdName}' property.", -1); + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Thing Description is missing required '{TDThing.TypeName}' property.", -1); return false; } - if (string.IsNullOrWhiteSpace(id.Value.Value)) + if (string.IsNullOrWhiteSpace(type.Value.Value)) { - errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Thing Description '{TDThing.IdName}' property has empty value.", id.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Thing Description '{TDThing.TypeName}' property has empty value.", type.TokenIndex); return false; } - if (id.Value.Value.Any(c => c is < '!' or > '~')) + if (type.Value.Value != TDValues.TypeThingModel) { - errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Thing Description '{TDThing.IdName}' property value \"{id.Value.Value}\" contains invalid character(s); only printable ASCII characters not including space are allowed.", id.TokenIndex); + errorReporter?.ReportError(ErrorCondition.PropertyInvalid, $"Thing Description '{TDThing.TypeName}' property value '{type.Value.Value}' is not correct; value must be `{TDValues.TypeThingModel}`.", type.TokenIndex); return false; } - if (modelIdTopic != null) - { - if (id.Value.Value.Any(c => c is '+' or '#' or '{' or '}')) - { - errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Thing Description '{TDThing.IdName}' property value \"{id.Value.Value}\" contains invalid character(s); only printable ASCII characters not including space, '\"', '+', '#', '{{', or '}}' are allowed when TD includes a topic that contains token '{{{MqttTopicTokens.ModelId}}}'.", id.TokenIndex, modelIdTopic.TokenIndex); - return false; - } - - if (id.Value.Value.StartsWith('/') || id.Value.Value.EndsWith('/') || id.Value.Value.Contains("//")) - { - errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Thing Description '{TDThing.IdName}' property value \"{id.Value.Value}\" must not start with, end with, or contain more than one successive '/' when TD includes a topic that contains token '{{{MqttTopicTokens.ModelId}}}'.", id.TokenIndex, modelIdTopic.TokenIndex); - return false; - } - } - - errorReporter.RegisterIdOfThing(id); - return true; } @@ -594,7 +592,7 @@ private bool TryValidateSchemaDefinitions(MapTracker? schemaDefini return !hasError; } - private bool TryValidateActions(MapTracker? actions, MapTracker? schemaDefinitions, ValueTracker? id, HashSet serializationFormats, ref ValueTracker? modelIdTopic) + private bool TryValidateActions(MapTracker? actions, MapTracker? schemaDefinitions, HashSet serializationFormats) { if (actions?.Entries == null) { @@ -605,7 +603,7 @@ private bool TryValidateActions(MapTracker? actions, MapTracker> action in actions.Entries) { - if (!TryValidateAction(action.Key, action.Value, schemaDefinitions, id, out ValueTracker? contentType, ref modelIdTopic)) + if (!TryValidateAction(action.Key, action.Value, schemaDefinitions, out ValueTracker? contentType)) { hasError = true; } @@ -618,7 +616,7 @@ private bool TryValidateActions(MapTracker? actions, MapTracker action, MapTracker? schemaDefinitions, ValueTracker? id, out ValueTracker? contentType, ref ValueTracker? modelIdTopic) + private bool TryValidateAction(string name, ValueTracker action, MapTracker? schemaDefinitions, out ValueTracker? contentType) { if (action.Value.Forms == null) { @@ -626,7 +624,7 @@ private bool TryValidateAction(string name, ValueTracker action, MapTr contentType = null; return false; } - else if (!TryValidateForms(action.Value.Forms, FormsKind.Action, schemaDefinitions, id, out contentType, ref modelIdTopic)) + else if (!TryValidateForms(action.Value.Forms, FormsKind.Action, schemaDefinitions, out contentType)) { return false; } @@ -677,7 +675,7 @@ private bool TryValidateActionDataSchema(ValueTracker dataSchema, string p return TryValidateDataSchema(dataSchema, null, DataSchemaKind.Action, contentType); } - private bool TryValidateProperties(MapTracker? properties, MapTracker? schemaDefinitions, ValueTracker? id, HashSet serializationFormats, ref ValueTracker? modelIdTopic) + private bool TryValidateProperties(MapTracker? properties, MapTracker? schemaDefinitions, HashSet serializationFormats) { if (properties?.Entries == null) { @@ -688,7 +686,7 @@ private bool TryValidateProperties(MapTracker? properties, MapTracke foreach (KeyValuePair> property in properties.Entries) { - if (!TryValidateProperty(property.Key, property.Value, schemaDefinitions, id, out ValueTracker? contentType, ref modelIdTopic)) + if (!TryValidateProperty(property.Key, property.Value, schemaDefinitions, out ValueTracker? contentType)) { hasError = true; } @@ -701,7 +699,7 @@ private bool TryValidateProperties(MapTracker? properties, MapTracke return !hasError; } - private bool TryValidateProperty(string name, ValueTracker property, MapTracker? schemaDefinitions, ValueTracker? id, out ValueTracker? contentType, ref ValueTracker? modelIdTopic) + private bool TryValidateProperty(string name, ValueTracker property, MapTracker? schemaDefinitions, out ValueTracker? contentType) { if (property.Value.Forms == null) { @@ -709,7 +707,7 @@ private bool TryValidateProperty(string name, ValueTracker property, contentType = null; return false; } - else if (!TryValidatePropertyForms(name, property.Value.Forms, schemaDefinitions, id, property.Value.ReadOnly, out contentType, ref modelIdTopic)) + else if (!TryValidatePropertyForms(name, property.Value.Forms, schemaDefinitions, property.Value.ReadOnly, out contentType)) { return false; } @@ -722,11 +720,11 @@ private bool TryValidateProperty(string name, ValueTracker property, return true; } - private bool TryValidatePropertyForms(string name, ArrayTracker forms, MapTracker? schemaDefinitions, ValueTracker? id, ValueTracker? readOnly, out ValueTracker? contentType, ref ValueTracker? modelIdTopic) + private bool TryValidatePropertyForms(string name, ArrayTracker forms, MapTracker? schemaDefinitions, ValueTracker? readOnly, out ValueTracker? contentType) { bool isReadOnly = readOnly?.Value.Value == true; - if (!TryValidateForms(forms, FormsKind.Property, schemaDefinitions, id, out contentType, ref modelIdTopic, isReadOnly)) + if (!TryValidateForms(forms, FormsKind.Property, schemaDefinitions, out contentType, isReadOnly)) { return false; } @@ -776,7 +774,7 @@ private bool TryValidatePropertyForms(string name, ArrayTracker forms, M return !hasError; } - private bool TryValidateEvents(MapTracker? evts, MapTracker? schemaDefinitions, ValueTracker? id, HashSet serializationFormats, ref ValueTracker? modelIdTopic) + private bool TryValidateEvents(MapTracker? evts, MapTracker? schemaDefinitions, HashSet serializationFormats) { if (evts?.Entries == null) { @@ -787,7 +785,7 @@ private bool TryValidateEvents(MapTracker? evts, MapTracker> evt in evts.Entries) { - if (!TryValidateEvent(evt.Key, evt.Value, schemaDefinitions, id, out ValueTracker? contentType, ref modelIdTopic)) + if (!TryValidateEvent(evt.Key, evt.Value, schemaDefinitions, out ValueTracker? contentType)) { hasError = true; } @@ -800,7 +798,7 @@ private bool TryValidateEvents(MapTracker? evts, MapTracker evt, MapTracker? schemaDefinitions, ValueTracker? id, out ValueTracker? contentType, ref ValueTracker? modelIdTopic) + private bool TryValidateEvent(string name, ValueTracker evt, MapTracker? schemaDefinitions, out ValueTracker? contentType) { if (evt.Value.Forms == null) { @@ -808,7 +806,7 @@ private bool TryValidateEvent(string name, ValueTracker evt, MapTracker contentType = null; return false; } - else if (!TryValidateForms(evt.Value.Forms, FormsKind.Event, schemaDefinitions, id, out contentType, ref modelIdTopic)) + else if (!TryValidateForms(evt.Value.Forms, FormsKind.Event, schemaDefinitions, out contentType)) { return false; } @@ -839,7 +837,7 @@ private bool TryValidateEvent(string name, ValueTracker evt, MapTracker return !hasError; } - private bool TryValidateForms(ArrayTracker forms, FormsKind formsKind, MapTracker? schemaDefinitions, ValueTracker? id, out ValueTracker? contentType, ref ValueTracker? modelIdTopic, bool isReadOnly = false) + private bool TryValidateForms(ArrayTracker forms, FormsKind formsKind, MapTracker? schemaDefinitions, out ValueTracker? contentType, bool isReadOnly = false) { contentType = null; @@ -853,7 +851,7 @@ private bool TryValidateForms(ArrayTracker forms, FormsKind formsKind, M foreach (ValueTracker form in forms.Elements) { - if (!TryValidateForm(form, formsKind, schemaDefinitions, id, out ValueTracker? formContentType, ref modelIdTopic, isReadOnly)) + if (!TryValidateForm(form, formsKind, schemaDefinitions, out ValueTracker? formContentType, isReadOnly)) { hasError = true; } @@ -897,7 +895,7 @@ private bool TryValidateForms(ArrayTracker forms, FormsKind formsKind, M return !hasError; } - private bool TryValidateForm(ValueTracker form, FormsKind formsKind, MapTracker? schemaDefinitions, ValueTracker? id, out ValueTracker? contentType, ref ValueTracker? modelIdTopic, bool isReadOnly) + private bool TryValidateForm(ValueTracker form, FormsKind formsKind, MapTracker? schemaDefinitions, out ValueTracker? contentType, bool isReadOnly) { bool hasError = false; @@ -1057,7 +1055,7 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map } else { - if (!TryValidateTopic(form.Value.Topic, formsKind, id, hasOpRead, hasOpWrite, hasOpSub, ref modelIdTopic, isReadOnly)) + if (!TryValidateTopic(form.Value.Topic, formsKind, hasOpRead, hasOpWrite, hasOpSub, isReadOnly)) { hasError = true; } @@ -1149,7 +1147,7 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map return !hasError; } - private bool TryValidateTopic(ValueTracker topic, FormsKind formsKind, ValueTracker? id, bool hasOpRead, bool hasOpWrite, bool hasOpSub, ref ValueTracker? modelIdTopic, bool isReadOnly) + private bool TryValidateTopic(ValueTracker topic, FormsKind formsKind, bool hasOpRead, bool hasOpWrite, bool hasOpSub, bool isReadOnly) { FormsKind effectiveFormsKind = formsKind switch { @@ -1207,43 +1205,33 @@ private bool TryValidateTopic(ValueTracker topic, FormsKind formsK } else { - if (token == MqttTopicTokens.ModelId) - { - if (modelIdTopic == null) - { - modelIdTopic = topic; - } - } - else + switch (effectiveFormsKind) { - switch (effectiveFormsKind) - { - case FormsKind.Action: - if (token != MqttTopicTokens.ActionInvokerId && token != MqttTopicTokens.ActionExecutorId) - { - errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Form '{TDForm.TopicName}' property has value containing token '{{{token}}}' that is not valid in an action topic; only '{{{MqttTopicTokens.ModelId}}}', '{{{MqttTopicTokens.ActionInvokerId}}}', and '{{{MqttTopicTokens.ActionExecutorId}}}' are allowed unless token starts with '{MqttTopicTokens.PrefixCustom}'.", topic.TokenIndex); - hasError = true; - } - break; - case FormsKind.Property: - if (token == MqttTopicTokens.PropertyAction) - { - actionTokenPresent = true; - } - else if (token != MqttTopicTokens.PropertyConsumerId && token != MqttTopicTokens.PropertyMaintainerId) - { - errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Form '{TDForm.TopicName}' property has value containing token '{{{token}}}' that is not valid in a property topic; only '{{{MqttTopicTokens.ModelId}}}', '{{{MqttTopicTokens.PropertyAction}}}', '{{{MqttTopicTokens.PropertyConsumerId}}}', and '{{{MqttTopicTokens.PropertyMaintainerId}}}' are allowed unless token starts with '{MqttTopicTokens.PrefixCustom}'.", topic.TokenIndex); - hasError = true; - } - break; - case FormsKind.Event: - if (token != MqttTopicTokens.EventSenderId) - { - errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Form '{TDForm.TopicName}' property has value containing token '{{{token}}}' that is not valid in an event topic; only '{{{MqttTopicTokens.ModelId}}}' and '{{{MqttTopicTokens.EventSenderId}}}' are allowed unless token starts with '{MqttTopicTokens.PrefixCustom}'.", topic.TokenIndex); - hasError = true; - } - break; - } + case FormsKind.Action: + if (token != MqttTopicTokens.ActionInvokerId && token != MqttTopicTokens.ActionExecutorId) + { + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Form '{TDForm.TopicName}' property has value containing token '{{{token}}}' that is not valid in an action topic; only '{{{MqttTopicTokens.ActionInvokerId}}}' and '{{{MqttTopicTokens.ActionExecutorId}}}' are allowed unless token starts with '{MqttTopicTokens.PrefixCustom}'.", topic.TokenIndex); + hasError = true; + } + break; + case FormsKind.Property: + if (token == MqttTopicTokens.PropertyAction) + { + actionTokenPresent = true; + } + else if (token != MqttTopicTokens.PropertyConsumerId && token != MqttTopicTokens.PropertyMaintainerId) + { + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Form '{TDForm.TopicName}' property has value containing token '{{{token}}}' that is not valid in a property topic; only '{{{MqttTopicTokens.PropertyAction}}}', '{{{MqttTopicTokens.PropertyConsumerId}}}', and '{{{MqttTopicTokens.PropertyMaintainerId}}}' are allowed unless token starts with '{MqttTopicTokens.PrefixCustom}'.", topic.TokenIndex); + hasError = true; + } + break; + case FormsKind.Event: + if (token != MqttTopicTokens.EventSenderId) + { + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Form '{TDForm.TopicName}' property has value containing token '{{{token}}}' that is not valid in an event topic; only '{{{MqttTopicTokens.EventSenderId}}}' is allowed unless token starts with '{MqttTopicTokens.PrefixCustom}'.", topic.TokenIndex); + hasError = true; + } + break; } } } @@ -1257,13 +1245,12 @@ private bool TryValidateTopic(ValueTracker topic, FormsKind formsK } } - string partiallyResolvedTopic = id != null ? topic.Value.Value.Replace($"{{{MqttTopicTokens.ModelId}}}", id.Value.Value) : topic.Value.Value; if (effectiveFormsKind == FormsKind.Property) { if (actionTokenPresent) { - string readResolvedTopic = partiallyResolvedTopic.Replace($"{{{MqttTopicTokens.PropertyAction}}}", MqttTopicTokens.PropertyActionValues.Read); - string writeResolvedTopic = partiallyResolvedTopic.Replace($"{{{MqttTopicTokens.PropertyAction}}}", MqttTopicTokens.PropertyActionValues.Write); + string readResolvedTopic = topic.Value.Value.Replace($"{{{MqttTopicTokens.PropertyAction}}}", MqttTopicTokens.PropertyActionValues.Read); + string writeResolvedTopic = topic.Value.Value.Replace($"{{{MqttTopicTokens.PropertyAction}}}", MqttTopicTokens.PropertyActionValues.Write); if (hasOpRead) { @@ -1293,13 +1280,13 @@ private bool TryValidateTopic(ValueTracker topic, FormsKind formsK } else { - errorReporter.RegisterTopicInThing(partiallyResolvedTopic, topic.TokenIndex, topic.Value.Value); + errorReporter.RegisterTopicInThing(topic.Value.Value, topic.TokenIndex, topic.Value.Value); } } } else { - errorReporter.RegisterTopicInThing(partiallyResolvedTopic, topic.TokenIndex, topic.Value.Value); + errorReporter.RegisterTopicInThing(topic.Value.Value, topic.TokenIndex, topic.Value.Value); } return !hasError; diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs index e385571152..6776726f2c 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/ActionEnvoyGenerator.cs @@ -59,7 +59,6 @@ internal static List GenerateActionEnvoys(ErrorReporter errorReporte foreach (IEnvoyTemplateTransform transform in envoyFactory.GetActionTransforms( schemaNamer, - tdThing.Id!.Value!.Value, serviceName, actionKvp.Key, inputSchemaType, diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyTransformFactory.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyTransformFactory.cs index a5b7f0a818..37416c4963 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyTransformFactory.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EnvoyTransformFactory.cs @@ -54,7 +54,6 @@ internal IEnumerable GetConstantTransforms(CodeName sch internal IEnumerable GetActionTransforms( SchemaNamer schemaNamer, - string modelId, CodeName serviceName, string actionName, string? inputSchemaType, @@ -102,7 +101,6 @@ internal IEnumerable GetActionTransforms( schemaNamer.GetActionExecutorBinder(actionName), projectName, genNamespace, - modelId, serviceName, serializerClassName, serializerEmptyType, @@ -120,7 +118,6 @@ internal IEnumerable GetActionTransforms( schemaNamer.GetActionInvokerBinder(actionName), projectName, genNamespace, - modelId, serviceName, serializerClassName, serializerEmptyType, @@ -152,7 +149,6 @@ internal IEnumerable GetActionTransforms( actionName, schemaNamer.GetActionExecutorBinder(actionName), genNamespace, - modelId, serializerEmptyType, inputSchema, outputSchema, @@ -177,7 +173,6 @@ internal IEnumerable GetActionTransforms( actionName, schemaNamer.GetActionInvokerBinder(actionName), genNamespace, - modelId, serializerEmptyType, inputSchema, outputSchema, @@ -203,7 +198,6 @@ internal IEnumerable GetActionTransforms( internal IEnumerable GetPropertyTransforms( SchemaNamer schemaNamer, - string modelId, CodeName serviceName, string propertyName, string propSchema, @@ -242,7 +236,6 @@ internal IEnumerable GetPropertyTransforms( schemaNamer.GetPropWriteActName(propertyName), projectName, genNamespace, - modelId, serviceName, readSerializerClassName, readSerializerEmptyType, @@ -266,7 +259,6 @@ internal IEnumerable GetPropertyTransforms( schemaNamer.GetPropWriteActName(propertyName), projectName, genNamespace, - modelId, serviceName, readSerializerClassName, readSerializerEmptyType, @@ -290,7 +282,6 @@ internal IEnumerable GetPropertyTransforms( schemaNamer.GetPropReadActName(propertyName), schemaNamer.GetPropWriteActName(propertyName), genNamespace, - modelId, readSerializerEmptyType, writeSerializerEmptyType, readRespSchema, @@ -316,7 +307,6 @@ internal IEnumerable GetPropertyTransforms( schemaNamer.GetPropReadActName(propertyName), schemaNamer.GetPropWriteActName(propertyName), genNamespace, - modelId, readSerializerEmptyType, writeSerializerEmptyType, readRespSchema, @@ -343,7 +333,6 @@ internal IEnumerable GetPropertyTransforms( internal IEnumerable GetEventTransforms( SchemaNamer schemaNamer, - string modelId, CodeName serviceName, string eventName, string schemaType, @@ -359,24 +348,24 @@ internal IEnumerable GetEventTransforms( case TargetLanguage.CSharp: if (generateServer) { - yield return new DotNetTelemetrySender(eventName, schemaNamer.GetEventSenderBinder(schemaType), projectName, genNamespace, modelId, serviceName, serializerClassName, serializerEmptyType, EnvoyGeneratorSupport.GetTypeName(schemaType, format), topicPattern); + yield return new DotNetTelemetrySender(eventName, schemaNamer.GetEventSenderBinder(schemaType), projectName, genNamespace, serviceName, serializerClassName, serializerEmptyType, EnvoyGeneratorSupport.GetTypeName(schemaType, format), topicPattern); } if (generateClient) { - yield return new DotNetTelemetryReceiver(eventName, schemaNamer.GetEventReceiverBinder(schemaType), projectName, genNamespace, modelId, serviceName, serializerClassName, serializerEmptyType, EnvoyGeneratorSupport.GetTypeName(schemaType, format), serviceGroupId, topicPattern); + yield return new DotNetTelemetryReceiver(eventName, schemaNamer.GetEventReceiverBinder(schemaType), projectName, genNamespace, serviceName, serializerClassName, serializerEmptyType, EnvoyGeneratorSupport.GetTypeName(schemaType, format), serviceGroupId, topicPattern); } break; case TargetLanguage.Rust: if (generateServer) { - yield return new RustTelemetrySender(eventName, schemaNamer.GetEventSenderBinder(schemaType), genNamespace, modelId, EnvoyGeneratorSupport.GetTypeName(schemaType, format), topicPattern, schemaType, srcSubdir); + yield return new RustTelemetrySender(eventName, schemaNamer.GetEventSenderBinder(schemaType), genNamespace, EnvoyGeneratorSupport.GetTypeName(schemaType, format), topicPattern, schemaType, srcSubdir); } if (generateClient) { - yield return new RustTelemetryReceiver(eventName, schemaNamer.GetEventReceiverBinder(schemaType), genNamespace, modelId, EnvoyGeneratorSupport.GetTypeName(schemaType, format), serviceGroupId, topicPattern, schemaType, srcSubdir); + yield return new RustTelemetryReceiver(eventName, schemaNamer.GetEventReceiverBinder(schemaType), genNamespace, EnvoyGeneratorSupport.GetTypeName(schemaType, format), serviceGroupId, topicPattern, schemaType, srcSubdir); } break; diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EventEnvoyGenerator.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EventEnvoyGenerator.cs index 2a2be3b83f..6740159eef 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EventEnvoyGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/EventEnvoyGenerator.cs @@ -23,7 +23,7 @@ internal static List GenerateEventEnvoys(ErrorReporter errorReporter, string schemaType = schemaNamer.GetEventSchema(eventKvp.Key); formattedTypesToSerialize[subEventForm.Format].Add(schemaType); eventSpecs.Add(new EventSpec(schemaNamer, eventKvp.Key, schemaType, subEventForm.Format)); - foreach (IEnvoyTemplateTransform transform in envoyFactory.GetEventTransforms(schemaNamer, tdThing.Id!.Value!.Value, serviceName, eventKvp.Key, schemaType, subEventForm.Format, subEventForm.ServiceGroupId, subEventForm.TopicPattern)) + foreach (IEnvoyTemplateTransform transform in envoyFactory.GetEventTransforms(schemaNamer, serviceName, eventKvp.Key, schemaType, subEventForm.Format, subEventForm.ServiceGroupId, subEventForm.TopicPattern)) { transforms[transform.FileName] = transform; } @@ -35,7 +35,7 @@ internal static List GenerateEventEnvoys(ErrorReporter errorReporter, { formattedTypesToSerialize[subAllEventsForm.Format].Add(schemaNamer.AggregateEventSchema); eventSpecs.Add(new EventSpec(schemaNamer, schemaNamer.AggregateEventName, schemaNamer.AggregateEventSchema, subAllEventsForm.Format)); - foreach (IEnvoyTemplateTransform transform in envoyFactory.GetEventTransforms(schemaNamer, tdThing.Id!.Value!.Value, serviceName, schemaNamer.AggregateEventName, schemaNamer.AggregateEventSchema, subAllEventsForm.Format, subAllEventsForm.ServiceGroupId, subAllEventsForm.TopicPattern)) + foreach (IEnvoyTemplateTransform transform in envoyFactory.GetEventTransforms(schemaNamer, serviceName, schemaNamer.AggregateEventName, schemaNamer.AggregateEventSchema, subAllEventsForm.Format, subAllEventsForm.ServiceGroupId, subAllEventsForm.TopicPattern)) { transforms[transform.FileName] = transform; } diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/PropertyEnvoyGenerator.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/PropertyEnvoyGenerator.cs index 9968e54dcc..3784a7fecf 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/PropertyEnvoyGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/PropertyEnvoyGenerator.cs @@ -92,7 +92,6 @@ internal static List GeneratePropertyEnvoys(ErrorReporter errorRep foreach (IEnvoyTemplateTransform transform in envoyFactory.GetPropertyTransforms( schemaNamer, - tdThing.Id!.Value!.Value, serviceName, propKvp.Key, propSchema, @@ -186,7 +185,6 @@ internal static List GeneratePropertyEnvoys(ErrorReporter errorRep foreach (IEnvoyTemplateTransform transform in envoyFactory.GetPropertyTransforms( schemaNamer, - tdThing.Id!.Value!.Value, serviceName, schemaNamer.AggregatePropName, schemaNamer.AggregatePropSchema, diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/code/DotNetCommandExecutor.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/code/DotNetCommandExecutor.cs index 435881d83e..ad28a906e8 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/code/DotNetCommandExecutor.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/code/DotNetCommandExecutor.cs @@ -8,7 +8,6 @@ public partial class DotNetCommandExecutor : IEnvoyTemplateTransform private readonly CodeName componentName; private readonly string projectName; private readonly CodeName genNamespace; - private readonly string modelId; private readonly CodeName serviceName; private readonly string serializerClassName; private readonly EmptyTypeName serializerEmptyType; @@ -23,7 +22,6 @@ public DotNetCommandExecutor( string componentName, string projectName, CodeName genNamespace, - string modelId, CodeName serviceName, string serializerClassName, EmptyTypeName serializerEmptyType, @@ -37,7 +35,6 @@ public DotNetCommandExecutor( this.componentName = new CodeName(componentName); this.projectName = projectName; this.genNamespace = genNamespace; - this.modelId = modelId; this.serviceName = serviceName; this.serializerClassName = serializerClassName; this.serializerEmptyType = serializerEmptyType; diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/code/DotNetCommandInvoker.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/code/DotNetCommandInvoker.cs index 2bf5d4a7fb..8cf8051ba5 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/code/DotNetCommandInvoker.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/code/DotNetCommandInvoker.cs @@ -8,7 +8,6 @@ public partial class DotNetCommandInvoker : IEnvoyTemplateTransform private readonly CodeName componentName; private readonly string projectName; private readonly CodeName genNamespace; - private readonly string modelId; private readonly CodeName serviceName; private readonly string serializerClassName; private readonly EmptyTypeName serializerEmptyType; @@ -21,7 +20,6 @@ public DotNetCommandInvoker( string componentName, string projectName, CodeName genNamespace, - string modelId, CodeName serviceName, string serializerClassName, EmptyTypeName serializerEmptyType, @@ -33,7 +31,6 @@ public DotNetCommandInvoker( this.componentName = new CodeName(componentName); this.projectName = projectName; this.genNamespace = genNamespace; - this.modelId = modelId; this.serviceName = serviceName; this.serializerClassName = serializerClassName; this.serializerEmptyType = serializerEmptyType; diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandExecutor.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandExecutor.tt index 0b291fe392..033dc7c3f0 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandExecutor.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandExecutor.tt @@ -35,7 +35,6 @@ namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage. public <#=this.componentName.GetTypeName(TargetLanguage.CSharp)#>(ApplicationContext applicationContext, IMqttPubSubClient mqttClient) : base(applicationContext, mqttClient, "<#=this.commandName.AsGiven#>", new <#=string.Format(this.serializerClassName, this.TypeParams())#>()) { - TopicTokenMap["<#=MqttTopicTokens.ModelId#>"] = "<#=this.modelId#>"; if (mqttClient.ClientId != null) { TopicTokenMap["<#=MqttTopicTokens.ActionExecutorId#>"] = mqttClient.ClientId; diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandInvoker.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandInvoker.tt index e9fbfebbfe..738f45be4b 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandInvoker.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandInvoker.tt @@ -29,7 +29,6 @@ namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage. { this.ResponseTopicPrefix = "clients/{invokerClientId}"; // default value, can be overwritten by user code - TopicTokenMap["<#=MqttTopicTokens.ModelId#>"] = "<#=this.modelId#>"; if (mqttClient.ClientId != null) { TopicTokenMap["<#=MqttTopicTokens.ActionInvokerId#>"] = mqttClient.ClientId; diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/code/DotNetTelemetryReceiver.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/code/DotNetTelemetryReceiver.cs index 9aa64f53a4..cae0f8c2cd 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/code/DotNetTelemetryReceiver.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/code/DotNetTelemetryReceiver.cs @@ -8,7 +8,6 @@ public partial class DotNetTelemetryReceiver : IEnvoyTemplateTransform private readonly CodeName componentName; private readonly string projectName; private readonly CodeName genNamespace; - private readonly string modelId; private readonly CodeName serviceName; private readonly string serializerClassName; private readonly ITypeName schemaType; @@ -20,7 +19,6 @@ public DotNetTelemetryReceiver( string componentName, string projectName, CodeName genNamespace, - string modelId, CodeName serviceName, string serializerClassName, EmptyTypeName serializerEmptyType, @@ -32,7 +30,6 @@ public DotNetTelemetryReceiver( this.componentName = new CodeName(componentName); this.projectName = projectName; this.genNamespace = genNamespace; - this.modelId = modelId; this.serviceName = serviceName; this.serializerClassName = string.Format(serializerClassName, $"<{schemaType.GetTypeName(TargetLanguage.CSharp)}, {serializerEmptyType.GetTypeName(TargetLanguage.CSharp)}>"); this.schemaType = schemaType; diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/code/DotNetTelemetrySender.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/code/DotNetTelemetrySender.cs index d3e50e2df7..cede99bb2d 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/code/DotNetTelemetrySender.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/code/DotNetTelemetrySender.cs @@ -8,7 +8,6 @@ public partial class DotNetTelemetrySender : IEnvoyTemplateTransform private readonly CodeName componentName; private readonly string projectName; private readonly CodeName genNamespace; - private readonly string modelId; private readonly CodeName serviceName; private readonly string serializerClassName; private readonly ITypeName schemaType; @@ -19,7 +18,6 @@ public DotNetTelemetrySender( string componentName, string projectName, CodeName genNamespace, - string modelId, CodeName serviceName, string serializerClassName, EmptyTypeName serializerEmptyType, @@ -30,7 +28,6 @@ public DotNetTelemetrySender( this.componentName = new CodeName(componentName); this.projectName = projectName; this.genNamespace = genNamespace; - this.modelId = modelId; this.serviceName = serviceName; this.serializerClassName = string.Format(serializerClassName, $"<{schemaType.GetTypeName(TargetLanguage.CSharp)}, {serializerEmptyType.GetTypeName(TargetLanguage.CSharp)}>"); this.schemaType = schemaType; diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetryReceiver.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetryReceiver.tt index 4358d30e9c..863936278a 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetryReceiver.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetryReceiver.tt @@ -30,7 +30,6 @@ namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage. public <#=this.componentName.GetTypeName(TargetLanguage.CSharp)#>(ApplicationContext applicationContext, IMqttPubSubClient mqttClient) : base(applicationContext, mqttClient, new <#=this.serializerClassName#>()) { - TopicTokenMap["<#=MqttTopicTokens.ModelId#>"] = "<#=this.modelId#>"; } } } diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetrySender.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetrySender.tt index e810f81d02..1d72c32edc 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetrySender.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetrySender.tt @@ -26,7 +26,6 @@ namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage. public <#=this.componentName.GetTypeName(TargetLanguage.CSharp)#>(ApplicationContext applicationContext, IMqttPubSubClient mqttClient) : base(applicationContext, mqttClient, new <#=this.serializerClassName#>()) { - TopicTokenMap["<#=MqttTopicTokens.ModelId#>"] = "<#=this.modelId#>"; if (mqttClient.ClientId != null) { TopicTokenMap["<#=MqttTopicTokens.EventSenderId#>"] = mqttClient.ClientId; diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/code/DotNetPropertyConsumer.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/code/DotNetPropertyConsumer.cs index 55a080ad0c..5f63d6591f 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/code/DotNetPropertyConsumer.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/code/DotNetPropertyConsumer.cs @@ -12,7 +12,6 @@ public partial class DotNetPropertyConsumer : IEnvoyTemplateTransform private readonly string writeCommandName; private readonly string projectName; private readonly CodeName genNamespace; - private readonly string modelId; private readonly CodeName serviceName; private readonly string readSerializerClassName; private readonly EmptyTypeName readSerializerEmptyType; @@ -33,7 +32,6 @@ public DotNetPropertyConsumer( string writeCommandName, string projectName, CodeName genNamespace, - string modelId, CodeName serviceName, string readSerializerClassName, EmptyTypeName readSerializerEmptyType, @@ -53,7 +51,6 @@ public DotNetPropertyConsumer( this.writeCommandName = writeCommandName; this.projectName = projectName; this.genNamespace = genNamespace; - this.modelId = modelId; this.serviceName = serviceName; this.readSerializerClassName = readSerializerClassName; this.readSerializerEmptyType = readSerializerEmptyType; diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/code/DotNetPropertyMaintainer.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/code/DotNetPropertyMaintainer.cs index 0326891538..d27d482650 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/code/DotNetPropertyMaintainer.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/code/DotNetPropertyMaintainer.cs @@ -12,7 +12,6 @@ public partial class DotNetPropertyMaintainer : IEnvoyTemplateTransform private readonly string writeCommandName; private readonly string projectName; private readonly CodeName genNamespace; - private readonly string modelId; private readonly CodeName serviceName; private readonly string readSerializerClassName; private readonly EmptyTypeName readSerializerEmptyType; @@ -33,7 +32,6 @@ public DotNetPropertyMaintainer( string writeCommandName, string projectName, CodeName genNamespace, - string modelId, CodeName serviceName, string readSerializerClassName, EmptyTypeName readSerializerEmptyType, @@ -53,7 +51,6 @@ public DotNetPropertyMaintainer( this.writeCommandName = writeCommandName; this.projectName = projectName; this.genNamespace = genNamespace; - this.modelId = modelId; this.serviceName = serviceName; this.readSerializerClassName = readSerializerClassName; this.readSerializerEmptyType = readSerializerEmptyType; diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyConsumer.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyConsumer.tt index f10c07af04..3b5c05140b 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyConsumer.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyConsumer.tt @@ -46,7 +46,6 @@ namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage. RequestTopicPattern = AttributeRetriever.GetAttribute(this)?.Topic ?? string.Empty; TopicTokenMap["<#=MqttTopicTokens.PropertyAction#>"] = "<#=MqttTopicTokens.PropertyActionValues.Read#>"; - TopicTokenMap["<#=MqttTopicTokens.ModelId#>"] = "<#=this.modelId#>"; if (mqttClient.ClientId != null) { TopicTokenMap["<#=MqttTopicTokens.PropertyConsumerId#>"] = mqttClient.ClientId; @@ -77,7 +76,6 @@ namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage. RequestTopicPattern = AttributeRetriever.GetAttribute(this)?.Topic ?? string.Empty; TopicTokenMap["<#=MqttTopicTokens.PropertyAction#>"] = "<#=MqttTopicTokens.PropertyActionValues.Write#>"; - TopicTokenMap["<#=MqttTopicTokens.ModelId#>"] = "<#=this.modelId#>"; if (mqttClient.ClientId != null) { TopicTokenMap["<#=MqttTopicTokens.PropertyConsumerId#>"] = mqttClient.ClientId; diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyMaintainer.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyMaintainer.tt index 0a21209941..28fa384663 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyMaintainer.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyMaintainer.tt @@ -48,7 +48,6 @@ namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage. RequestTopicPattern = AttributeRetriever.GetAttribute(this)?.Topic ?? string.Empty; TopicTokenMap["<#=MqttTopicTokens.PropertyAction#>"] = "<#=MqttTopicTokens.PropertyActionValues.Read#>"; - TopicTokenMap["<#=MqttTopicTokens.ModelId#>"] = "<#=this.modelId#>"; if (mqttClient.ClientId != null) { TopicTokenMap["<#=MqttTopicTokens.PropertyMaintainerId#>"] = mqttClient.ClientId; @@ -80,7 +79,6 @@ namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage. RequestTopicPattern = AttributeRetriever.GetAttribute(this)?.Topic ?? string.Empty; TopicTokenMap["<#=MqttTopicTokens.PropertyAction#>"] = "<#=MqttTopicTokens.PropertyActionValues.Write#>"; - TopicTokenMap["<#=MqttTopicTokens.ModelId#>"] = "<#=this.modelId#>"; if (mqttClient.ClientId != null) { TopicTokenMap["<#=MqttTopicTokens.PropertyMaintainerId#>"] = mqttClient.ClientId; diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Service/t4/DotNetService.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Service/t4/DotNetService.tt index 0d55d1ff6b..2c8bd79ab8 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Service/t4/DotNetService.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Service/t4/DotNetService.tt @@ -48,7 +48,7 @@ namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage. /// The MQTT client to use. /// /// The topic token replacement map to use for all operations by default. Generally, this will include the token values - /// for topic tokens such as "<#=MqttTopicTokens.ModelId#>" which should be the same for the duration of this service's lifetime. Note that + /// for topic tokens that should be the same for the duration of this service's lifetime. Note that /// additional topic tokens can be specified per event message. /// public Service(ApplicationContext applicationContext, IMqttPubSubClient mqttClient, Dictionary? topicTokenMap = null) @@ -364,7 +364,7 @@ namespace <#=this.projectName#>.<#=this.genNamespace.GetTypeName(TargetLanguage. /// The MQTT client to use. /// /// The topic token replacement map to use for all operations by default. Generally, this will include the token values - /// for topic tokens such as "<#=MqttTopicTokens.ModelId#>" which should be the same for the duration of this client's lifetime. + /// for topic tokens that should be the same for the duration of this client's lifetime. /// public Client(ApplicationContext applicationContext, IMqttPubSubClient mqttClient, Dictionary? topicTokenMap = null) { diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandExecutor.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandExecutor.cs index 45aecc2e10..5695e0dba1 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandExecutor.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandExecutor.cs @@ -9,7 +9,6 @@ public partial class RustCommandExecutor : IEnvoyTemplateTransform private readonly CodeName commandName; private readonly CodeName componentName; private readonly CodeName genNamespace; - private readonly string modelId; private readonly EmptyTypeName serializerEmptyType; private readonly ITypeName? reqSchema; private readonly ITypeName? respSchema; @@ -27,7 +26,6 @@ public RustCommandExecutor( string commandName, string componentName, CodeName genNamespace, - string modelId, EmptyTypeName serializerEmptyType, ITypeName? reqSchema, ITypeName? respSchema, @@ -44,7 +42,6 @@ public RustCommandExecutor( this.commandName = new CodeName(commandName); this.componentName = new CodeName(componentName); this.genNamespace = genNamespace; - this.modelId = modelId; this.serializerEmptyType = serializerEmptyType; this.reqSchema = reqSchema; this.respSchema = respSchema; diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandInvoker.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandInvoker.cs index 7b7e1070e1..b98a9f9a48 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandInvoker.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/code/RustCommandInvoker.cs @@ -9,7 +9,6 @@ public partial class RustCommandInvoker : IEnvoyTemplateTransform private readonly CodeName commandName; private readonly CodeName componentName; private readonly CodeName genNamespace; - private readonly string modelId; private readonly EmptyTypeName serializerEmptyType; private readonly ITypeName? reqSchema; private readonly ITypeName? respSchema; @@ -26,7 +25,6 @@ public RustCommandInvoker( string commandName, string componentName, CodeName genNamespace, - string modelId, EmptyTypeName serializerEmptyType, ITypeName? reqSchema, ITypeName? respSchema, @@ -42,7 +40,6 @@ public RustCommandInvoker( this.commandName = new CodeName(commandName); this.componentName = new CodeName(componentName); this.genNamespace = genNamespace; - this.modelId = modelId; this.serializerEmptyType = serializerEmptyType; this.reqSchema = reqSchema; this.respSchema = respSchema; diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutor.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutor.tt index 09a6272074..3b104a413a 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutor.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutor.tt @@ -127,7 +127,6 @@ where .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("<#=MqttTopicTokens.ModelId#>".to_string(), "<#=this.modelId#>".to_string()); topic_token_map.insert("<#=MqttTopicTokens.ActionExecutorId#>".to_string(), client.client_id().to_string()); let executor_options = executor_options_builder diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.tt index 149bdb930e..7401727179 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.tt @@ -158,7 +158,6 @@ where .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("<#=MqttTopicTokens.ModelId#>".to_string(), "<#=this.modelId#>".to_string()); topic_token_map.insert("<#=MqttTopicTokens.ActionInvokerId#>".to_string(), client.client_id().to_string()); let invoker_options = invoker_options_builder diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/code/RustTelemetryReceiver.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/code/RustTelemetryReceiver.cs index 534cb99140..95c00370fe 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/code/RustTelemetryReceiver.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/code/RustTelemetryReceiver.cs @@ -8,19 +8,17 @@ public partial class RustTelemetryReceiver : IEnvoyTemplateTransform private readonly CodeName telemetryName; private readonly CodeName componentName; private readonly CodeName genNamespace; - private readonly string modelId; private readonly ITypeName schemaType; private readonly CodeName messageName; private readonly string? serviceGroupId; private readonly string topicPattern; private readonly string srcSubdir; - public RustTelemetryReceiver(string telemetryName, string componentName, CodeName genNamespace, string modelId, ITypeName schemaType, string? serviceGroupId, string topicPattern, string messageStub, string srcSubdir) + public RustTelemetryReceiver(string telemetryName, string componentName, CodeName genNamespace, ITypeName schemaType, string? serviceGroupId, string topicPattern, string messageStub, string srcSubdir) { this.telemetryName = new CodeName(telemetryName); this.componentName = new CodeName(componentName); this.genNamespace = genNamespace; - this.modelId = modelId; this.schemaType = schemaType; this.messageName = new CodeName(messageStub, "message"); this.serviceGroupId = serviceGroupId; diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/code/RustTelemetrySender.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/code/RustTelemetrySender.cs index efb61e217c..880267af07 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/code/RustTelemetrySender.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/code/RustTelemetrySender.cs @@ -8,18 +8,16 @@ public partial class RustTelemetrySender : IEnvoyTemplateTransform private readonly CodeName telemetryName; private readonly CodeName componentName; private readonly CodeName genNamespace; - private readonly string modelId; private readonly ITypeName schemaType; private readonly string topicPattern; private readonly CodeName messageName; private readonly string srcSubdir; - public RustTelemetrySender(string telemetryName, string componentName, CodeName genNamespace, string modelId, ITypeName schemaType, string topicPattern, string messageStub, string srcSubdir) + public RustTelemetrySender(string telemetryName, string componentName, CodeName genNamespace, ITypeName schemaType, string topicPattern, string messageStub, string srcSubdir) { this.telemetryName = new CodeName(telemetryName); this.componentName = new CodeName(componentName); this.genNamespace = genNamespace; - this.modelId = modelId; this.schemaType = schemaType; this.topicPattern = topicPattern; this.messageName = new CodeName(messageStub, "message"); diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.tt index 84743643cc..8ce04748e7 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.tt @@ -49,8 +49,6 @@ where .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("<#=MqttTopicTokens.ModelId#>".to_string(), "<#=this.modelId#>".to_string()); - let receiver_options = receiver_options_builder .topic_pattern("<#=this.topicPattern#>") .topic_token_map(topic_token_map) diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.tt index 2623a68b54..1b84d65f05 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.tt @@ -116,7 +116,6 @@ where .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("<#=MqttTopicTokens.ModelId#>".to_string(), "<#=this.modelId#>".to_string()); topic_token_map.insert("<#=MqttTopicTokens.EventSenderId#>".to_string(), client.client_id().to_string()); let sender_options = sender_options_builder diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/code/RustPropertyConsumer.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/code/RustPropertyConsumer.cs index faf8c79bfa..16d6bf816a 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/code/RustPropertyConsumer.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/code/RustPropertyConsumer.cs @@ -11,7 +11,6 @@ public partial class RustPropertyConsumer : IEnvoyTemplateTransform private readonly string readCommandName; private readonly string writeCommandName; private readonly CodeName genNamespace; - private readonly string modelId; private readonly EmptyTypeName readSerializerEmptyType; private readonly EmptyTypeName writeSerializerEmptyType; private readonly CodeName? readRespSchema; @@ -36,7 +35,6 @@ public RustPropertyConsumer( string readCommandName, string writeCommandName, CodeName genNamespace, - string modelId, EmptyTypeName readSerializerEmptyType, EmptyTypeName writeSerializerEmptyType, string? readRespSchema, @@ -60,7 +58,6 @@ public RustPropertyConsumer( this.readCommandName = readCommandName; this.writeCommandName = writeCommandName; this.genNamespace = genNamespace; - this.modelId = modelId; this.readSerializerEmptyType = readSerializerEmptyType; this.writeSerializerEmptyType = writeSerializerEmptyType; this.readRespSchema = readRespSchema != null ? new CodeName(readRespSchema) : null; diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/code/RustPropertyMaintainer.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/code/RustPropertyMaintainer.cs index 15c5ae3ac1..02f2762be6 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/code/RustPropertyMaintainer.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/code/RustPropertyMaintainer.cs @@ -11,7 +11,6 @@ public partial class RustPropertyMaintainer : IEnvoyTemplateTransform private readonly string readCommandName; private readonly string writeCommandName; private readonly CodeName genNamespace; - private readonly string modelId; private readonly EmptyTypeName readSerializerEmptyType; private readonly EmptyTypeName writeSerializerEmptyType; private readonly CodeName? readRespSchema; @@ -34,7 +33,6 @@ public RustPropertyMaintainer( string readCommandName, string writeCommandName, CodeName genNamespace, - string modelId, EmptyTypeName readSerializerEmptyType, EmptyTypeName writeSerializerEmptyType, string? readRespSchema, @@ -56,7 +54,6 @@ public RustPropertyMaintainer( this.readCommandName = readCommandName; this.writeCommandName = writeCommandName; this.genNamespace = genNamespace; - this.modelId = modelId; this.readSerializerEmptyType = readSerializerEmptyType; this.writeSerializerEmptyType = writeSerializerEmptyType; this.readRespSchema = readRespSchema != null ? new CodeName(readRespSchema) : null; diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyConsumer.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyConsumer.tt index fcd9c03f6e..eeef3fb4b0 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyConsumer.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyConsumer.tt @@ -240,7 +240,6 @@ where .collect(); topic_token_map.insert("<#=MqttTopicTokens.PropertyAction#>".to_string(), "<#=MqttTopicTokens.PropertyActionValues.Read#>".to_string()); - topic_token_map.insert("<#=MqttTopicTokens.ModelId#>".to_string(), "<#=this.modelId#>".to_string()); topic_token_map.insert("<#=MqttTopicTokens.PropertyConsumerId#>".to_string(), client.client_id().to_string()); let invoker_options = invoker_options_builder @@ -369,7 +368,6 @@ where .collect(); topic_token_map.insert("<#=MqttTopicTokens.PropertyAction#>".to_string(), "<#=MqttTopicTokens.PropertyActionValues.Write#>".to_string()); - topic_token_map.insert("<#=MqttTopicTokens.ModelId#>".to_string(), "<#=this.modelId#>".to_string()); topic_token_map.insert("<#=MqttTopicTokens.PropertyConsumerId#>".to_string(), client.client_id().to_string()); let invoker_options = invoker_options_builder diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyMaintainer.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyMaintainer.tt index 287c3f93a3..c5debd7ef4 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyMaintainer.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyMaintainer.tt @@ -167,7 +167,6 @@ where .collect(); topic_token_map.insert("<#=MqttTopicTokens.PropertyAction#>".to_string(), "<#=MqttTopicTokens.PropertyActionValues.Read#>".to_string()); - topic_token_map.insert("<#=MqttTopicTokens.ModelId#>".to_string(), "<#=this.modelId#>".to_string()); topic_token_map.insert("<#=MqttTopicTokens.PropertyMaintainerId#>".to_string(), client.client_id().to_string()); let executor_options = executor_options_builder @@ -238,7 +237,6 @@ where .collect(); topic_token_map.insert("<#=MqttTopicTokens.PropertyAction#>".to_string(), "<#=MqttTopicTokens.PropertyActionValues.Write#>".to_string()); - topic_token_map.insert("<#=MqttTopicTokens.ModelId#>".to_string(), "<#=this.modelId#>".to_string()); topic_token_map.insert("<#=MqttTopicTokens.PropertyMaintainerId#>".to_string(), client.client_id().to_string()); let executor_options = executor_options_builder diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDThing.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDThing.cs index bb4d72cfa7..a080b3cbe3 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDThing.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDThing.cs @@ -7,7 +7,7 @@ public class TDThing : IEquatable, IDeserializable { public const string ContextName = "@context"; - public const string IdName = "id"; + public const string TypeName = "@type"; public const string TitleName = "title"; public const string LinksName = "links"; public const string SchemaDefinitionsName = "schemaDefinitions"; @@ -18,7 +18,7 @@ public class TDThing : IEquatable, IDeserializable public ArrayTracker? Context { get; set; } - public ValueTracker? Id { get; set; } + public ValueTracker? Type { get; set; } public ValueTracker? Title { get; set; } @@ -45,7 +45,7 @@ public virtual bool Equals(TDThing? other) else { return Context == other.Context && - Id == other.Id && + Type == other.Type && Title == other.Title && Links == other.Links && SchemaDefinitions == other.SchemaDefinitions && @@ -58,7 +58,7 @@ public virtual bool Equals(TDThing? other) public override int GetHashCode() { - return (Context, Id, Title, Links, SchemaDefinitions, Forms, Actions, Properties, Events).GetHashCode(); + return (Context, Type, Title, Links, SchemaDefinitions, Forms, Actions, Properties, Events).GetHashCode(); } public static bool operator ==(TDThing? left, TDThing? right) @@ -107,9 +107,9 @@ public IEnumerable Traverse() yield return item; } } - if (Id != null) + if (Type != null) { - foreach (ITraversable item in Id.Traverse()) + foreach (ITraversable item in Type.Traverse()) { yield return item; } @@ -187,8 +187,8 @@ public static TDThing Deserialize(ref Utf8JsonReader reader) case ContextName: thing.Context = ArrayTracker.Deserialize(ref reader, ContextName); break; - case IdName: - thing.Id = ValueTracker.Deserialize(ref reader, IdName); + case TypeName: + thing.Type = ValueTracker.Deserialize(ref reader, TypeName); break; case TitleName: thing.Title = ValueTracker.Deserialize(ref reader, TitleName); diff --git a/codegen2/src/Dtdl2Wot/DtdlMqttTopicTokens.cs b/codegen2/src/Dtdl2Wot/DtdlMqttTopicTokens.cs index 0d00a69447..2e378a4959 100644 --- a/codegen2/src/Dtdl2Wot/DtdlMqttTopicTokens.cs +++ b/codegen2/src/Dtdl2Wot/DtdlMqttTopicTokens.cs @@ -5,6 +5,11 @@ /// public static class DtdlMqttTopicTokens { + /// + /// Token representing the DTMI of a DTDL model. + /// + public const string ModelId = "{modelId}"; + /// /// Token representing the name of a Command. /// diff --git a/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs b/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs index 70d9df041a..86d7161a3a 100644 --- a/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs +++ b/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs @@ -32,9 +32,9 @@ public InterfaceThing(IReadOnlyDictionary modelDict, Dtmi in this.mqttVersion = mqttVersion; this.schemaNamesPath = schemaNamesPath; - this.telemetryTopic = dtInterface.SupplementalProperties.TryGetValue(string.Format(DtdlMqttExtensionValues.TelemTopicPropertyFormat, mqttVersion), out object? telemTopicObj) ? (string)telemTopicObj : null; - this.commandTopic = dtInterface.SupplementalProperties.TryGetValue(string.Format(DtdlMqttExtensionValues.CmdReqTopicPropertyFormat, mqttVersion), out object? cmdTopicObj) ? (string)cmdTopicObj : null; - this.propertyTopic = dtInterface.SupplementalProperties.TryGetValue(string.Format(DtdlMqttExtensionValues.PropTopicPropertyFormat, mqttVersion), out object? propTopicObj) ? (string)propTopicObj : null; + this.telemetryTopic = dtInterface.SupplementalProperties.TryGetValue(string.Format(DtdlMqttExtensionValues.TelemTopicPropertyFormat, mqttVersion), out object? telemTopicObj) ? ((string)telemTopicObj).Replace(DtdlMqttTopicTokens.ModelId, interfaceId.AbsoluteUri) : null; + this.commandTopic = dtInterface.SupplementalProperties.TryGetValue(string.Format(DtdlMqttExtensionValues.CmdReqTopicPropertyFormat, mqttVersion), out object? cmdTopicObj) ? ((string)cmdTopicObj).Replace(DtdlMqttTopicTokens.ModelId, interfaceId.AbsoluteUri) : null; + this.propertyTopic = dtInterface.SupplementalProperties.TryGetValue(string.Format(DtdlMqttExtensionValues.PropTopicPropertyFormat, mqttVersion), out object? propTopicObj) ? ((string)propTopicObj).Replace(DtdlMqttTopicTokens.ModelId, interfaceId.AbsoluteUri) : null; this.telemServiceGroupId = dtInterface.SupplementalProperties.TryGetValue(string.Format(DtdlMqttExtensionValues.TelemServiceGroupIdPropertyFormat, mqttVersion), out object? telemServiceGroupIdObj) ? (string)telemServiceGroupIdObj : null; this.cmdServiceGroupId = dtInterface.SupplementalProperties.TryGetValue(string.Format(DtdlMqttExtensionValues.CmdServiceGroupIdPropertyFormat, mqttVersion), out object? cmdServiceGroupIdObj) ? (string)cmdServiceGroupIdObj : null; diff --git a/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt b/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt index 0c04dee411..f3d55abcaf 100644 --- a/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt +++ b/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt @@ -8,16 +8,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "<#=this.dtInterface.Id.ToString()#>", + "@type": "tm:ThingModel", "title": "<#=this.serviceName.AsGiven#>", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "links": [ { "rel": "service-desc", diff --git a/codegen2/src/TDParse/Program.cs b/codegen2/src/TDParse/Program.cs index 87fdeb9807..fdc2cb649a 100644 --- a/codegen2/src/TDParse/Program.cs +++ b/codegen2/src/TDParse/Program.cs @@ -36,7 +36,7 @@ static void Main(string[] args) Console.WriteLine($"@context: {context}"); } } - Console.WriteLine($"ID: {thing.Id}"); + Console.WriteLine($"Type: {thing.Type}"); Console.WriteLine($"Title: {thing.Title}"); if (thing.Forms?.Elements != null) { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeEmpty.json index 890f03bd1b..2ca2235f98 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "ActionFormAdditionalResponseContentTypeEmpty.TD.json", - "line": 45, + "line": 37, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeText.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeText.json index ce2a0b21cf..f0667eed12 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeText.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeText.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "ActionFormAdditionalResponseContentTypeText.TD.json", - "line": 45, + "line": 37, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoMatchingSchemaDefinition.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoMatchingSchemaDefinition.json index d219f95d7d..58d565a875 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoMatchingSchemaDefinition.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoMatchingSchemaDefinition.json @@ -8,8 +8,8 @@ { "condition": "ItemNotFound", "filename": "ActionFormAdditionalResponseNoMatchingSchemaDefinition.TD.json", - "line": 37, - "cfLine": 16, + "line": 29, + "cfLine": 8, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchema.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchema.json index f4eb7054a5..c516a47a8d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchema.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchema.json @@ -8,7 +8,7 @@ { "condition": "PropertyMissing", "filename": "ActionFormAdditionalResponseNoSchema.TD.json", - "line": 43, + "line": 35, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchemaDefinitions.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchemaDefinitions.json index 618f02b99b..b14de437cf 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchemaDefinitions.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchemaDefinitions.json @@ -8,7 +8,7 @@ { "condition": "ItemNotFound", "filename": "ActionFormAdditionalResponseNoSchemaDefinitions.TD.json", - "line": 27, + "line": 19, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSuccess.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSuccess.json index 64289b1ec4..48aa375c9c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSuccess.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSuccess.json @@ -8,7 +8,7 @@ { "condition": "PropertyMissing", "filename": "ActionFormAdditionalResponseNoSuccess.TD.json", - "line": 42, + "line": 34, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionMap.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionMap.json index 7d52f12fe1..4174f132cc 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionMap.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionMap.json @@ -8,8 +8,8 @@ { "condition": "TypeMismatch", "filename": "ActionFormAdditionalResponseSchemaDefinitionMap.TD.json", - "line": 42, - "cfLine": 24, + "line": 34, + "cfLine": 16, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionNotObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionNotObject.json index 3b4086a3df..3d9496f9ca 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionNotObject.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionNotObject.json @@ -8,8 +8,8 @@ { "condition": "TypeMismatch", "filename": "ActionFormAdditionalResponseSchemaDefinitionNotObject.TD.json", - "line": 44, - "cfLine": 17, + "line": 36, + "cfLine": 9, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaEmpty.json index 52cafa87e3..a9bdf71cbe 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "ActionFormAdditionalResponseSchemaEmpty.TD.json", - "line": 45, + "line": 37, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSuccessTrue.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSuccessTrue.json index c17c80d3e4..e0bdc23845 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSuccessTrue.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSuccessTrue.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "ActionFormAdditionalResponseSuccessTrue.TD.json", - "line": 43, + "line": 35, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseUnsupportedProperty.json index 9d1bf5b246..9fd3fa6a1b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseUnsupportedProperty.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "ActionFormAdditionalResponseUnsupportedProperty.TD.json", - "line": 46, + "line": 38, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponsesMultiple.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponsesMultiple.json index c3eeaaafe9..6acbb2580d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponsesMultiple.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponsesMultiple.json @@ -8,7 +8,7 @@ { "condition": "ElementsPlural", "filename": "ActionFormAdditionalResponsesMultiple.TD.json", - "line": 42, + "line": 34, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormContentTypeText.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormContentTypeText.json index 37ec4b099b..ba0f010302 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormContentTypeText.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormContentTypeText.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "ActionFormContentTypeText.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeEmpty.json index b8a538692f..16c2d3b38f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "ActionFormHeaderCodeEmpty.TD.json", - "line": 24, + "line": 16, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoMatchingSchemaDefinition.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoMatchingSchemaDefinition.json index 72db699950..723c4f006f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoMatchingSchemaDefinition.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoMatchingSchemaDefinition.json @@ -8,8 +8,8 @@ { "condition": "ItemNotFound", "filename": "ActionFormHeaderCodeNoMatchingSchemaDefinition.TD.json", - "line": 29, - "cfLine": 16, + "line": 21, + "cfLine": 8, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoSchemaDefinitions.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoSchemaDefinitions.json index 108d67ac9b..9c02898df3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoSchemaDefinitions.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoSchemaDefinitions.json @@ -8,7 +8,7 @@ { "condition": "ItemNotFound", "filename": "ActionFormHeaderCodeNoSchemaDefinitions.TD.json", - "line": 24, + "line": 16, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeSchemaDefinitionNotEnum.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeSchemaDefinitionNotEnum.json index d74d6744cf..51ccefd397 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeSchemaDefinitionNotEnum.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeSchemaDefinitionNotEnum.json @@ -8,8 +8,8 @@ { "condition": "TypeMismatch", "filename": "ActionFormHeaderCodeSchemaDefinitionNotEnum.TD.json", - "line": 29, - "cfLine": 17, + "line": 21, + "cfLine": 9, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeEmpty.json index b3a1249234..06c9a411fd 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "ActionFormHeaderInfoContentTypeEmpty.TD.json", - "line": 45, + "line": 37, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeNotJson.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeNotJson.json index deebcd04b1..e8d039c800 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeNotJson.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeNotJson.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "ActionFormHeaderInfoContentTypeNotJson.TD.json", - "line": 45, + "line": 37, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoContentType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoContentType.json index 110f8e5405..c69e1455ba 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoContentType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoContentType.json @@ -8,7 +8,7 @@ { "condition": "PropertyMissing", "filename": "ActionFormHeaderInfoNoContentType.TD.json", - "line": 42, + "line": 34, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoMatchingSchemaDefinition.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoMatchingSchemaDefinition.json index 7003119348..d225470505 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoMatchingSchemaDefinition.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoMatchingSchemaDefinition.json @@ -8,8 +8,8 @@ { "condition": "ItemNotFound", "filename": "ActionFormHeaderInfoNoMatchingSchemaDefinition.TD.json", - "line": 37, - "cfLine": 16, + "line": 29, + "cfLine": 8, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchema.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchema.json index 38a0708c79..fae238900f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchema.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchema.json @@ -8,7 +8,7 @@ { "condition": "PropertyMissing", "filename": "ActionFormHeaderInfoNoSchema.TD.json", - "line": 43, + "line": 35, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchemaDefinitions.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchemaDefinitions.json index 1c5c517392..112636dd34 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchemaDefinitions.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchemaDefinitions.json @@ -8,7 +8,7 @@ { "condition": "ItemNotFound", "filename": "ActionFormHeaderInfoNoSchemaDefinitions.TD.json", - "line": 27, + "line": 19, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionMap.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionMap.json index 09c997c457..28e10b955f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionMap.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionMap.json @@ -8,8 +8,8 @@ { "condition": "TypeMismatch", "filename": "ActionFormHeaderInfoSchemaDefinitionMap.TD.json", - "line": 42, - "cfLine": 24, + "line": 34, + "cfLine": 16, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionNotObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionNotObject.json index b0a3be70c4..9bf469cc6f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionNotObject.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionNotObject.json @@ -8,8 +8,8 @@ { "condition": "TypeMismatch", "filename": "ActionFormHeaderInfoSchemaDefinitionNotObject.TD.json", - "line": 44, - "cfLine": 17, + "line": 36, + "cfLine": 9, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaEmpty.json index 05549d97ef..a76ea58cf0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "ActionFormHeaderInfoSchemaEmpty.TD.json", - "line": 45, + "line": 37, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSuccessTrue.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSuccessTrue.json index 05b1ca989f..fda8d980f8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSuccessTrue.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSuccessTrue.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "ActionFormHeaderInfoSuccessTrue.TD.json", - "line": 43, + "line": 35, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoUnsupportedProperty.json index 02d965c659..0e91fe3eb7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoUnsupportedProperty.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "ActionFormHeaderInfoUnsupportedProperty.TD.json", - "line": 46, + "line": 38, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfosMultiple.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfosMultiple.json index 890056db57..6e095435c6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfosMultiple.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfosMultiple.json @@ -8,7 +8,7 @@ { "condition": "ElementsPlural", "filename": "ActionFormHeaderInfosMultiple.TD.json", - "line": 42, + "line": 34, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpInvokeDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpInvokeDuplicate.json index 34e28c6242..ee826dfbb1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpInvokeDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpInvokeDuplicate.json @@ -8,7 +8,7 @@ { "condition": "Duplication", "filename": "ActionFormOpInvokeDuplicate.TD.json", - "line": 23, + "line": 15, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpRead.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpRead.json index 0785ad8e42..d7f98a805d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpRead.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpRead.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "ActionFormOpRead.TD.json", - "line": 23, + "line": 15, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpSub.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpSub.json index 76d54fe87c..17b74459f4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpSub.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpSub.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "ActionFormOpSub.TD.json", - "line": 23, + "line": 15, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpWrite.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpWrite.json index c2635d9455..a26e9ba9b2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpWrite.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpWrite.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "ActionFormOpWrite.TD.json", - "line": 23, + "line": 15, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormServiceGroupEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormServiceGroupEmpty.json index db21b8364a..dd080cc93b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormServiceGroupEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormServiceGroupEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "ActionFormServiceGroupEmpty.TD.json", - "line": 24, + "line": 16, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicNoContentType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicNoContentType.json index 36c47776a4..c462bbd695 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicNoContentType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicNoContentType.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "ActionFormTopicNoContentType.TD.json", - "line": 19, - "cfLine": 21, + "line": 11, + "cfLine": 13, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenAction.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenAction.json index 549c791097..2cf3f61640 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenAction.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenAction.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "ActionFormTopicTokenAction.TD.json", - "line": 22, + "line": 14, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenConsumerId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenConsumerId.json index 6f1009de1a..1dfffcd920 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenConsumerId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenConsumerId.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "ActionFormTopicTokenConsumerId.TD.json", - "line": 22, + "line": 14, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenMaintainerId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenMaintainerId.json index 75a0483d9d..4b2f91eb8d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenMaintainerId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenMaintainerId.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "ActionFormTopicTokenMaintainerId.TD.json", - "line": 22, + "line": 14, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenSenderId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenSenderId.json index dcb82c325d..5f25781c81 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenSenderId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenSenderId.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "ActionFormTopicTokenSenderId.TD.json", - "line": 22, + "line": 14, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormUnsupportedProperty.json index e75ebfb377..e026a721b5 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormUnsupportedProperty.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "ActionFormUnsupportedProperty.TD.json", - "line": 24, + "line": 16, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsEmpty.json index 2a93d7e4f0..421a4021b6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsEmpty.json @@ -8,7 +8,7 @@ { "condition": "ElementMissing", "filename": "ActionFormsEmpty.TD.json", - "line": 18, + "line": 10, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsMultipleContentTypes.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsMultipleContentTypes.json index 62ab7cc754..28893651b0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsMultipleContentTypes.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsMultipleContentTypes.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "ActionFormsMultipleContentTypes.TD.json", - "line": 21, - "cfLine": 27, + "line": 13, + "cfLine": 19, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOpInvokeDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOpInvokeDuplicate.json index 22c5dff41f..c48f9beda8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOpInvokeDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOpInvokeDuplicate.json @@ -8,8 +8,8 @@ { "condition": "Duplication", "filename": "ActionFormsOpInvokeDuplicate.TD.json", - "line": 23, - "cfLine": 29, + "line": 15, + "cfLine": 21, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessAndInvoke.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessAndInvoke.json index 1220d42364..a263b7002e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessAndInvoke.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessAndInvoke.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "ActionFormsOplessAndInvoke.TD.json", - "line": 25, - "cfLine": 18, + "line": 17, + "cfLine": 10, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessDuplicate.json index 965b2aa17d..2a180fcc24 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessDuplicate.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "ActionFormsOplessDuplicate.TD.json", - "line": 19, - "cfLine": 18, + "line": 11, + "cfLine": 10, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputMap.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputMap.json index b7476691ea..c543910559 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputMap.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputMap.json @@ -8,7 +8,7 @@ { "condition": "TypeMismatch", "filename": "ActionInputMap.TD.json", - "line": 18, + "line": 10, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNullAndContentTypeJson.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNullAndContentTypeJson.json index 8a9e8ca062..596de17e0b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNullAndContentTypeJson.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNullAndContentTypeJson.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "ActionInputNullAndContentTypeJson.TD.json", - "line": 19, - "cfLine": 24, + "line": 11, + "cfLine": 16, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNumber.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNumber.json index dfe7914da0..431772a04c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNumber.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNumber.json @@ -8,7 +8,7 @@ { "condition": "TypeMismatch", "filename": "ActionInputNumber.TD.json", - "line": 18, + "line": 10, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeCustom.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeCustom.json index 6d8db401ed..3d0759a3c1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeCustom.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeCustom.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "ActionInputObjectAndContentTypeCustom.TD.json", - "line": 19, - "cfLine": 29, + "line": 11, + "cfLine": 21, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeRaw.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeRaw.json index b248680194..2b4b1fdbef 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeRaw.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeRaw.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "ActionInputObjectAndContentTypeRaw.TD.json", - "line": 19, - "cfLine": 29, + "line": 11, + "cfLine": 21, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectConst.json index e00b268198..9c4ef823df 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectConst.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "ActionInputObjectConst.TD.json", - "line": 25, + "line": 17, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectErrorMessage.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectErrorMessage.json index 59655e2c13..7a14b156e2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectErrorMessage.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectErrorMessage.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "ActionInputObjectErrorMessage.TD.json", - "line": 25, + "line": 17, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputString.json index 5a76318fe7..e00e761807 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputString.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputString.json @@ -8,7 +8,7 @@ { "condition": "TypeMismatch", "filename": "ActionInputString.TD.json", - "line": 18, + "line": 10, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoForms.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoForms.json index c23226607f..3e9fe52eae 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoForms.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoForms.json @@ -1,14 +1,14 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/ActionNoForms.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionNoForms.TD.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", "filename": "ActionNoForms.TD.json", - "line": 17, + "line": 9, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoFormsWithTopic.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoFormsWithTopic.json index 7c9057a651..081e00d494 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoFormsWithTopic.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoFormsWithTopic.json @@ -8,7 +8,7 @@ { "condition": "Unusable", "filename": "ActionNoFormsWithTopic.TD.json", - "line": 17, + "line": 9, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputMap.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputMap.json index f9338414fe..133ed6bceb 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputMap.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputMap.json @@ -8,7 +8,7 @@ { "condition": "TypeMismatch", "filename": "ActionOutputMap.TD.json", - "line": 18, + "line": 10, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNullAndContentTypeJson.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNullAndContentTypeJson.json index e6bbf53182..917432df00 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNullAndContentTypeJson.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNullAndContentTypeJson.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "ActionOutputNullAndContentTypeJson.TD.json", - "line": 19, - "cfLine": 24, + "line": 11, + "cfLine": 16, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNumber.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNumber.json index d13bac1f0a..e12bcbe81a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNumber.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNumber.json @@ -8,7 +8,7 @@ { "condition": "TypeMismatch", "filename": "ActionOutputNumber.TD.json", - "line": 18, + "line": 10, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeCustom.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeCustom.json index 7504684494..c8e7c30be6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeCustom.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeCustom.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "ActionOutputObjectAndContentTypeCustom.TD.json", - "line": 19, - "cfLine": 29, + "line": 11, + "cfLine": 21, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeRaw.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeRaw.json index 7b6f3fdc01..855237d838 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeRaw.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeRaw.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "ActionOutputObjectAndContentTypeRaw.TD.json", - "line": 19, - "cfLine": 29, + "line": 11, + "cfLine": 21, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectConst.json index cc32c1bce7..8b3bcd18b2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectConst.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "ActionOutputObjectConst.TD.json", - "line": 25, + "line": 17, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectErrorMessage.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectErrorMessage.json index 236640abcb..2cee4dabe1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectErrorMessage.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectErrorMessage.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "ActionOutputObjectErrorMessage.TD.json", - "line": 25, + "line": 17, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputString.json index cf11269050..9fc7135a33 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputString.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputString.json @@ -8,7 +8,7 @@ { "condition": "TypeMismatch", "filename": "ActionOutputString.TD.json", - "line": 18, + "line": 10, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionUnsupportedProperty.json index d1af49b2a6..c18d40ab31 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionUnsupportedProperty.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "ActionUnsupportedProperty.TD.json", - "line": 26, + "line": 18, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ArrayKey.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ArrayKey.json index a3a7baaf43..3f8b491253 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ArrayKey.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ArrayKey.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "ArrayKey.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/BooleanKey.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/BooleanKey.json index e67a1b1ec8..75d124a364 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/BooleanKey.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/BooleanKey.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "BooleanKey.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/DuplicateKey.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/DuplicateKey.json index 60fa5c2362..8793394088 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/DuplicateKey.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/DuplicateKey.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "DuplicateKey.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventBooleanConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventBooleanConst.json index f5c9578886..c2fce4f4cb 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventBooleanConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventBooleanConst.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "EventBooleanConst.TD.json", - "line": 24, + "line": 16, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormAdditionalResponses.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormAdditionalResponses.json index 6638ce0fe3..4234974a69 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormAdditionalResponses.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormAdditionalResponses.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "EventFormAdditionalResponses.TD.json", - "line": 41, + "line": 33, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormContentTypeText.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormContentTypeText.json index 8fde2cb5ed..529eea7fd1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormContentTypeText.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormContentTypeText.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "EventFormContentTypeText.TD.json", - "line": 28, + "line": 20, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderCode.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderCode.json index 87b1277894..93a06b8f6c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderCode.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderCode.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "EventFormHeaderCode.TD.json", - "line": 40, + "line": 32, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderInfo.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderInfo.json index 2353a8f791..4ff6952ed9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderInfo.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderInfo.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "EventFormHeaderInfo.TD.json", - "line": 41, + "line": 33, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpInvoke.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpInvoke.json index 9d9d2dc3fb..f068e594ed 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpInvoke.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpInvoke.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "EventFormOpInvoke.TD.json", - "line": 30, + "line": 22, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpRead.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpRead.json index ed621a9afa..ef86bc5282 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpRead.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpRead.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "EventFormOpRead.TD.json", - "line": 30, + "line": 22, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubAll.json index 08b121dcfc..116c116357 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubAll.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "EventFormOpSubAll.TD.json", - "line": 30, + "line": 22, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubDuplicate.json index ffb8ad2b3f..b254f0c3ab 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubDuplicate.json @@ -8,7 +8,7 @@ { "condition": "Duplication", "filename": "EventFormOpSubDuplicate.TD.json", - "line": 30, + "line": 22, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpWrite.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpWrite.json index 5ffccc9a81..65605cb8c0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpWrite.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpWrite.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "EventFormOpWrite.TD.json", - "line": 30, + "line": 22, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormServiceGroupEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormServiceGroupEmpty.json index efc63da34e..53d32ea4fa 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormServiceGroupEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormServiceGroupEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "EventFormServiceGroupEmpty.TD.json", - "line": 31, + "line": 23, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicNoContentType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicNoContentType.json index 093de0ee49..1830f0533a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicNoContentType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicNoContentType.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "EventFormTopicNoContentType.TD.json", - "line": 26, - "cfLine": 28, + "line": 18, + "cfLine": 20, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenAction.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenAction.json index 478f519093..a01eed912b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenAction.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenAction.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "EventFormTopicTokenAction.TD.json", - "line": 29, + "line": 21, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenConsumerId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenConsumerId.json index 8d28de7ba5..e3fc385084 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenConsumerId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenConsumerId.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "EventFormTopicTokenConsumerId.TD.json", - "line": 29, + "line": 21, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenExecutorId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenExecutorId.json index e471834a44..b2f1829f78 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenExecutorId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenExecutorId.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "EventFormTopicTokenExecutorId.TD.json", - "line": 29, + "line": 21, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenInvokerId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenInvokerId.json index 66c59177e3..394d8aaf19 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenInvokerId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenInvokerId.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "EventFormTopicTokenInvokerId.TD.json", - "line": 29, + "line": 21, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenMaintainerId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenMaintainerId.json index bf1a0b1125..14be19a82e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenMaintainerId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenMaintainerId.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "EventFormTopicTokenMaintainerId.TD.json", - "line": 29, + "line": 21, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormUnsupportedProperty.json index aed8dcd0a5..647b847ce3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormUnsupportedProperty.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "EventFormUnsupportedProperty.TD.json", - "line": 31, + "line": 23, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsEmpty.json index c8ea07362c..0c8d8d28e7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsEmpty.json @@ -8,7 +8,7 @@ { "condition": "ElementMissing", "filename": "EventFormsEmpty.TD.json", - "line": 25, + "line": 17, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOpSubDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOpSubDuplicate.json index 3386662cc2..7dd933017f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOpSubDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOpSubDuplicate.json @@ -8,8 +8,8 @@ { "condition": "Duplication", "filename": "EventFormsOpSubDuplicate.TD.json", - "line": 30, - "cfLine": 36, + "line": 22, + "cfLine": 28, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessAndSub.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessAndSub.json index c98117c704..fc173b1c2f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessAndSub.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessAndSub.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "EventFormsOplessAndSub.TD.json", - "line": 32, - "cfLine": 25, + "line": 24, + "cfLine": 17, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessDuplicate.json index b927e1a63b..3f6e9d7fbf 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessDuplicate.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "EventFormsOplessDuplicate.TD.json", - "line": 26, - "cfLine": 25, + "line": 18, + "cfLine": 17, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventIntegerConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventIntegerConst.json index ac53c971f7..1de3ed5e6e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventIntegerConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventIntegerConst.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "EventIntegerConst.TD.json", - "line": 24, + "line": 16, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoForms.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoForms.json index 91e5c7a9e7..50467ca63e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoForms.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoForms.json @@ -1,14 +1,14 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/EventNoForms.TD.json" ], + "thingFiles": [ "invalidAioBinding/EventNoForms.TD.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", "filename": "EventNoForms.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoFormsWithTopicAndNoRootFormSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoFormsWithTopicAndNoRootFormSubAll.json index 2109609ef8..f32986df63 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoFormsWithTopicAndNoRootFormSubAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoFormsWithTopicAndNoRootFormSubAll.json @@ -8,7 +8,7 @@ { "condition": "Unusable", "filename": "EventNoFormsWithTopicAndNoRootFormSubAll.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNullAndContentTypeJson.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNullAndContentTypeJson.json index 5ad3632a69..48055e6c9b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNullAndContentTypeJson.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNullAndContentTypeJson.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "EventNullAndContentTypeJson.TD.json", - "line": 23, - "cfLine": 28, + "line": 15, + "cfLine": 20, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNumberConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNumberConst.json index 3b241b482a..cb08c52959 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNumberConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNumberConst.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "EventNumberConst.TD.json", - "line": 24, + "line": 16, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeCustom.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeCustom.json index 41e55e4712..6088e7bb1e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeCustom.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeCustom.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "EventObjectAndContentTypeCustom.TD.json", - "line": 23, - "cfLine": 33, + "line": 15, + "cfLine": 25, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeRaw.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeRaw.json index 98a5c2d6bb..ae10479cc5 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeRaw.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeRaw.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "EventObjectAndContentTypeRaw.TD.json", - "line": 23, - "cfLine": 33, + "line": 15, + "cfLine": 25, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectConst.json index a2440116cc..191c050e68 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectConst.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "EventObjectConst.TD.json", - "line": 29, + "line": 21, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectErrorMessage.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectErrorMessage.json index 514aa135f7..93068ba06f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectErrorMessage.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectErrorMessage.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "EventObjectErrorMessage.TD.json", - "line": 29, + "line": 21, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventStringConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventStringConst.json index c85a7f8f9a..52dddc4a17 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventStringConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventStringConst.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "EventStringConst.TD.json", - "line": 24, + "line": 16, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventUnsupportedProperty.json index ab0e422a31..4ebc23230f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventUnsupportedProperty.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "EventUnsupportedProperty.TD.json", - "line": 33, + "line": 25, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdInvalidReplacementForTokenInTopic.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdInvalidReplacementForTokenInTopic.json deleted file mode 100644 index 8967a54c9c..0000000000 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdInvalidReplacementForTokenInTopic.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "success": false, - "commandLine": { - "thingFiles": [ "invalidAioBinding/IdInvalidReplacementForTokenInTopic.TD.json" ], - "lang": "none" - }, - "errors": [ - { - "condition": "PropertyInvalid", - "filename": "IdInvalidReplacementForTokenInTopic.TD.json", - "line": 6, - "cfLine": 22, - "crossRef": "" - } - ] -} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdNotString.json deleted file mode 100644 index 6b58a502fe..0000000000 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdNotString.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "success": false, - "commandLine": { - "thingFiles": [ "invalidThing/IdNotString.TD.json" ], - "lang": "none" - }, - "errors": [ - { - "condition": "JsonInvalid", - "filename": "IdNotString.TD.json", - "line": 6, - "cfLine": 0, - "crossRef": "" - } - ] -} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkEmptyHref.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkEmptyHref.json index c9ea185141..bef9f8b1a0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkEmptyHref.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkEmptyHref.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "LinkEmptyHref.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkEmptyType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkEmptyType.json index 3e33ea50eb..89de7f2fe0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkEmptyType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkEmptyType.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "LinkEmptyType.TD.json", - "line": 20, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNoHref.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNoHref.json index 4034b8b1e1..924e0fd6f2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNoHref.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNoHref.json @@ -8,7 +8,7 @@ { "condition": "PropertyMissing", "filename": "LinkNoHref.TD.json", - "line": 17, + "line": 9, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNoType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNoType.json index d8872f7551..a21141a99e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNoType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNoType.json @@ -8,7 +8,7 @@ { "condition": "PropertyMissing", "filename": "LinkNoType.TD.json", - "line": 17, + "line": 9, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNonJsonFile.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNonJsonFile.json index fb6776a39a..a1c9453547 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNonJsonFile.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNonJsonFile.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "LinkNonJsonFile.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNonexistentFile.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNonexistentFile.json index 6726caa017..50b167da0e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNonexistentFile.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNonexistentFile.json @@ -8,7 +8,7 @@ { "condition": "ItemNotFound", "filename": "LinkNonexistentFile.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkTypeNotJson.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkTypeNotJson.json index 3ec04dbfdf..cd9aa78052 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkTypeNotJson.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkTypeNotJson.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "LinkTypeNotJson.TD.json", - "line": 20, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkUnsupportedProperty.json index 5a793777f3..36a7b8069b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkUnsupportedProperty.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "LinkUnsupportedProperty.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingColon.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingColon.json index d7544faec9..a9ebf8780a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingColon.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingColon.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "MissingColon.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingComma.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingComma.json index a36a1f17e1..7f40d3b2ee 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingComma.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingComma.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "MissingComma.TD.json", - "line": 22, + "line": 14, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingElement.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingElement.json index 53f4bf5fad..109bef61d2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingElement.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingElement.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "MissingElement.TD.json", - "line": 17, + "line": 9, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingKey.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingKey.json index 0177151d0f..db664da81f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingKey.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingKey.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "MissingKey.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingValue.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingValue.json index ebbb638f74..87e184e7a1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingValue.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingValue.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "MissingValue.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MultipleLinks.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MultipleLinks.json index 4d31c34f2e..e2b710f722 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MultipleLinks.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MultipleLinks.json @@ -8,7 +8,7 @@ { "condition": "Duplication", "filename": "MultipleLinks.TD.json", - "line": 16, + "line": 8, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoTitle.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoTitle.json index 9fb45c1c8c..64929e454a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoTitle.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoTitle.json @@ -1,7 +1,7 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/NoTitle.TD.json" ], + "thingFiles": [ "invalidAioBinding/NoTitle.TD.json" ], "lang": "none" }, "errors": [ diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoType.json similarity index 68% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoId.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoType.json index 5f7d1d7039..d1e5fd9ddf 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoType.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/NoId.TD.json" ], + "thingFiles": [ "invalidThing/NoType.TD.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", - "filename": "NoId.TD.json", + "filename": "NoType.TD.json", "line": 0, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NumericKey.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NumericKey.json index f18ede639c..5d0d37eb48 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NumericKey.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NumericKey.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "NumericKey.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ObjectKey.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ObjectKey.json index 484c7550e6..ede091c85a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ObjectKey.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ObjectKey.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "ObjectKey.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyBooleanConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyBooleanConst.json index 546c288202..9a54885b73 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyBooleanConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyBooleanConst.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "PropertyBooleanConst.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeEmpty.json index 633e8fe1b2..bf6d882a53 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "PropertyFormAdditionalResponseContentTypeEmpty.TD.json", - "line": 48, + "line": 40, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeText.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeText.json index 444875b22e..b8de8486da 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeText.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeText.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "PropertyFormAdditionalResponseContentTypeText.TD.json", - "line": 41, + "line": 33, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.json index 537b9397f8..2a5cd100d4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.json @@ -8,8 +8,8 @@ { "condition": "ItemNotFound", "filename": "PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TD.json", - "line": 40, - "cfLine": 16, + "line": 32, + "cfLine": 8, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchema.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchema.json index 67327eb234..02c375c412 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchema.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchema.json @@ -8,7 +8,7 @@ { "condition": "PropertyMissing", "filename": "PropertyFormAdditionalResponseNoSchema.TD.json", - "line": 46, + "line": 38, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchemaDefinitions.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchemaDefinitions.json index 088603bba9..379808ff76 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchemaDefinitions.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchemaDefinitions.json @@ -8,7 +8,7 @@ { "condition": "ItemNotFound", "filename": "PropertyFormAdditionalResponseNoSchemaDefinitions.TD.json", - "line": 30, + "line": 22, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSuccess.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSuccess.json index e08cc6ce83..3efa1a509f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSuccess.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSuccess.json @@ -8,7 +8,7 @@ { "condition": "PropertyMissing", "filename": "PropertyFormAdditionalResponseNoSuccess.TD.json", - "line": 45, + "line": 37, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionMap.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionMap.json index cfd1464e2e..7480e5fcd2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionMap.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionMap.json @@ -8,8 +8,8 @@ { "condition": "TypeMismatch", "filename": "PropertyFormAdditionalResponseSchemaDefinitionMap.TD.json", - "line": 45, - "cfLine": 24, + "line": 37, + "cfLine": 16, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionNotObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionNotObject.json index 61efa955a6..b81e831b31 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionNotObject.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionNotObject.json @@ -8,8 +8,8 @@ { "condition": "TypeMismatch", "filename": "PropertyFormAdditionalResponseSchemaDefinitionNotObject.TD.json", - "line": 47, - "cfLine": 17, + "line": 39, + "cfLine": 9, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaEmpty.json index b6a6eed9b6..b77c37858c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "PropertyFormAdditionalResponseSchemaEmpty.TD.json", - "line": 48, + "line": 40, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSuccessTrue.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSuccessTrue.json index 1703b05dfe..753392560f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSuccessTrue.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSuccessTrue.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "PropertyFormAdditionalResponseSuccessTrue.TD.json", - "line": 46, + "line": 38, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseUnsupportedProperty.json index 3283e79d53..2645c5695c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseUnsupportedProperty.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "PropertyFormAdditionalResponseUnsupportedProperty.TD.json", - "line": 49, + "line": 41, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponsesMultiple.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponsesMultiple.json index e9123d3df9..294ea8faf4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponsesMultiple.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponsesMultiple.json @@ -8,7 +8,7 @@ { "condition": "ElementsPlural", "filename": "PropertyFormAdditionalResponsesMultiple.TD.json", - "line": 45, + "line": 37, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormContentTypeText.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormContentTypeText.json index 0fbb7b95d3..361bf677a9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormContentTypeText.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormContentTypeText.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "PropertyFormContentTypeText.TD.json", - "line": 24, + "line": 16, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderCode.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderCode.json index 5045d4236f..9f5bc50c2d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderCode.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderCode.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "PropertyFormHeaderCode.TD.json", - "line": 36, + "line": 28, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderInfo.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderInfo.json index fc6bf6feeb..3c5726d8fd 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderInfo.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderInfo.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "PropertyFormHeaderInfo.TD.json", - "line": 37, + "line": 29, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpInvoke.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpInvoke.json index 726561ea65..1ffa26ce6c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpInvoke.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpInvoke.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "PropertyFormOpInvoke.TD.json", - "line": 26, + "line": 18, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadAll.json index 2271bccc68..0fea90f64d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadAll.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "PropertyFormOpReadAll.TD.json", - "line": 26, + "line": 18, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadDuplicate.json index 6782f6bd29..a8c8b198f7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadDuplicate.json @@ -8,7 +8,7 @@ { "condition": "Duplication", "filename": "PropertyFormOpReadDuplicate.TD.json", - "line": 26, + "line": 18, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpSub.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpSub.json index b300682d7a..335f6019d8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpSub.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpSub.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "PropertyFormOpSub.TD.json", - "line": 26, + "line": 18, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteDuplicate.json index ff1ac5cbbe..b9f0d76d68 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteDuplicate.json @@ -8,7 +8,7 @@ { "condition": "Duplication", "filename": "PropertyFormOpWriteDuplicate.TD.json", - "line": 26, + "line": 18, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteMulti.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteMulti.json index e06651d758..2eef27bebf 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteMulti.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteMulti.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "PropertyFormOpWriteMulti.TD.json", - "line": 26, + "line": 18, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json index 6719ffac2f..296dd204e6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json @@ -8,8 +8,8 @@ { "condition": "Unusable", "filename": "PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json", - "line": 40, - "cfLine": 26, + "line": 32, + "cfLine": 18, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.json index fc32e5ce09..b2e60ab000 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.json @@ -8,7 +8,7 @@ { "condition": "Unusable", "filename": "PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TD.json", - "line": 22, + "line": 14, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json index 3fa5910a37..3059379315 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json @@ -8,8 +8,8 @@ { "condition": "Unusable", "filename": "PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json", - "line": 40, - "cfLine": 27, + "line": 32, + "cfLine": 19, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicAndNoRootFormReadAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicAndNoRootFormReadAll.json index 5c829f64a6..ef2adff60b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicAndNoRootFormReadAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicAndNoRootFormReadAll.json @@ -8,7 +8,7 @@ { "condition": "Unusable", "filename": "PropertyFormReadWithoutTopicAndNoRootFormReadAll.TD.json", - "line": 22, + "line": 14, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.json index b18b66aacf..738753237c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TD.json", - "line": 35, - "cfLine": 29, + "line": 27, + "cfLine": 21, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormServiceGroup.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormServiceGroup.json index 93279b52c1..28dd2408c9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormServiceGroup.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormServiceGroup.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "PropertyFormServiceGroup.TD.json", - "line": 27, + "line": 19, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicNoContentType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicNoContentType.json index e67b088b39..d5542c9191 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicNoContentType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicNoContentType.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "PropertyFormTopicNoContentType.TD.json", - "line": 22, - "cfLine": 24, + "line": 14, + "cfLine": 16, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenExecutorId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenExecutorId.json index 98f564020f..1aca6de658 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenExecutorId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenExecutorId.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "PropertyFormTopicTokenExecutorId.TD.json", - "line": 25, + "line": 17, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenInvokerId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenInvokerId.json index 5deb23d39e..ec3a22e0a9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenInvokerId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenInvokerId.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "PropertyFormTopicTokenInvokerId.TD.json", - "line": 25, + "line": 17, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.json index a60730008e..c523c91018 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.json @@ -8,7 +8,7 @@ { "condition": "ValuesInconsistent", "filename": "PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TD.json", - "line": 25, + "line": 17, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.json index 996f16ca3a..1a720d4945 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.json @@ -8,7 +8,7 @@ { "condition": "ValuesInconsistent", "filename": "PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TD.json", - "line": 26, + "line": 18, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenReadAndWrite.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenReadAndWrite.json index 0f3f5ed8ac..d6286dc591 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenReadAndWrite.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenReadAndWrite.json @@ -8,7 +8,7 @@ { "condition": "ValuesInconsistent", "filename": "PropertyFormTopicTokenNoActionWhenReadAndWrite.TD.json", - "line": 25, + "line": 17, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenSenderId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenSenderId.json index 03be92fe6c..b7afb382fa 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenSenderId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenSenderId.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "PropertyFormTopicTokenSenderId.TD.json", - "line": 25, + "line": 17, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormUnsupportedProperty.json index 2c2553c3a4..a7ee82ff14 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormUnsupportedProperty.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "PropertyFormUnsupportedProperty.TD.json", - "line": 27, + "line": 19, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.json index 7afb79a763..fc1c2165f2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.json @@ -8,8 +8,8 @@ { "condition": "Unusable", "filename": "PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TD.json", - "line": 62, - "cfLine": 38, + "line": 54, + "cfLine": 30, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.json index cc9efc8436..f45913b68f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.json @@ -8,7 +8,7 @@ { "condition": "Unusable", "filename": "PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TD.json", - "line": 28, + "line": 20, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsEmpty.json index 7e3ab2c4c5..ff8a362bd5 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsEmpty.json @@ -8,7 +8,7 @@ { "condition": "ElementMissing", "filename": "PropertyFormsEmpty.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpReadDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpReadDuplicate.json index b0f863c4cf..96e56c049c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpReadDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpReadDuplicate.json @@ -8,8 +8,8 @@ { "condition": "Duplication", "filename": "PropertyFormsOpReadDuplicate.TD.json", - "line": 26, - "cfLine": 32, + "line": 18, + "cfLine": 24, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteDuplicate.json index 9a177bf907..b0b60ba847 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteDuplicate.json @@ -8,8 +8,8 @@ { "condition": "Duplication", "filename": "PropertyFormsOpWriteDuplicate.TD.json", - "line": 26, - "cfLine": 32, + "line": 18, + "cfLine": 24, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteNoRead.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteNoRead.json index a296038eba..bddcbac5c8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteNoRead.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteNoRead.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "PropertyFormsOpWriteNoRead.TD.json", - "line": 26, - "cfLine": 21, + "line": 18, + "cfLine": 13, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessAndRead.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessAndRead.json index ea99ec6a7d..f30e7099bc 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessAndRead.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessAndRead.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "PropertyFormsOplessAndRead.TD.json", - "line": 28, - "cfLine": 21, + "line": 20, + "cfLine": 13, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessDuplicate.json index 9a4b648050..8ae9382ca1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessDuplicate.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "PropertyFormsOplessDuplicate.TD.json", - "line": 22, - "cfLine": 21, + "line": 14, + "cfLine": 13, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyIntegerConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyIntegerConst.json index 0f16f4da10..ebf88a999c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyIntegerConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyIntegerConst.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "PropertyIntegerConst.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNoForms.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNoForms.json index cc28d486cb..31f1c03e1c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNoForms.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNoForms.json @@ -1,14 +1,14 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/PropertyNoForms.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyNoForms.TD.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", "filename": "PropertyNoForms.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNumberConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNumberConst.json index bcee450598..4579d0786b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNumberConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNumberConst.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "PropertyNumberConst.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyObjectConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyObjectConst.json index 5ce2e095a9..78fd69b433 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyObjectConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyObjectConst.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "PropertyObjectConst.TD.json", - "line": 26, + "line": 18, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyObjectErrorMessage.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyObjectErrorMessage.json index 7188908c89..26be392754 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyObjectErrorMessage.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyObjectErrorMessage.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "PropertyObjectErrorMessage.TD.json", - "line": 26, + "line": 18, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyStringConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyStringConst.json index 59d42a130b..1454e5ba0e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyStringConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyStringConst.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "PropertyStringConst.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyTypeNull.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyTypeNull.json index 66782ad924..03aabbec64 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyTypeNull.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyTypeNull.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "PropertyTypeNull.TD.json", - "line": 20, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyUnsupportedProperty.json index f707323742..1c6667fccf 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyUnsupportedProperty.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "PropertyUnsupportedProperty.TD.json", - "line": 29, + "line": 21, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeEmpty.json index 82ada1c585..4f28b90514 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "RootFormAdditionalResponseContentTypeEmpty.TD.json", - "line": 23, + "line": 15, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeText.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeText.json index f281d8dd66..db9a039fae 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeText.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeText.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "RootFormAdditionalResponseContentTypeText.TD.json", - "line": 23, + "line": 15, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseNoSuccess.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseNoSuccess.json index 085576065b..83f4f088ab 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseNoSuccess.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseNoSuccess.json @@ -8,7 +8,7 @@ { "condition": "PropertyMissing", "filename": "RootFormAdditionalResponseNoSuccess.TD.json", - "line": 22, + "line": 14, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSchema.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSchema.json index 494109a920..8a96cb67b6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSchema.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSchema.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "RootFormAdditionalResponseSchema.TD.json", - "line": 30, + "line": 22, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSuccessTrue.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSuccessTrue.json index 688c7ca162..e6f5945d3d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSuccessTrue.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSuccessTrue.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "RootFormAdditionalResponseSuccessTrue.TD.json", - "line": 24, + "line": 16, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseUnsupportedProperty.json index 7b3b11dd9c..8abfe6cfbb 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseUnsupportedProperty.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "RootFormAdditionalResponseUnsupportedProperty.TD.json", - "line": 25, + "line": 17, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesAndSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesAndSubAll.json index ad2059c278..34676994c1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesAndSubAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesAndSubAll.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "RootFormAdditionalResponsesAndSubAll.TD.json", - "line": 21, - "cfLine": 26, + "line": 13, + "cfLine": 18, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesMultiple.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesMultiple.json index 8cb259089b..c8270fa0c0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesMultiple.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesMultiple.json @@ -8,7 +8,7 @@ { "condition": "ElementsPlural", "filename": "RootFormAdditionalResponsesMultiple.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeCustom.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeCustom.json index 30632f2755..79ba3c334f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeCustom.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeCustom.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "RootFormContentTypeCustom.TD.json", - "line": 20, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeRaw.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeRaw.json index 8b2857c88b..5bc17eed71 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeRaw.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeRaw.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "RootFormContentTypeRaw.TD.json", - "line": 20, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeText.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeText.json index 40a10b16e3..79bd0abd65 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeText.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeText.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "RootFormContentTypeText.TD.json", - "line": 20, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormEmptyHref.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormEmptyHref.json deleted file mode 100644 index ab47bf916f..0000000000 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormEmptyHref.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "success": false, - "commandLine": { - "thingFiles": [ "invalidThing/RootFormEmptyHref.TD.json" ], - "lang": "none" - }, - "errors": [ - { - "condition": "PropertyEmpty", - "filename": "RootFormEmptyHref.TD.json", - "line": 18, - "cfLine": 0, - "crossRef": "" - } - ] -} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderCode.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderCode.json index 16c1451728..27ae77ff9c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderCode.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderCode.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "RootFormHeaderCode.TD.json", - "line": 30, + "line": 22, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderInfo.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderInfo.json index b8477224dd..50fc4079c3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderInfo.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderInfo.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "RootFormHeaderInfo.TD.json", - "line": 30, + "line": 22, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoContentType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoContentType.json index 5435debf25..6d9f4ee389 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoContentType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoContentType.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "RootFormNoContentType.TD.json", - "line": 17, - "cfLine": 19, + "line": 9, + "cfLine": 11, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoHref.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoHref.json deleted file mode 100644 index b8d8822384..0000000000 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoHref.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "success": false, - "commandLine": { - "thingFiles": [ "invalidThing/RootFormNoHref.TD.json" ], - "lang": "none" - }, - "errors": [ - { - "condition": "PropertyMissing", - "filename": "RootFormNoHref.TD.json", - "line": 17, - "cfLine": 0, - "crossRef": "" - } - ] -} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoOp.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoOp.json index 8292549485..6ed696f8c2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoOp.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoOp.json @@ -8,7 +8,7 @@ { "condition": "PropertyMissing", "filename": "RootFormNoOp.TD.json", - "line": 17, + "line": 9, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoTopic.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoTopic.json index 7ad99f1457..373fa0a11c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoTopic.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoTopic.json @@ -8,7 +8,7 @@ { "condition": "PropertyMissing", "filename": "RootFormNoTopic.TD.json", - "line": 17, + "line": 9, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpArrayEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpArrayEmpty.json index fe00d45cb6..478e8ca67f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpArrayEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpArrayEmpty.json @@ -8,7 +8,7 @@ { "condition": "ElementMissing", "filename": "RootFormOpArrayEmpty.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpElementEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpElementEmpty.json index 67c06c214f..5a0137b599 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpElementEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpElementEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "RootFormOpElementEmpty.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpEmpty.json index 78d1458583..89a7d0a207 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "RootFormOpEmpty.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllAndSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllAndSubAll.json index 9bdf2ca361..5cbd7e9df7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllAndSubAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllAndSubAll.json @@ -8,7 +8,7 @@ { "condition": "ValuesInconsistent", "filename": "RootFormOpReadAllAndSubAll.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllDuplicate.json index b6d7af9665..5dfad749ea 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllDuplicate.json @@ -8,7 +8,7 @@ { "condition": "Duplication", "filename": "RootFormOpReadAllDuplicate.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadOne.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadOne.json index b5991919cd..3551dc1490 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadOne.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadOne.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "RootFormOpReadOne.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubAllDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubAllDuplicate.json index 23ec7ae909..f9a47964e2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubAllDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubAllDuplicate.json @@ -8,7 +8,7 @@ { "condition": "Duplication", "filename": "RootFormOpSubAllDuplicate.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubOne.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubOne.json index 67c06c214f..5a0137b599 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubOne.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubOne.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "RootFormOpElementEmpty.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWiteMultiAndSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWiteMultiAndSubAll.json index 7a2765529c..a9d60fcd9a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWiteMultiAndSubAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWiteMultiAndSubAll.json @@ -8,7 +8,7 @@ { "condition": "ValuesInconsistent", "filename": "RootFormOpWiteMultiAndSubAll.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteMultiDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteMultiDuplicate.json index afb2724925..108c4b2195 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteMultiDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteMultiDuplicate.json @@ -8,7 +8,7 @@ { "condition": "Duplication", "filename": "RootFormOpWriteMultiDuplicate.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteOne.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteOne.json index 67c06c214f..5a0137b599 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteOne.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteOne.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "RootFormOpElementEmpty.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormReadAllButNoProperties.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormReadAllButNoProperties.json index 6768230f5d..a262a1cc32 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormReadAllButNoProperties.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormReadAllButNoProperties.json @@ -8,8 +8,8 @@ { "condition": "Unusable", "filename": "RootFormReadAllButNoProperties.TD.json", - "line": 21, - "cfLine": 26, + "line": 13, + "cfLine": 18, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupEmpty.json index 093dd302d6..2ff743ab69 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "RootFormServiceGroupEmpty.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupNoSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupNoSubAll.json index 151a4ed7a5..131784cb52 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupNoSubAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupNoSubAll.json @@ -8,7 +8,7 @@ { "condition": "ValuesInconsistent", "filename": "RootFormServiceGroupNoSubAll.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormSubAllButNoEvents.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormSubAllButNoEvents.json index 0b7a57b029..8fbc225487 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormSubAllButNoEvents.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormSubAllButNoEvents.json @@ -8,8 +8,8 @@ { "condition": "Unusable", "filename": "RootFormSubAllButNoEvents.TD.json", - "line": 21, - "cfLine": 28, + "line": 13, + "cfLine": 20, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicEmpty.json index c02ea477ac..49f6454964 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "RootFormTopicEmpty.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelEmpty.json index 9811ea2500..e609bbab9c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "RootFormTopicLevelEmpty.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelInvalid.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelInvalid.json index 4781807c8d..1af3c2ea63 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelInvalid.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelInvalid.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "RootFormTopicLevelInvalid.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicReservedStart.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicReservedStart.json index b1474ee774..977b0b769b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicReservedStart.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicReservedStart.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "RootFormTopicReservedStart.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenActionWhenSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenActionWhenSubAll.json index a5f6e79af9..8203df9e67 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenActionWhenSubAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenActionWhenSubAll.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "RootFormTopicTokenActionWhenSubAll.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenConsumerIdWhenSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenConsumerIdWhenSubAll.json index e9f54fb015..42fd433a1e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenConsumerIdWhenSubAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenConsumerIdWhenSubAll.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "RootFormTopicTokenConsumerIdWhenSubAll.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomEmpty.json index 6bf713ceb8..04d484b06f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "RootFormTopicTokenCustomEmpty.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomInvalid.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomInvalid.json index 7014d13273..a0d335a1b7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomInvalid.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomInvalid.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "RootFormTopicTokenCustomInvalid.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenEmpty.json index fdeeb9539b..cbf3bc12e0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "RootFormTopicTokenEmpty.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenExecutorId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenExecutorId.json index cd26b5936c..2f72d81b6a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenExecutorId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenExecutorId.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "RootFormTopicTokenExecutorId.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenInvokerId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenInvokerId.json index d1068625d4..81d0f0c2d0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenInvokerId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenInvokerId.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "RootFormTopicTokenInvokerId.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenMaintainerIdWhenSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenMaintainerIdWhenSubAll.json index c25cb7061f..f7857b23d2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenMaintainerIdWhenSubAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenMaintainerIdWhenSubAll.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "RootFormTopicTokenMaintainerIdWhenSubAll.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.json index ab2bae80c6..5a1ae73895 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.json @@ -8,7 +8,7 @@ { "condition": "ValuesInconsistent", "filename": "RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenReadAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenReadAll.json index 116ca1b984..48514b89c4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenReadAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenReadAll.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "RootFormTopicTokenSenderIdWhenReadAll.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenWriteMulti.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenWriteMulti.json index 53263e98d9..a9cc7925c0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenWriteMulti.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenWriteMulti.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "RootFormTopicTokenSenderIdWhenWriteMulti.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenUnrecognized.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenUnrecognized.json index fcc38a1c22..b9e259ea5f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenUnrecognized.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenUnrecognized.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "RootFormTopicTokenUnrecognized.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormWriteMultiButNoWritableProperties.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormWriteMultiButNoWritableProperties.json index dd94ce2c68..6f7a3778b1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormWriteMultiButNoWritableProperties.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormWriteMultiButNoWritableProperties.json @@ -8,8 +8,8 @@ { "condition": "Unusable", "filename": "RootFormWriteMultiButNoWritableProperties.TD.json", - "line": 27, - "cfLine": 32, + "line": 19, + "cfLine": 24, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsEmpty.json index 6fabb9fa56..5027efd654 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsEmpty.json @@ -8,7 +8,7 @@ { "condition": "ElementMissing", "filename": "RootFormsEmpty.TD.json", - "line": 16, + "line": 8, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpReadAllDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpReadAllDuplicate.json index 22480a36f0..01e69e2a24 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpReadAllDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpReadAllDuplicate.json @@ -8,8 +8,8 @@ { "condition": "Duplication", "filename": "RootFormsOpReadAllDuplicate.TD.json", - "line": 21, - "cfLine": 27, + "line": 13, + "cfLine": 19, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpSubAllDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpSubAllDuplicate.json index cd4e098fca..4ed0173fa9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpSubAllDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpSubAllDuplicate.json @@ -8,8 +8,8 @@ { "condition": "Duplication", "filename": "RootFormsOpSubAllDuplicate.TD.json", - "line": 21, - "cfLine": 27, + "line": 13, + "cfLine": 19, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiDuplicate.json index 400415b800..735dbadd17 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiDuplicate.json @@ -8,8 +8,8 @@ { "condition": "Duplication", "filename": "RootFormsOpWriteMultiDuplicate.TD.json", - "line": 21, - "cfLine": 27, + "line": 13, + "cfLine": 19, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiNoReadAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiNoReadAll.json index f53446cefe..2611b4b0dd 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiNoReadAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiNoReadAll.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "RootFormsOpWriteMultiNoReadAll.TD.json", - "line": 21, - "cfLine": 16, + "line": 13, + "cfLine": 8, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayConst.json index cf0774e27d..a45a30713d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayConst.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "SchemaDefinitionArrayConst.TD.json", - "line": 22, + "line": 14, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsNoType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsNoType.json index d811e86d99..489ddec266 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsNoType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsNoType.json @@ -8,7 +8,7 @@ { "condition": "PropertyMissing", "filename": "SchemaDefinitionArrayItemsNoType.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsNotObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsNotObject.json index 6b34e9682c..9576a43c5e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsNotObject.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsNotObject.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "SchemaDefinitionArrayItemsNotObject.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsObjectConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsObjectConst.json index d73f5ead2a..8cd9a856d0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsObjectConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsObjectConst.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionArrayItemsObjectConst.TD.json", - "line": 26, + "line": 18, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsRef.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsRef.json index de43f48d5d..b0bae0d56b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsRef.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsRef.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionArrayItemsRef.TD.json", - "line": 20, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsStringConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsStringConst.json index fc3f8d2675..294bed72a6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsStringConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsStringConst.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionArrayItemsStringConst.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeNotString.json index 068d936de8..dd6a4c831d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeNotString.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeNotString.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "SchemaDefinitionArrayItemsTypeNotString.TD.json", - "line": 20, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeNull.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeNull.json index 502a0604f3..0146f78146 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeNull.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeNull.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "SchemaDefinitionArrayItemsTypeNull.TD.json", - "line": 20, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeUnsupported.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeUnsupported.json index 3d21c088ea..c5db6b59be 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeUnsupported.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeUnsupported.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "SchemaDefinitionArrayItemsTypeUnsupported.TD.json", - "line": 20, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayNoItems.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayNoItems.json index bb7063b535..24c0d52bac 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayNoItems.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayNoItems.json @@ -8,7 +8,7 @@ { "condition": "PropertyMissing", "filename": "SchemaDefinitionArrayNoItems.TD.json", - "line": 17, + "line": 9, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanConstValueNotBoolean.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanConstValueNotBoolean.json index b59904c8b3..0bd99cea87 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanConstValueNotBoolean.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanConstValueNotBoolean.json @@ -8,8 +8,8 @@ { "condition": "TypeMismatch", "filename": "SchemaDefinitionBooleanConstValueNotBoolean.TD.json", - "line": 19, - "cfLine": 18, + "line": 11, + "cfLine": 10, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanReadOnly.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanReadOnly.json index a52e11f31b..32c0c43eaf 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanReadOnly.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanReadOnly.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionBooleanReadOnly.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanUnsupportedProperty.json index 62ee5ad39a..2c793f4c67 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanUnsupportedProperty.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionBooleanUnsupportedProperty.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueAboveMax.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueAboveMax.json index 4e542fdcf2..a63ed71692 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueAboveMax.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueAboveMax.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "SchemaDefinitionIntegerConstValueAboveMax.TD.json", - "line": 20, - "cfLine": 19, + "line": 12, + "cfLine": 11, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueBelowMin.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueBelowMin.json index 053d0d0fee..1e2dd118ca 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueBelowMin.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueBelowMin.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "SchemaDefinitionIntegerConstValueBelowMin.TD.json", - "line": 20, - "cfLine": 19, + "line": 12, + "cfLine": 11, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueNotInteger.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueNotInteger.json index 2f330f7f89..e85b312ba2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueNotInteger.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueNotInteger.json @@ -8,8 +8,8 @@ { "condition": "TypeMismatch", "filename": "SchemaDefinitionIntegerConstValueNotInteger.TD.json", - "line": 19, - "cfLine": 18, + "line": 11, + "cfLine": 10, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueNotNumeric.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueNotNumeric.json index d8b327ef26..ce1efd8ea6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueNotNumeric.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueNotNumeric.json @@ -8,8 +8,8 @@ { "condition": "TypeMismatch", "filename": "SchemaDefinitionIntegerConstValueNotNumeric.TD.json", - "line": 19, - "cfLine": 18, + "line": 11, + "cfLine": 10, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMaxNotInteger.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMaxNotInteger.json index 5cc9d19e37..ebb7105e72 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMaxNotInteger.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMaxNotInteger.json @@ -8,7 +8,7 @@ { "condition": "TypeMismatch", "filename": "SchemaDefinitionIntegerMaxNotInteger.TD.json", - "line": 20, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMaxNotNumeric.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMaxNotNumeric.json index 8819ffbc74..e96207f5ec 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMaxNotNumeric.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMaxNotNumeric.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "SchemaDefinitionIntegerMaxNotNumeric.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinAboveMax.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinAboveMax.json index eba255cc64..4d5b1d5006 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinAboveMax.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinAboveMax.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "SchemaDefinitionIntegerMinAboveMax.TD.json", - "line": 20, - "cfLine": 19, + "line": 12, + "cfLine": 11, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinNotInteger.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinNotInteger.json index 57baa90ae9..ad543c6f11 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinNotInteger.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinNotInteger.json @@ -8,7 +8,7 @@ { "condition": "TypeMismatch", "filename": "SchemaDefinitionIntegerMinNotInteger.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinNotNumeric.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinNotNumeric.json index 33575e9678..66622b843c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinNotNumeric.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinNotNumeric.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "SchemaDefinitionIntegerMinNotNumeric.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerReadOnly.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerReadOnly.json index 38d8d5fb9f..dcc8510e05 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerReadOnly.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerReadOnly.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionIntegerReadOnly.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerUnsupportedProperty.json index 9a5ac61643..82327cc33d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerUnsupportedProperty.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionIntegerUnsupportedProperty.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNoType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNoType.json index 9d70f6adfe..0556644fd0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNoType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNoType.json @@ -8,7 +8,7 @@ { "condition": "PropertyMissing", "filename": "SchemaDefinitionMapAdditionalPropertiesNoType.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNotObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNotObject.json index a1c32597b5..97cb7de166 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNotObject.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNotObject.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "SchemaDefinitionMapAdditionalPropertiesNotObject.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesObjectConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesObjectConst.json index 30913006f0..a2f072f752 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesObjectConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesObjectConst.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionMapAdditionalPropertiesObjectConst.TD.json", - "line": 26, + "line": 18, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesRef.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesRef.json index 89766f9e9c..9d0865f5b2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesRef.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesRef.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionMapAdditionalPropertiesRef.TD.json", - "line": 20, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesStringConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesStringConst.json index c91e376341..e46797431b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesStringConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesStringConst.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionMapAdditionalPropertiesStringConst.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNotString.json index 5061d74318..0756476b2a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNotString.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNotString.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "SchemaDefinitionMapAdditionalPropertiesTypeNotString.TD.json", - "line": 20, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNull.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNull.json index 94ff482a56..0cad0861b0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNull.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNull.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "SchemaDefinitionMapAdditionalPropertiesTypeNull.TD.json", - "line": 20, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.json index dfe79fb7b3..72e6ced1a8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TD.json", - "line": 20, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapConst.json index a3160181fb..5b581d2676 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapConst.json @@ -8,8 +8,8 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionMapConst.TD.json", - "line": 22, - "cfLine": 19, + "line": 14, + "cfLine": 11, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNoType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNoType.json index c426bfcf14..613470d41f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNoType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNoType.json @@ -8,7 +8,7 @@ { "condition": "PropertyMissing", "filename": "SchemaDefinitionNoType.TD.json", - "line": 17, + "line": 9, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueAboveMax.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueAboveMax.json index 4b6cdd83da..a5314a92a0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueAboveMax.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueAboveMax.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "SchemaDefinitionNumberConstValueAboveMax.TD.json", - "line": 20, - "cfLine": 19, + "line": 12, + "cfLine": 11, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueBelowMin.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueBelowMin.json index f72aa1e8ac..d786dfb665 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueBelowMin.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueBelowMin.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "SchemaDefinitionNumberConstValueBelowMin.TD.json", - "line": 20, - "cfLine": 19, + "line": 12, + "cfLine": 11, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueNotNumeric.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueNotNumeric.json index 8bc1c75647..e164abc925 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueNotNumeric.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueNotNumeric.json @@ -8,8 +8,8 @@ { "condition": "TypeMismatch", "filename": "SchemaDefinitionNumberConstValueNotNumeric.TD.json", - "line": 19, - "cfLine": 18, + "line": 11, + "cfLine": 10, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMaxNotNumeric.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMaxNotNumeric.json index 9ac3d05494..d5eb20ba4f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMaxNotNumeric.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMaxNotNumeric.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "SchemaDefinitionNumberMaxNotNumeric.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMinAboveMax.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMinAboveMax.json index 5731f7914b..06cf2c3a99 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMinAboveMax.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMinAboveMax.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "SchemaDefinitionNumberMinAboveMax.TD.json", - "line": 20, - "cfLine": 19, + "line": 12, + "cfLine": 11, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMinNotNumeric.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMinNotNumeric.json index d0b2f5b922..03f9e85439 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMinNotNumeric.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMinNotNumeric.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "SchemaDefinitionNumberMinNotNumeric.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberReadOnly.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberReadOnly.json index d85876fc4a..5b585b51e0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberReadOnly.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberReadOnly.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionNumberReadOnly.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberUnsupportedProperty.json index 3114dca13e..f319c06760 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberUnsupportedProperty.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionNumberUnsupportedProperty.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectBothDeterminants.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectBothDeterminants.json index f05d77fa25..708b54ea45 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectBothDeterminants.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectBothDeterminants.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "SchemaDefinitionObjectBothDeterminants.TD.json", - "line": 19, - "cfLine": 24, + "line": 11, + "cfLine": 16, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstNotObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstNotObject.json index b726ae7cb3..346ebc8686 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstNotObject.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstNotObject.json @@ -8,8 +8,8 @@ { "condition": "TypeMismatch", "filename": "SchemaDefinitionObjectConstNotObject.TD.json", - "line": 24, - "cfLine": 18, + "line": 16, + "cfLine": 10, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanConst.json index 374215a3e4..9d64430b53 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanConst.json @@ -8,8 +8,8 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionObjectConstPropertyBooleanConst.TD.json", - "line": 22, - "cfLine": 25, + "line": 14, + "cfLine": 17, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.json index 3c65004ab7..68e0eb5449 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.json @@ -8,8 +8,8 @@ { "condition": "TypeMismatch", "filename": "SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TD.json", - "line": 25, - "cfLine": 21, + "line": 17, + "cfLine": 13, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.json index dd393f833e..884dc58911 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.json @@ -8,8 +8,8 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TD.json", - "line": 22, - "cfLine": 25, + "line": 14, + "cfLine": 17, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerAboveMax.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerAboveMax.json index f78fdfd8e2..c43f2593df 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerAboveMax.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerAboveMax.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "SchemaDefinitionObjectConstPropertyIntegerAboveMax.TD.json", - "line": 26, - "cfLine": 22, + "line": 18, + "cfLine": 14, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerBelowMin.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerBelowMin.json index b4e0aee0c2..672060c8ad 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerBelowMin.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerBelowMin.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "SchemaDefinitionObjectConstPropertyIntegerBelowMin.TD.json", - "line": 26, - "cfLine": 22, + "line": 18, + "cfLine": 14, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerConst.json index a977056566..6d010ad9d0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerConst.json @@ -8,8 +8,8 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionObjectConstPropertyIntegerConst.TD.json", - "line": 22, - "cfLine": 25, + "line": 14, + "cfLine": 17, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotInteger.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotInteger.json index b589ddde9c..792624e8fa 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotInteger.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotInteger.json @@ -8,8 +8,8 @@ { "condition": "TypeMismatch", "filename": "SchemaDefinitionObjectConstPropertyIntegerNotInteger.TD.json", - "line": 25, - "cfLine": 21, + "line": 17, + "cfLine": 13, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.json index 04b7ef1196..d1973c4413 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.json @@ -8,8 +8,8 @@ { "condition": "TypeMismatch", "filename": "SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TD.json", - "line": 25, - "cfLine": 21, + "line": 17, + "cfLine": 13, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.json index 6ab54fa997..5b66a19b46 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.json @@ -8,8 +8,8 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TD.json", - "line": 22, - "cfLine": 25, + "line": 14, + "cfLine": 17, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNoType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNoType.json index 8b2747936e..f541f82685 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNoType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNoType.json @@ -8,8 +8,8 @@ { "condition": "PropertyMissing", "filename": "SchemaDefinitionObjectConstPropertyNoType.TD.json", - "line": 20, - "cfLine": 23, + "line": 12, + "cfLine": 15, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNoValue.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNoValue.json index eca042c1a6..5792fcf1b1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNoValue.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNoValue.json @@ -8,8 +8,8 @@ { "condition": "ItemNotFound", "filename": "SchemaDefinitionObjectConstPropertyNoValue.TD.json", - "line": 20, - "cfLine": 24, + "line": 12, + "cfLine": 16, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberAboveMax.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberAboveMax.json index 0e0a75a809..b9d89550d6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberAboveMax.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberAboveMax.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "SchemaDefinitionObjectConstPropertyNumberAboveMax.TD.json", - "line": 26, - "cfLine": 22, + "line": 18, + "cfLine": 14, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberBelowMin.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberBelowMin.json index df58b5e57b..96e4e8b2c4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberBelowMin.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberBelowMin.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "SchemaDefinitionObjectConstPropertyNumberBelowMin.TD.json", - "line": 26, - "cfLine": 22, + "line": 18, + "cfLine": 14, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberConst.json index 15470543f3..c038e779c6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberConst.json @@ -8,8 +8,8 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionObjectConstPropertyNumberConst.TD.json", - "line": 22, - "cfLine": 25, + "line": 14, + "cfLine": 17, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberNotNumeric.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberNotNumeric.json index 7761267489..1e38a79a24 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberNotNumeric.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberNotNumeric.json @@ -8,8 +8,8 @@ { "condition": "TypeMismatch", "filename": "SchemaDefinitionObjectConstPropertyNumberNotNumeric.TD.json", - "line": 25, - "cfLine": 21, + "line": 17, + "cfLine": 13, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.json index cb9627731f..1ec8163f20 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.json @@ -8,8 +8,8 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TD.json", - "line": 22, - "cfLine": 25, + "line": 14, + "cfLine": 17, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringConst.json index 2cb8700f21..cdb6e52a1a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringConst.json @@ -8,8 +8,8 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionObjectConstPropertyStringConst.TD.json", - "line": 22, - "cfLine": 25, + "line": 14, + "cfLine": 17, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.json index 105ac618ac..ab0e20de0f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.json @@ -8,8 +8,8 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TD.json", - "line": 22, - "cfLine": 25, + "line": 14, + "cfLine": 17, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringValueNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringValueNotString.json index cb4f4c785d..33b8c2e5e5 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringValueNotString.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringValueNotString.json @@ -8,8 +8,8 @@ { "condition": "TypeMismatch", "filename": "SchemaDefinitionObjectConstPropertyStringValueNotString.TD.json", - "line": 25, - "cfLine": 21, + "line": 17, + "cfLine": 13, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeArray.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeArray.json index b1f0255987..102d4670da 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeArray.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeArray.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "SchemaDefinitionObjectConstPropertyTypeArray.TD.json", - "line": 21, - "cfLine": 27, + "line": 13, + "cfLine": 19, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeNull.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeNull.json index 675cad51fb..e87adbdc7a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeNull.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeNull.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "SchemaDefinitionObjectConstPropertyTypeNull.TD.json", - "line": 21, - "cfLine": 24, + "line": 13, + "cfLine": 16, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeObject.json index eb86b22902..fd9f6a5168 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeObject.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeObject.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "SchemaDefinitionObjectConstPropertyTypeObject.TD.json", - "line": 21, - "cfLine": 29, + "line": 13, + "cfLine": 21, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeUnsupported.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeUnsupported.json index b7e8521861..93631fa8b6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeUnsupported.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeUnsupported.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "SchemaDefinitionObjectConstPropertyTypeUnsupported.TD.json", - "line": 21, - "cfLine": 24, + "line": 13, + "cfLine": 16, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstUnsupportedProperty.json index 8d1cda5b10..085dce9c98 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstUnsupportedProperty.json @@ -8,8 +8,8 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionObjectConstUnsupportedProperty.TD.json", - "line": 24, - "cfLine": 25, + "line": 16, + "cfLine": 17, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstValueNoSchema.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstValueNoSchema.json index e69be1eccb..f92b5a1245 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstValueNoSchema.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstValueNoSchema.json @@ -8,8 +8,8 @@ { "condition": "ItemNotFound", "filename": "SchemaDefinitionObjectConstValueNoSchema.TD.json", - "line": 22, - "cfLine": 19, + "line": 14, + "cfLine": 11, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessageNoProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessageNoProperty.json index 9334c2329a..e726f79f07 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessageNoProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessageNoProperty.json @@ -8,8 +8,8 @@ { "condition": "ItemNotFound", "filename": "SchemaDefinitionObjectErrorMessageNoProperty.TD.json", - "line": 21, - "cfLine": 19, + "line": 13, + "cfLine": 11, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessageNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessageNotString.json index 0473d40ac8..b8dc80e551 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessageNotString.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessageNotString.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "SchemaDefinitionObjectErrorMessageNotString.TD.json", - "line": 24, + "line": 16, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessagePropertyNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessagePropertyNotString.json index 2bd1693dff..59cc8e3dac 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessagePropertyNotString.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessagePropertyNotString.json @@ -8,8 +8,8 @@ { "condition": "TypeMismatch", "filename": "SchemaDefinitionObjectErrorMessagePropertyNotString.TD.json", - "line": 24, - "cfLine": 20, + "line": 16, + "cfLine": 12, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectNoDeterminant.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectNoDeterminant.json index 687426fa0b..c72f6d3826 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectNoDeterminant.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectNoDeterminant.json @@ -8,7 +8,7 @@ { "condition": "PropertyMissing", "filename": "SchemaDefinitionObjectNoDeterminant.TD.json", - "line": 17, + "line": 9, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertiesNotObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertiesNotObject.json index 1841dee809..4b62fdcf54 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertiesNotObject.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertiesNotObject.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "SchemaDefinitionObjectPropertiesNotObject.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyNoType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyNoType.json index 9953bd371e..09c0c03748 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyNoType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyNoType.json @@ -8,7 +8,7 @@ { "condition": "PropertyMissing", "filename": "SchemaDefinitionObjectPropertyNoType.TD.json", - "line": 20, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyObjectConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyObjectConst.json index c062008470..8c5fe85b3a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyObjectConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyObjectConst.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionObjectPropertyObjectConst.TD.json", - "line": 27, + "line": 19, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyRef.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyRef.json index 9f782c5737..60ee3c049f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyRef.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyRef.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionObjectPropertyRef.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyStringConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyStringConst.json index 74205b2fa0..b8052f953f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyStringConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyStringConst.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionObjectPropertyStringConst.TD.json", - "line": 22, + "line": 14, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeNotString.json index 795e30fbc5..178f6f809c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeNotString.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeNotString.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "SchemaDefinitionObjectPropertyTypeNotString.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeNull.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeNull.json index 5ee9031d1e..8bdd6656e3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeNull.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeNull.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "SchemaDefinitionObjectPropertyTypeNull.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeUnsupported.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeUnsupported.json index 581ab0009f..d9ab7042c9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeUnsupported.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeUnsupported.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "SchemaDefinitionObjectPropertyTypeUnsupported.TD.json", - "line": 21, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectRequiredNoProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectRequiredNoProperty.json index 703f1ee90d..80f0950d56 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectRequiredNoProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectRequiredNoProperty.json @@ -8,8 +8,8 @@ { "condition": "ItemNotFound", "filename": "SchemaDefinitionObjectRequiredNoProperty.TD.json", - "line": 21, - "cfLine": 19, + "line": 13, + "cfLine": 11, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectRequiredNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectRequiredNotString.json index cab2c153cd..8a1361252d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectRequiredNotString.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectRequiredNotString.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "SchemaDefinitionObjectRequiredNotString.TD.json", - "line": 24, + "line": 16, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionRef.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionRef.json index cee2c233cf..2f76daf8d9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionRef.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionRef.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionRef.TD.json", - "line": 18, + "line": 10, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstContentEncoding.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstContentEncoding.json index 8de7392776..f90f0ac8d3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstContentEncoding.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstContentEncoding.json @@ -8,8 +8,8 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionStringConstContentEncoding.TD.json", - "line": 20, - "cfLine": 19, + "line": 12, + "cfLine": 11, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstFormat.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstFormat.json index b79435602a..996040167e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstFormat.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstFormat.json @@ -8,8 +8,8 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionStringConstFormat.TD.json", - "line": 20, - "cfLine": 19, + "line": 12, + "cfLine": 11, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstPattern.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstPattern.json index 56791b7ee5..86e7ee49a9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstPattern.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstPattern.json @@ -8,8 +8,8 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionStringConstPattern.TD.json", - "line": 20, - "cfLine": 19, + "line": 12, + "cfLine": 11, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstUnsupportedProperty.json index a8852e3605..94e635a6b1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstUnsupportedProperty.json @@ -8,8 +8,8 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionStringConstUnsupportedProperty.TD.json", - "line": 20, - "cfLine": 19, + "line": 12, + "cfLine": 11, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstValueNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstValueNotString.json index 28fb05a1a4..c1d8f29557 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstValueNotString.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstValueNotString.json @@ -8,8 +8,8 @@ { "condition": "TypeMismatch", "filename": "SchemaDefinitionStringConstValueNotString.TD.json", - "line": 19, - "cfLine": 18, + "line": 11, + "cfLine": 10, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringContentEncodingNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringContentEncodingNotString.json index 77e676bd5e..94f1f22de2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringContentEncodingNotString.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringContentEncodingNotString.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "SchemaDefinitionStringContentEncodingNotString.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringContentEncodingUnsupportedValue.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringContentEncodingUnsupportedValue.json index 90d50a1aee..2c96ccfd20 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringContentEncodingUnsupportedValue.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringContentEncodingUnsupportedValue.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "SchemaDefinitionStringContentEncodingUnsupportedValue.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumConst.json index 1d3b8efc37..af8637f4e9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumConst.json @@ -8,8 +8,8 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionStringEnumConst.TD.json", - "line": 20, - "cfLine": 19, + "line": 12, + "cfLine": 11, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumContentEncoding.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumContentEncoding.json index 9a4a257727..f8ef7e835c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumContentEncoding.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumContentEncoding.json @@ -8,8 +8,8 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionStringEnumContentEncoding.TD.json", - "line": 20, - "cfLine": 19, + "line": 12, + "cfLine": 11, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumElementInvalid.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumElementInvalid.json index 1fd99bc46c..3a26039392 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumElementInvalid.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumElementInvalid.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "SchemaDefinitionStringEnumElementInvalid.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumFormat.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumFormat.json index d13a7c33ef..d51f32fe0a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumFormat.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumFormat.json @@ -8,8 +8,8 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionStringEnumFormat.TD.json", - "line": 20, - "cfLine": 19, + "line": 12, + "cfLine": 11, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumPattern.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumPattern.json index bf183a756a..7364369eb6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumPattern.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumPattern.json @@ -8,8 +8,8 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionStringEnumPattern.TD.json", - "line": 20, - "cfLine": 19, + "line": 12, + "cfLine": 11, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumReadOnly.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumReadOnly.json index 4e11cab18c..801a0bc22d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumReadOnly.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumReadOnly.json @@ -8,8 +8,8 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionStringEnumReadOnly.TD.json", - "line": 20, - "cfLine": 19, + "line": 12, + "cfLine": 11, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumUnsupportedProperty.json index ce000a6489..6fea7999fe 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumUnsupportedProperty.json @@ -8,8 +8,8 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionStringEnumUnsupportedProperty.TD.json", - "line": 20, - "cfLine": 19, + "line": 12, + "cfLine": 11, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatAndContentEncoding.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatAndContentEncoding.json index 02ab669ff0..19a10b7880 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatAndContentEncoding.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatAndContentEncoding.json @@ -8,7 +8,7 @@ { "condition": "ValuesInconsistent", "filename": "SchemaDefinitionStringFormatAndContentEncoding.TD.json", - "line": 17, + "line": 9, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatAndPattern.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatAndPattern.json index 6bc35673d2..6c8ead981f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatAndPattern.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatAndPattern.json @@ -8,7 +8,7 @@ { "condition": "ValuesInconsistent", "filename": "SchemaDefinitionStringFormatAndPattern.TD.json", - "line": 17, + "line": 9, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatNotString.json index ad3f04cbf9..a0a8cf297e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatNotString.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatNotString.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "SchemaDefinitionStringFormatNotString.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatUnsupportedValue.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatUnsupportedValue.json index 66bd1921e9..0f24b10a9f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatUnsupportedValue.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatUnsupportedValue.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "SchemaDefinitionStringFormatUnsupportedValue.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternAndContentEncoding.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternAndContentEncoding.json index 4461cac873..af5049c94a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternAndContentEncoding.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternAndContentEncoding.json @@ -8,7 +8,7 @@ { "condition": "ValuesInconsistent", "filename": "SchemaDefinitionStringPatternAndContentEncoding.TD.json", - "line": 17, + "line": 9, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternNotDurationOrDecimal.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternNotDurationOrDecimal.json index e8266d6eee..5cbdf9c93f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternNotDurationOrDecimal.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternNotDurationOrDecimal.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "SchemaDefinitionStringPatternNotDurationOrDecimal.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternNotString.json index 366554f372..33947ee560 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternNotString.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternNotString.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "SchemaDefinitionStringPatternNotString.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternRegexInvalid.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternRegexInvalid.json index 19cb53f801..6c9d8efcaa 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternRegexInvalid.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternRegexInvalid.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "SchemaDefinitionStringPatternRegexInvalid.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringReadOnly.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringReadOnly.json index f79784d282..0ac194d80f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringReadOnly.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringReadOnly.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionStringReadOnly.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringUnsupportedProperty.json index b85ab346cc..a3a2f1655d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringUnsupportedProperty.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "SchemaDefinitionStringUnsupportedProperty.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeNotString.json index 289fec49e7..5029c7c4c2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeNotString.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeNotString.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "SchemaDefinitionTypeNotString.TD.json", - "line": 18, + "line": 10, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeNull.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeNull.json index 54f8150092..da907224ec 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeNull.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeNull.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "SchemaDefinitionTypeNull.TD.json", - "line": 18, + "line": 10, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeUnsupported.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeUnsupported.json index ff170807e6..42c5be998c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeUnsupported.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeUnsupported.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "SchemaDefinitionTypeUnsupported.TD.json", - "line": 18, + "line": 10, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TrailingComma.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TrailingComma.json index 0c0cd7a4f4..ec43d49fef 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TrailingComma.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TrailingComma.json @@ -8,14 +8,14 @@ { "condition": "JsonInvalid", "filename": "TrailingComma.TD.json", - "line": 19, + "line": 11, "cfLine": 0, "crossRef": "" }, { "condition": "JsonInvalid", "filename": "TrailingComma.TD.json", - "line": 24, + "line": 16, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TypeEmpty.json similarity index 66% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdEmpty.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TypeEmpty.json index a26a571d3c..72183eeeb8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TypeEmpty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/IdEmpty.TD.json" ], + "thingFiles": [ "invalidThing/TypeEmpty.TD.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyEmpty", - "filename": "IdEmpty.TD.json", + "filename": "TypeEmpty.TD.json", "line": 6, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdInvalidCharacters.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TypeNotThingModel.json similarity index 61% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdInvalidCharacters.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TypeNotThingModel.json index 5720251775..376be4e1a0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/IdInvalidCharacters.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TypeNotThingModel.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/IdInvalidCharacters.TD.json" ], + "thingFiles": [ "invalidThing/TypeNotThingModel.TD.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "IdInvalidCharacters.TD.json", + "filename": "TypeNotThingModel.TD.json", "line": 6, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedArray.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedArray.json index 7c3815c838..5426462178 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedArray.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedArray.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "UnclosedArray.TD.json", - "line": 25, + "line": 17, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedObject.json index 508918db1e..30991134b1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedObject.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedObject.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "UnclosedObject.TD.json", - "line": 24, + "line": 16, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeEmpty.TD.json index 7e1a44d305..cb219bed99 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeEmpty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "string", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeText.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeText.TD.json index 158124ccc2..b8e721971b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeText.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeText.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "string", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoMatchingSchemaDefinition.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoMatchingSchemaDefinition.TD.json index 3b6a074c35..6ad18ec758 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoMatchingSchemaDefinition.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoMatchingSchemaDefinition.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "object", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchema.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchema.TD.json index aa036d0523..3c9398a049 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchema.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchema.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "object", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchemaDefinitions.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchemaDefinitions.TD.json index 82488efbc5..1cb7f45a9c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchemaDefinitions.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchemaDefinitions.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSuccess.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSuccess.TD.json index 7b71a6e8de..7b55b9d85d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSuccess.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSuccess.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "string", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionMap.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionMap.TD.json index aed295edc5..68471191c0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionMap.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionMap.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "string", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionNotObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionNotObject.TD.json index cb2aab2091..10b225792b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionNotObject.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionNotObject.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "string", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaEmpty.TD.json index 487cf3f8c7..f923f64eb2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaEmpty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "object", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSuccessTrue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSuccessTrue.TD.json index 178724fc4d..76669748d1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSuccessTrue.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSuccessTrue.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "string", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseUnsupportedProperty.TD.json index cb9c2936ff..2b1a5cb2e8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseUnsupportedProperty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "string", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponsesMultiple.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponsesMultiple.TD.json index 25f3fe0290..c4f0693f5c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponsesMultiple.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponsesMultiple.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "object", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormContentTypeText.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormContentTypeText.TD.json index 93ed2ef6b6..bfbdb998ec 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormContentTypeText.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormContentTypeText.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeEmpty.TD.json index a9f448c725..cfb9dad017 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeEmpty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoMatchingSchemaDefinition.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoMatchingSchemaDefinition.TD.json index 0f2f30cee9..a2b5567ad1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoMatchingSchemaDefinition.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoMatchingSchemaDefinition.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "string" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoSchemaDefinitions.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoSchemaDefinitions.TD.json index 9e0835bf23..0a2bc23e84 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoSchemaDefinitions.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoSchemaDefinitions.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeSchemaDefinitionNotEnum.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeSchemaDefinitionNotEnum.TD.json index 30153f1635..6345ebac1b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeSchemaDefinitionNotEnum.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeSchemaDefinitionNotEnum.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "string" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeEmpty.TD.json index 09a14add91..7a154928f9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeEmpty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "string", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeNotJson.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeNotJson.TD.json index ccac432754..e81841b56d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeNotJson.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeNotJson.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "string", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoContentType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoContentType.TD.json index b898bbf397..ed1391a43f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoContentType.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoContentType.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "string", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoMatchingSchemaDefinition.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoMatchingSchemaDefinition.TD.json index d2eca71dd6..1b4317b7c4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoMatchingSchemaDefinition.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoMatchingSchemaDefinition.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "object", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchema.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchema.TD.json index ebe0481e4b..666c9ca118 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchema.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchema.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "object", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchemaDefinitions.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchemaDefinitions.TD.json index b3221bb827..03b88691cd 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchemaDefinitions.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchemaDefinitions.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionMap.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionMap.TD.json index 525e2fed9c..d61e689fc0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionMap.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionMap.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "string", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionNotObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionNotObject.TD.json index cc2a886db3..0ac195964c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionNotObject.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionNotObject.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "string", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaEmpty.TD.json index 881f5c34b8..4d13b180fe 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaEmpty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "object", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSuccessTrue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSuccessTrue.TD.json index 4b52707d77..478337fb63 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSuccessTrue.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSuccessTrue.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "string", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoUnsupportedProperty.TD.json index 1f98b72b51..75f81ee902 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoUnsupportedProperty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "string", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfosMultiple.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfosMultiple.TD.json index 64011f241c..060979c404 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfosMultiple.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfosMultiple.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "object", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormOpInvokeDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormOpInvokeDuplicate.TD.json index 90d54c6c9d..ceceee832c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormOpInvokeDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormOpInvokeDuplicate.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormServiceGroupEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormServiceGroupEmpty.TD.json index 2dc743f868..ee1b62e344 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormServiceGroupEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormServiceGroupEmpty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicNoContentType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicNoContentType.TD.json index 2d4d47aba1..073c62859a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicNoContentType.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicNoContentType.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenAction.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenAction.TD.json index 027799421f..9f2f5875e6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenAction.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenAction.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenConsumerId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenConsumerId.TD.json index 7617fdcfae..0f7caa02c4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenConsumerId.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenConsumerId.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenMaintainerId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenMaintainerId.TD.json index 7c2d39287a..2c684a8744 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenMaintainerId.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenMaintainerId.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenSenderId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenSenderId.TD.json index 7ea54e00a3..73dfb29260 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenSenderId.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenSenderId.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormUnsupportedProperty.TD.json index 319d57adda..2b20404e08 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormUnsupportedProperty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsMultipleContentTypes.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsMultipleContentTypes.TD.json index 31a9294833..e6863fbf49 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsMultipleContentTypes.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsMultipleContentTypes.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOpInvokeDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOpInvokeDuplicate.TD.json index a2c5cf5f76..e4c789db2e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOpInvokeDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOpInvokeDuplicate.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessAndInvoke.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessAndInvoke.TD.json index 5ea439a45f..b95804542e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessAndInvoke.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessAndInvoke.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessDuplicate.TD.json index 6bc6f714dc..b41196475b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessDuplicate.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputMap.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputMap.TD.json index 81e7f9076b..49303f0743 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputMap.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputMap.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "poke": { "input": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNullAndContentTypeJson.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNullAndContentTypeJson.TD.json index e920f557e7..e683f7b272 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNullAndContentTypeJson.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNullAndContentTypeJson.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "poke": { "input": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNumber.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNumber.TD.json index 65dd67cb66..133334e184 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNumber.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNumber.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "poke": { "input": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeCustom.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeCustom.TD.json index 04a710a411..aed70a6ee6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeCustom.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeCustom.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "poke": { "input": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeRaw.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeRaw.TD.json index c3762ab91e..c2035f3828 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeRaw.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeRaw.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "poke": { "input": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectConst.TD.json index bb0f957f82..791a4b0e3a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectConst.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "poke": { "input": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectErrorMessage.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectErrorMessage.TD.json index b9cd7a91d4..6bd1deb7d2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectErrorMessage.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectErrorMessage.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "poke": { "input": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputString.TD.json index 39f71ea331..b917f3f34b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputString.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "poke": { "input": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionNoForms.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionNoForms.TD.json similarity index 60% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionNoForms.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionNoForms.TD.json index eb5970cc70..6b88915040 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionNoForms.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionNoForms.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionNoFormsWithTopic.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionNoFormsWithTopic.TD.json index 883fda8ea8..eaa09d9d1e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionNoFormsWithTopic.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionNoFormsWithTopic.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputMap.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputMap.TD.json index 6375aa30a5..b659f89510 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputMap.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputMap.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "peek": { "output": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNullAndContentTypeJson.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNullAndContentTypeJson.TD.json index b011a18f0b..2e34722044 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNullAndContentTypeJson.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNullAndContentTypeJson.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "peek": { "output": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNumber.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNumber.TD.json index 1d035aa02c..f4a604691f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNumber.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNumber.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "peek": { "output": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeCustom.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeCustom.TD.json index 542df8ede0..40ae554d12 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeCustom.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeCustom.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "peek": { "output": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeRaw.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeRaw.TD.json index 36dba60935..93fd4dac66 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeRaw.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeRaw.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "peek": { "output": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectConst.TD.json index 76d9d3cbb3..ad2d5996b4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectConst.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "peek": { "output": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectErrorMessage.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectErrorMessage.TD.json index 2ae7d85af2..1a3d13aa6e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectErrorMessage.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectErrorMessage.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "peek": { "output": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputString.TD.json index 79ef15d295..9444a3fb70 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputString.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "peek": { "output": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionUnsupportedProperty.TD.json index e46cfcc14b..1203b7f633 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionUnsupportedProperty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongPrefix.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongPrefix.TD.json index 191e96e3ba..8db2bdac1b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongPrefix.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongPrefix.TD.json @@ -3,23 +3,15 @@ "https://www.w3.org/2022/wot/td/v1.1", { "foo": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongUri.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongUri.TD.json index d8628eda3d..f5e64b29d0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongUri.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongUri.TD.json @@ -3,23 +3,15 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/SomethingcElse/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextMissingDtv.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextMissingDtv.TD.json index 50a41cd542..31906adc44 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextMissingDtv.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextMissingDtv.TD.json @@ -1,22 +1,14 @@ { "@context": "https://www.w3.org/2022/wot/td/v1.1", - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventBooleanConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventBooleanConst.TD.json index 5d52b938ac..7623c33f7f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventBooleanConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventBooleanConst.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", - "dtv:topic": "sample/alert/{modelId}", + "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormAdditionalResponses.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormAdditionalResponses.TD.json index 515184ed7b..914d776580 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormAdditionalResponses.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormAdditionalResponses.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Error": { "type": "object", @@ -36,7 +28,7 @@ { "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", - "dtv:topic": "sample/alert/{modelId}", + "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent", "additionalResponses": [ { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormContentTypeText.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormContentTypeText.TD.json index b3682059e5..da43620f0b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormContentTypeText.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormContentTypeText.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/text", - "dtv:topic": "sample/alert/{modelId}", + "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderCode.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderCode.TD.json index d3c5a03579..f14d2da003 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderCode.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderCode.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Status": { "type": "string", @@ -35,7 +27,7 @@ { "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", - "dtv:topic": "sample/alert/{modelId}", + "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent", "dtv:headerCode": "Status" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderInfo.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderInfo.TD.json index e14f458d3a..af5003c3e5 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderInfo.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderInfo.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Error": { "type": "object", @@ -36,7 +28,7 @@ { "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", - "dtv:topic": "sample/alert/{modelId}", + "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent", "dtv:headerInfo": [ { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormOpSubDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormOpSubDuplicate.TD.json index b8781d792e..91ceb78354 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormOpSubDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormOpSubDuplicate.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", - "dtv:topic": "sample/alert/{modelId}", + "dtv:topic": "sample/alert/TestThing", "op": [ "subscribeevent", "subscribeevent" ] } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormServiceGroupEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormServiceGroupEmpty.TD.json index 3e0c5889f6..bde4fdf125 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormServiceGroupEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormServiceGroupEmpty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", - "dtv:topic": "sample/alert/{modelId}", + "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent", "dtv:serviceGroupId": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicNoContentType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicNoContentType.TD.json index cbfbe52f39..7f67694745 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicNoContentType.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicNoContentType.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { @@ -25,7 +17,7 @@ "forms": [ { "href": "dtmi:test:ProtocolCompiler:alert;1", - "dtv:topic": "sample/alert/{modelId}", + "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenAction.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenAction.TD.json index 1f26933b96..1c6b8e7c64 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenAction.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenAction.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenConsumerId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenConsumerId.TD.json index ecac7fa5d0..33602b080e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenConsumerId.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenConsumerId.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenExecutorId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenExecutorId.TD.json index cdfee2f420..a10f10e5c8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenExecutorId.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenExecutorId.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenInvokerId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenInvokerId.TD.json index 19094dc0b7..69ff121c30 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenInvokerId.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenInvokerId.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenMaintainerId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenMaintainerId.TD.json index 85c452ccf0..7921153124 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenMaintainerId.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenMaintainerId.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormUnsupportedProperty.TD.json index 361f1fd5cb..811461a8b7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormUnsupportedProperty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", - "dtv:topic": "sample/alert/{modelId}", + "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent", "foobar": "hello" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOpSubDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOpSubDuplicate.TD.json index 5ddde71b93..5d780a22bd 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOpSubDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOpSubDuplicate.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { @@ -26,13 +18,13 @@ { "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", - "dtv:topic": "sample/alert/{modelId}", + "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" }, { "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", - "dtv:topic": "sample/alert/{modelId}", + "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessAndSub.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessAndSub.TD.json index f648f16160..48e8c9fe8b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessAndSub.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessAndSub.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { @@ -26,13 +18,13 @@ { "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", - "dtv:topic": "sample/alert/{modelId}", + "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" }, { "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", - "dtv:topic": "sample/alert/{modelId}" + "dtv:topic": "sample/alert/TestThing" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessDuplicate.TD.json index ceb39e9226..053e407fb3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessDuplicate.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { @@ -26,12 +18,12 @@ { "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", - "dtv:topic": "sample/alert/{modelId}" + "dtv:topic": "sample/alert/TestThing" }, { "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", - "dtv:topic": "sample/alert/{modelId}" + "dtv:topic": "sample/alert/TestThing" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventIntegerConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventIntegerConst.TD.json index 53a1f47a1b..042efeea59 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventIntegerConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventIntegerConst.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", - "dtv:topic": "sample/alert/{modelId}", + "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventNoForms.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNoForms.TD.json similarity index 65% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventNoForms.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNoForms.TD.json index 96364a254e..9ca8d6c459 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventNoForms.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNoForms.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNoFormsWithTopicAndNoRootFormSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNoFormsWithTopicAndNoRootFormSubAll.TD.json index ced4dd76cd..6ba13db952 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNoFormsWithTopicAndNoRootFormSubAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNoFormsWithTopicAndNoRootFormSubAll.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNullAndContentTypeJson.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNullAndContentTypeJson.TD.json index 5910d6f828..98af18d1c0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNullAndContentTypeJson.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNullAndContentTypeJson.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", - "dtv:topic": "sample/alert/{modelId}", + "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNumberConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNumberConst.TD.json index 629f0ef451..6d0406e829 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNumberConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNumberConst.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", - "dtv:topic": "sample/alert/{modelId}", + "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeCustom.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeCustom.TD.json index 3aed48a1ab..596e7e0fa5 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeCustom.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeCustom.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { @@ -31,7 +23,7 @@ { "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "", - "dtv:topic": "sample/alert/{modelId}", + "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeRaw.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeRaw.TD.json index 16da45ec28..37d92542a3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeRaw.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeRaw.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { @@ -31,7 +23,7 @@ { "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/octet-stream", - "dtv:topic": "sample/alert/{modelId}", + "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectConst.TD.json index f97c6968f1..c59d634dcd 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectConst.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { @@ -34,7 +26,7 @@ { "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", - "dtv:topic": "sample/alert/{modelId}", + "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectErrorMessage.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectErrorMessage.TD.json index 3e67b20e43..80ce993144 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectErrorMessage.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectErrorMessage.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { @@ -32,7 +24,7 @@ { "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", - "dtv:topic": "sample/alert/{modelId}", + "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventStringConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventStringConst.TD.json index 81b115bbe7..3752f7304c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventStringConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventStringConst.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", - "dtv:topic": "sample/alert/{modelId}", + "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventUnsupportedProperty.TD.json index a45138eec9..afe589f788 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventUnsupportedProperty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", - "dtv:topic": "sample/alert/{modelId}", + "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" } ], diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/IdInvalidCharacters.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/IdInvalidCharacters.TD.json deleted file mode 100644 index 709815be80..0000000000 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/IdInvalidCharacters.TD.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "@context": [ - "https://www.w3.org/2022/wot/td/v1.1", - { "dtv": "http://azure.com/DigitalTwins/dtmi#" } - ], - "id": "Not a legal ID", - "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], - "actions": { - "noop": { - "forms": [ - { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", - "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", - "op": "invokeaction" - } - ] - } - }, - "properties": { - }, - "events": { - } -} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/IdInvalidReplacementForTokenInTopic.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/IdInvalidReplacementForTokenInTopic.TD.json deleted file mode 100644 index 50410d59a6..0000000000 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/IdInvalidReplacementForTokenInTopic.TD.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "@context": [ - "https://www.w3.org/2022/wot/td/v1.1", - { "dtv": "http://azure.com/DigitalTwins/dtmi#" } - ], - "id": "foo://bar", - "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], - "actions": { - "noop": { - "forms": [ - { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", - "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", - "op": "invokeaction" - } - ] - } - }, - "properties": { - }, - "events": { - } -} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyHref.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyHref.TD.json index 9ebc6721be..c320494842 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyHref.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyHref.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "links": [ { "rel": "service-desc", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyType.TD.json index 32de5b0dec..eeb063c121 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyType.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyType.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "links": [ { "rel": "service-desc", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoHref.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoHref.TD.json index ea1b339cee..9979547574 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoHref.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoHref.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "links": [ { "rel": "service-desc", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoType.TD.json index d97331fa78..d864a82b30 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoType.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoType.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "links": [ { "rel": "service-desc", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonJsonFile.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonJsonFile.TD.json index 2aa66d85f2..afed878392 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonJsonFile.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonJsonFile.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "links": [ { "rel": "service-desc", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonexistentFile.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonexistentFile.TD.json index c95420ba73..ee8bf18dc0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonexistentFile.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonexistentFile.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "links": [ { "rel": "service-desc", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkTypeNotJson.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkTypeNotJson.TD.json index 2bf1e63e2e..9ed73b4aab 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkTypeNotJson.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkTypeNotJson.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "links": [ { "rel": "service-desc", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkUnsupportedProperty.TD.json index 905e1f9df0..8ff4d466b4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkUnsupportedProperty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "links": [ { "rel": "service-desc", @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/MultipleLinks.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/MultipleLinks.TD.json index b4941ec4f7..810728bcd3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/MultipleLinks.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/MultipleLinks.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "links": [ { "rel": "service-desc", @@ -31,7 +23,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoTitle.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/NoTitle.TD.json similarity index 66% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoTitle.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/NoTitle.TD.json index 7fcf9eeaae..f1165c6aee 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoTitle.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/NoTitle.TD.json @@ -3,22 +3,14 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], + "@type": "tm:ThingModel", "actions": { "noop": { "forms": [ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyBooleanConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyBooleanConst.TD.json index 0d77846f17..d9fb4308c0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyBooleanConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyBooleanConst.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeEmpty.TD.json index 67d963c929..633f205df2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeEmpty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "string", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeText.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeText.TD.json index 734a5d422e..061df0294f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeText.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeText.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "string", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TD.json index 2be18dc68c..4d2692e9a6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "object", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchema.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchema.TD.json index 740f5c4dd7..0b6123c3b6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchema.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchema.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "object", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchemaDefinitions.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchemaDefinitions.TD.json index 47e93c039d..bb6cee48ec 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchemaDefinitions.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchemaDefinitions.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSuccess.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSuccess.TD.json index 37ef5a7e7e..faf9b9ad6b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSuccess.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSuccess.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "string", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionMap.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionMap.TD.json index 74a1018480..8e501630d6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionMap.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionMap.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "string", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionNotObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionNotObject.TD.json index 868d306290..72d2c94ffc 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionNotObject.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionNotObject.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "string", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaEmpty.TD.json index d7075ff271..cac49e2667 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaEmpty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "object", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSuccessTrue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSuccessTrue.TD.json index 17f4f16823..7bcafec5bf 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSuccessTrue.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSuccessTrue.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "string", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseUnsupportedProperty.TD.json index 7cddad7be3..a52e15647a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseUnsupportedProperty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "string", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponsesMultiple.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponsesMultiple.TD.json index 94aa1836b4..1745cf2cc3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponsesMultiple.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponsesMultiple.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Condition": { "type": "object", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormContentTypeText.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormContentTypeText.TD.json index 797c47675d..8258bcc8ea 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormContentTypeText.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormContentTypeText.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderCode.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderCode.TD.json index b716c84271..85d34bf5a3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderCode.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderCode.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Status": { "type": "string", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderInfo.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderInfo.TD.json index 6f9e700e88..eb1b5ca3c5 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderInfo.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderInfo.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Error": { "type": "object", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpReadDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpReadDuplicate.TD.json index a904e3c8db..1f22137fd0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpReadDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpReadDuplicate.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpWriteDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpWriteDuplicate.TD.json index 8a0d391e53..5374ec68ed 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpWriteDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpWriteDuplicate.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json index 927370f47d..a7e4377cb3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Error": { "type": "object", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TD.json index 7d2d562b53..36808520ae 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json index cc8c3aa3da..498effcc8f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Error": { "type": "object", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicAndNoRootFormReadAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicAndNoRootFormReadAll.TD.json index f699a5699a..597e0fed5a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicAndNoRootFormReadAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicAndNoRootFormReadAll.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TD.json index 2202c2264b..a4848b8a40 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormServiceGroup.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormServiceGroup.TD.json index b82dc7e7cb..b6eaf29550 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormServiceGroup.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormServiceGroup.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicNoContentType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicNoContentType.TD.json index 1e2520fdd3..42af0c115e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicNoContentType.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicNoContentType.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenExecutorId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenExecutorId.TD.json index d42a5fea5d..0519e4b056 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenExecutorId.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenExecutorId.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenInvokerId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenInvokerId.TD.json index dfe84a3629..bc70bdde1b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenInvokerId.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenInvokerId.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TD.json index 650c8e7b8c..872874233c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TD.json index 461f1f29b6..729d2a3d35 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenReadAndWrite.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenReadAndWrite.TD.json index 350f55b557..25f35dd2a4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenReadAndWrite.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenReadAndWrite.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenSenderId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenSenderId.TD.json index e3714e9b48..ee34c3a325 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenSenderId.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenSenderId.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormUnsupportedProperty.TD.json index 1ca037fece..bcc2b620aa 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormUnsupportedProperty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TD.json index b1e5c39077..1f67dd49b6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Error": { "type": "object", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TD.json index 5432756a10..1b88a24811 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpReadDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpReadDuplicate.TD.json index e355baaf28..5cddc2a5e8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpReadDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpReadDuplicate.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteDuplicate.TD.json index a34e9b0657..49ffb83b10 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteDuplicate.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteNoRead.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteNoRead.TD.json index 7370a66371..b485fe99b7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteNoRead.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteNoRead.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessAndRead.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessAndRead.TD.json index 0b23771a5e..69219a84a5 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessAndRead.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessAndRead.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessDuplicate.TD.json index 2b24da0db9..81fa5f4ed1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessDuplicate.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyIntegerConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyIntegerConst.TD.json index 436f85aa25..03c64a8cac 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyIntegerConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyIntegerConst.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyNoForms.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyNoForms.TD.json similarity index 62% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyNoForms.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyNoForms.TD.json index d76ae24929..db2aef10f9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyNoForms.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyNoForms.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyNumberConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyNumberConst.TD.json index 525fd49b6a..47ac2b9d2f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyNumberConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyNumberConst.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectConst.TD.json index 9490c4758f..9ea45307d7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectConst.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectErrorMessage.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectErrorMessage.TD.json index 41b02868df..46fc513a33 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectErrorMessage.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectErrorMessage.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyStringConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyStringConst.TD.json index 70d3636d91..29dfe7cf52 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyStringConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyStringConst.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyTypeNull.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyTypeNull.TD.json index 68e83e5c81..9bf32d60b7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyTypeNull.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyTypeNull.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyUnsupportedProperty.TD.json index 0ac8326a7a..8640d41f88 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyUnsupportedProperty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeEmpty.TD.json index 54e1dc32c5..af71b8f5eb 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeEmpty.TD.json @@ -3,20 +3,12 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:read;1", - "dtv:topic": "sample/{modelId}/read", + "dtv:topic": "sample/TestThing/read", "contentType": "application/json", "additionalResponses": [ { @@ -33,7 +25,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeText.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeText.TD.json index 43248284a6..a726856b0d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeText.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeText.TD.json @@ -3,20 +3,12 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:read;1", - "dtv:topic": "sample/{modelId}/read", + "dtv:topic": "sample/TestThing/read", "contentType": "application/json", "additionalResponses": [ { @@ -33,7 +25,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseNoSuccess.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseNoSuccess.TD.json index 67bdb3582e..802c118d7d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseNoSuccess.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseNoSuccess.TD.json @@ -3,20 +3,12 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:read;1", - "dtv:topic": "sample/{modelId}/read", + "dtv:topic": "sample/TestThing/read", "contentType": "application/json", "additionalResponses": [ { @@ -32,7 +24,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSchema.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSchema.TD.json index 6a1b316934..43534824a3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSchema.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSchema.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "myResponse": { "type": "string" @@ -21,7 +13,7 @@ "forms": [ { "href": "dtmi:test:ProtocolCompiler:read;1", - "dtv:topic": "sample/{modelId}/read", + "dtv:topic": "sample/TestThing/read", "contentType": "application/json", "additionalResponses": [ { @@ -39,7 +31,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSuccessTrue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSuccessTrue.TD.json index 67f124303d..2b4d1a7fce 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSuccessTrue.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSuccessTrue.TD.json @@ -3,20 +3,12 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:read;1", - "dtv:topic": "sample/{modelId}/read", + "dtv:topic": "sample/TestThing/read", "contentType": "application/json", "additionalResponses": [ { @@ -33,7 +25,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseUnsupportedProperty.TD.json index 1b27e5d834..e56f291b9a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseUnsupportedProperty.TD.json @@ -3,20 +3,12 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:read;1", - "dtv:topic": "sample/{modelId}/read", + "dtv:topic": "sample/TestThing/read", "contentType": "application/json", "additionalResponses": [ { @@ -34,7 +26,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesAndSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesAndSubAll.TD.json index 52d2bef37f..ca417be4df 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesAndSubAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesAndSubAll.TD.json @@ -3,20 +3,12 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", - "dtv:topic": "sample/{modelId}/events", + "dtv:topic": "sample/TestThing/events", "contentType": "application/json", "additionalResponses": [ { @@ -32,7 +24,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesMultiple.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesMultiple.TD.json index f0783542ea..146f1db6d2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesMultiple.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesMultiple.TD.json @@ -3,20 +3,12 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:read;1", - "dtv:topic": "sample/{modelId}/read", + "dtv:topic": "sample/TestThing/read", "contentType": "application/json", "additionalResponses": [ { @@ -37,7 +29,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeCustom.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeCustom.TD.json index c8625ef7ce..a52b68822f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeCustom.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeCustom.TD.json @@ -3,20 +3,12 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", - "dtv:topic": "sample/{modelId}/events", + "dtv:topic": "sample/TestThing/events", "contentType": "", "op": [ "subscribeallevents" ] } @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeRaw.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeRaw.TD.json index b789f9bc13..b4cc7a73a8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeRaw.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeRaw.TD.json @@ -3,20 +3,12 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", - "dtv:topic": "sample/{modelId}/events", + "dtv:topic": "sample/TestThing/events", "contentType": "application/octet-stream", "op": [ "subscribeallevents" ] } @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeText.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeText.TD.json index f2a5b9a7c8..6462eee0d8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeText.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeText.TD.json @@ -3,20 +3,12 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", - "dtv:topic": "sample/{modelId}/events", + "dtv:topic": "sample/TestThing/events", "contentType": "application/text", "op": [ "subscribeallevents" ] } @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderCode.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderCode.TD.json index b41f681216..40fa6dc8ec 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderCode.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderCode.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "myHeader": { "type": "string", @@ -25,7 +17,7 @@ "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", - "dtv:topic": "sample/{modelId}/events", + "dtv:topic": "sample/TestThing/events", "contentType": "application/json", "dtv:headerCode": "myHeader", "op": [ "subscribeallevents" ] @@ -37,7 +29,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderInfo.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderInfo.TD.json index 7e856fe49b..9a3fc9267d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderInfo.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderInfo.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "myHeader": { "type": "string", @@ -25,7 +17,7 @@ "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", - "dtv:topic": "sample/{modelId}/events", + "dtv:topic": "sample/TestThing/events", "contentType": "application/json", "dtv:headerInfo": [ { @@ -42,7 +34,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoContentType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoContentType.TD.json index 80c5c25b13..887cd4e157 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoContentType.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoContentType.TD.json @@ -3,20 +3,12 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", - "dtv:topic": "sample/{modelId}/events", + "dtv:topic": "sample/TestThing/events", "op": [ "subscribeallevents" ] } ], @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoTopic.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoTopic.TD.json index 17d761e3ea..c98d324085 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoTopic.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoTopic.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllAndSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllAndSubAll.TD.json index 658b6696d9..26c9a30bbf 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllAndSubAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllAndSubAll.TD.json @@ -3,20 +3,12 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", - "dtv:topic": "sample/{modelId}/events", + "dtv:topic": "sample/TestThing/events", "contentType": "application/json", "op": [ "readallproperties", "subscribeallevents" ] } @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllDuplicate.TD.json index 6d494de900..d233cb0a5b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllDuplicate.TD.json @@ -3,20 +3,12 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", - "dtv:topic": "sample/{modelId}/events", + "dtv:topic": "sample/TestThing/events", "contentType": "application/json", "op": [ "readallproperties", "readallproperties" ] } @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpSubAllDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpSubAllDuplicate.TD.json index 4e2d372052..3f7f2a021e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpSubAllDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpSubAllDuplicate.TD.json @@ -3,20 +3,12 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", - "dtv:topic": "sample/{modelId}/events", + "dtv:topic": "sample/TestThing/events", "contentType": "application/json", "op": [ "subscribeallevents", "subscribeallevents" ] } @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWiteMultiAndSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWiteMultiAndSubAll.TD.json index c7c75e1591..9511f2785d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWiteMultiAndSubAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWiteMultiAndSubAll.TD.json @@ -3,20 +3,12 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", - "dtv:topic": "sample/{modelId}/events", + "dtv:topic": "sample/TestThing/events", "contentType": "application/json", "op": [ "writemultipleproperties", "subscribeallevents" ] } @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWriteMultiDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWriteMultiDuplicate.TD.json index 2ab70de8a7..4a864ada46 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWriteMultiDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWriteMultiDuplicate.TD.json @@ -3,20 +3,12 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", - "dtv:topic": "sample/{modelId}/events", + "dtv:topic": "sample/TestThing/events", "contentType": "application/json", "op": [ "writemultipleproperties", "writemultipleproperties" ] } @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormReadAllButNoProperties.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormReadAllButNoProperties.TD.json index ff82912ac1..38f1fb9e8c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormReadAllButNoProperties.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormReadAllButNoProperties.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupEmpty.TD.json index fbb5e2b8fb..4c8080255e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupEmpty.TD.json @@ -3,20 +3,12 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:event;1", - "dtv:topic": "sample/{modelId}/events", + "dtv:topic": "sample/TestThing/events", "contentType": "application/json", "dtv:serviceGroupId": "", "op": [ "subscribeallevents" ] @@ -28,7 +20,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupNoSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupNoSubAll.TD.json index 5e061e0077..b4c0ba2425 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupNoSubAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupNoSubAll.TD.json @@ -3,20 +3,12 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:read;1", - "dtv:topic": "sample/{modelId}/read", + "dtv:topic": "sample/TestThing/read", "contentType": "application/json", "dtv:serviceGroupId": "MyGroup", "op": [ "readallproperties" ] @@ -28,7 +20,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormSubAllButNoEvents.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormSubAllButNoEvents.TD.json index ab95d0ec8d..62b3f96b22 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormSubAllButNoEvents.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormSubAllButNoEvents.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicEmpty.TD.json index d7e70b36c1..cabaaf514b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicEmpty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelEmpty.TD.json index cc836a4eca..a1302589c7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelEmpty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelInvalid.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelInvalid.TD.json index e42709f39d..ffd60b1d5f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelInvalid.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelInvalid.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicReservedStart.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicReservedStart.TD.json index 803443df19..9ab9929c51 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicReservedStart.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicReservedStart.TD.json @@ -3,20 +3,12 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", - "dtv:topic": "$sample/{modelId}/events", + "dtv:topic": "$sample/TestThing/events", "contentType": "application/json", "op": [ "subscribeallevents" ] } @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenActionWhenSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenActionWhenSubAll.TD.json index ca1a8b904d..e41dfcb65b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenActionWhenSubAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenActionWhenSubAll.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenConsumerIdWhenSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenConsumerIdWhenSubAll.TD.json index a968e7e702..5f77fac807 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenConsumerIdWhenSubAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenConsumerIdWhenSubAll.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomEmpty.TD.json index f72c51e6cc..3b6d92b80b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomEmpty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomInvalid.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomInvalid.TD.json index 8e16a9b622..55843ea893 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomInvalid.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomInvalid.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenEmpty.TD.json index d99b38dbbc..2a0fe53920 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenEmpty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenExecutorId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenExecutorId.TD.json index 64488adff8..5d1f7ed98d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenExecutorId.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenExecutorId.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenInvokerId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenInvokerId.TD.json index 675b93eb38..a8ec4f81de 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenInvokerId.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenInvokerId.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenMaintainerIdWhenSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenMaintainerIdWhenSubAll.TD.json index 472b61c8ec..4d6cd43ca1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenMaintainerIdWhenSubAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenMaintainerIdWhenSubAll.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TD.json index e3a4c9b99c..264cccd41d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TD.json @@ -3,20 +3,12 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", - "dtv:topic": "sample/{modelId}/events", + "dtv:topic": "sample/TestThing/events", "contentType": "application/json", "op": [ "readallproperties", "writemultipleproperties" ] } @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenReadAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenReadAll.TD.json index 7fca6067c4..bef5484391 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenReadAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenReadAll.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenWriteMulti.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenWriteMulti.TD.json index 04484d6b98..54dc4b3fb9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenWriteMulti.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenWriteMulti.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenUnrecognized.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenUnrecognized.TD.json index 81c3c35a23..814acff0db 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenUnrecognized.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenUnrecognized.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormWriteMultiButNoWritableProperties.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormWriteMultiButNoWritableProperties.TD.json index f6f913bf83..0aa0216845 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormWriteMultiButNoWritableProperties.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormWriteMultiButNoWritableProperties.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpReadAllDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpReadAllDuplicate.TD.json index 1a34bf50ea..63bc36caa5 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpReadAllDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpReadAllDuplicate.TD.json @@ -3,20 +3,12 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", - "dtv:topic": "sample/{modelId}/read", + "dtv:topic": "sample/TestThing/read", "contentType": "application/json", "op": "readallproperties" }, @@ -33,7 +25,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpSubAllDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpSubAllDuplicate.TD.json index e90e93c17b..e16167591c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpSubAllDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpSubAllDuplicate.TD.json @@ -3,20 +3,12 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", - "dtv:topic": "sample/{modelId}/events", + "dtv:topic": "sample/TestThing/events", "contentType": "application/json", "op": "subscribeallevents" }, @@ -33,7 +25,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiDuplicate.TD.json index cd5aa06a80..b6475ba3e5 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiDuplicate.TD.json @@ -3,20 +3,12 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", - "dtv:topic": "sample/{modelId}/write", + "dtv:topic": "sample/TestThing/write", "contentType": "application/json", "op": "writemultipleproperties" }, @@ -33,7 +25,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiNoReadAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiNoReadAll.TD.json index e55acc3860..f362e239e0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiNoReadAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiNoReadAll.TD.json @@ -3,20 +3,12 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", - "dtv:topic": "sample/{modelId}/write", + "dtv:topic": "sample/TestThing/write", "contentType": "application/json", "op": "writemultipleproperties" } @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayConst.TD.json index 570214e8c3..cebc2e86d8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayConst.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "array", @@ -28,7 +20,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsNoType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsNoType.TD.json index 60ae18ce20..48a3ddae17 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsNoType.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsNoType.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "array", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsObjectConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsObjectConst.TD.json index dd64e73145..cb39c784f2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsObjectConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsObjectConst.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "array", @@ -35,7 +27,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsRef.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsRef.TD.json index f6ce3a349e..cd3546c42e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsRef.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsRef.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "array", @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsStringConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsStringConst.TD.json index 482e07e14d..e5367e5eb0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsStringConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsStringConst.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "array", @@ -28,7 +20,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsTypeNull.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsTypeNull.TD.json index 93ce98455d..5127b23cc9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsTypeNull.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsTypeNull.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "array", @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayNoItems.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayNoItems.TD.json index 04f212bc25..964d27fdd9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayNoItems.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayNoItems.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "array" @@ -24,7 +16,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanConstValueNotBoolean.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanConstValueNotBoolean.TD.json index 2271555737..da527fc643 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanConstValueNotBoolean.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanConstValueNotBoolean.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "boolean", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanReadOnly.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanReadOnly.TD.json index dab42e0ea7..23cbcd81c6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanReadOnly.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanReadOnly.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "boolean", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanUnsupportedProperty.TD.json index 98f168c409..f43063cda8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanUnsupportedProperty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "boolean", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueAboveMax.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueAboveMax.TD.json index c7d5629cfa..f349526c93 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueAboveMax.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueAboveMax.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "integer", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueBelowMin.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueBelowMin.TD.json index 567b18bc52..b148dcccbe 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueBelowMin.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueBelowMin.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "integer", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotInteger.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotInteger.TD.json index be564020c4..691e3119ad 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotInteger.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotInteger.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "integer", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotNumeric.TD.json index 0efee1655c..2d3ebde2fa 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotNumeric.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotNumeric.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "integer", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMaxNotInteger.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMaxNotInteger.TD.json index da49906b5b..4b75fd3fca 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMaxNotInteger.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMaxNotInteger.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "integer", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinAboveMax.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinAboveMax.TD.json index 1707d5dc6f..7c67de901c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinAboveMax.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinAboveMax.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "integer", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinNotInteger.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinNotInteger.TD.json index 111f97cb20..a8eaae5c76 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinNotInteger.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinNotInteger.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "integer", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerReadOnly.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerReadOnly.TD.json index 15dbc102ba..dac3c47f49 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerReadOnly.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerReadOnly.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "integer", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerUnsupportedProperty.TD.json index 9da76e2bdb..976eee564b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerUnsupportedProperty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "integer", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesNoType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesNoType.TD.json index 88ecd35af0..02552940ed 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesNoType.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesNoType.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesObjectConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesObjectConst.TD.json index bc5f0da35f..d632071d7e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesObjectConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesObjectConst.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -35,7 +27,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TD.json index e9bf3e6df0..6429f0603d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesStringConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesStringConst.TD.json index 0074a17903..fc43f4678a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesStringConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesStringConst.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -28,7 +20,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesTypeNull.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesTypeNull.TD.json index 5ced60d75e..13870c5031 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesTypeNull.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesTypeNull.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapConst.TD.json index 7fec047c36..501bebc620 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapConst.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -30,7 +22,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNoType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNoType.TD.json index 8323c28666..f702667045 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNoType.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNoType.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { } @@ -23,7 +15,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueAboveMax.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueAboveMax.TD.json index 01530955cc..1105eba76e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueAboveMax.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueAboveMax.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "number", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueBelowMin.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueBelowMin.TD.json index 9ece109e24..3d46dc7af7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueBelowMin.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueBelowMin.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "number", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueNotNumeric.TD.json index c507b0cebd..ba3b8d4060 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueNotNumeric.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueNotNumeric.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "number", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberMinAboveMax.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberMinAboveMax.TD.json index fd50f1a324..88b4f60ea7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberMinAboveMax.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberMinAboveMax.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "number", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberReadOnly.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberReadOnly.TD.json index 9cdfce15b6..c0e0e7f4c7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberReadOnly.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberReadOnly.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "number", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberUnsupportedProperty.TD.json index 4bbfa184d2..efac35c02d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberUnsupportedProperty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "number", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectBothDeterminants.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectBothDeterminants.TD.json index b2ec0bb55a..b146dd5844 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectBothDeterminants.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectBothDeterminants.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -32,7 +24,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstNotObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstNotObject.TD.json index fff847ddf6..422774891e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstNotObject.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstNotObject.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -30,7 +22,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanConst.TD.json index fe5114913e..c329c3f6bc 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanConst.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -33,7 +25,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TD.json index 74157ed11f..8ef92c53a9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -32,7 +24,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TD.json index 5122f0c7fb..7260500528 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -33,7 +25,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerAboveMax.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerAboveMax.TD.json index b1e2b0f70f..76cd2a3bea 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerAboveMax.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerAboveMax.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -33,7 +25,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerBelowMin.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerBelowMin.TD.json index d93658e3f3..a9969d24d1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerBelowMin.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerBelowMin.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -33,7 +25,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerConst.TD.json index 94b728ef5e..773969c3de 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerConst.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -33,7 +25,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotInteger.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotInteger.TD.json index de148a9098..b5bc8fa105 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotInteger.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotInteger.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -32,7 +24,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TD.json index 60da0a66b8..f1b0c4cc69 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -32,7 +24,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TD.json index ba0cfde7a1..f29be9e4ec 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -33,7 +25,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoType.TD.json index 86e24a8f57..316cc87185 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoType.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoType.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -31,7 +23,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoValue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoValue.TD.json index f16f24b8a7..d4ce71c92e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoValue.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoValue.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -31,7 +23,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberAboveMax.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberAboveMax.TD.json index 7d82dce887..3146e61f38 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberAboveMax.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberAboveMax.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -33,7 +25,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberBelowMin.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberBelowMin.TD.json index 9ac875f783..419992037a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberBelowMin.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberBelowMin.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -33,7 +25,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberConst.TD.json index 13cfed2571..684df9ae88 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberConst.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -33,7 +25,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberNotNumeric.TD.json index 03a5d2072f..2486a097b4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberNotNumeric.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberNotNumeric.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -32,7 +24,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TD.json index b91109677d..0e4ad776a7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -33,7 +25,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringConst.TD.json index a7beafcf2e..7aa3ec9839 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringConst.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -33,7 +25,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TD.json index e450724559..d63fd93ed6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -33,7 +25,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringValueNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringValueNotString.TD.json index 37eb006b36..17c25fd76f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringValueNotString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringValueNotString.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -32,7 +24,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeArray.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeArray.TD.json index 69562dfbc8..9dd6fe349e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeArray.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeArray.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -35,7 +27,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeNull.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeNull.TD.json index e19ac07209..a8b05937db 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeNull.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeNull.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -32,7 +24,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeObject.TD.json index 751a6fe219..e0dfaa415a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeObject.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeObject.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -39,7 +31,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstUnsupportedProperty.TD.json index 7c67a97a46..6486674b33 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstUnsupportedProperty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -33,7 +25,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstValueNoSchema.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstValueNoSchema.TD.json index 6344671b66..f3d47a5ec8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstValueNoSchema.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstValueNoSchema.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -29,7 +21,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNoProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNoProperty.TD.json index 72521f269f..304709b7ee 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNoProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNoProperty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNotString.TD.json index 3d6dca49b4..df8624d07b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNotString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNotString.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -30,7 +22,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessagePropertyNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessagePropertyNotString.TD.json index f35d14d027..b2a7378543 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessagePropertyNotString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessagePropertyNotString.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -30,7 +22,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectNoDeterminant.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectNoDeterminant.TD.json index 76c9536e36..3626d30b6e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectNoDeterminant.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectNoDeterminant.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object" @@ -24,7 +16,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertiesNotObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertiesNotObject.TD.json index 1f0629c353..553801daa5 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertiesNotObject.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertiesNotObject.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyNoType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyNoType.TD.json index 1bb6b4187d..b5f6c024ec 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyNoType.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyNoType.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -28,7 +20,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyObjectConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyObjectConst.TD.json index ba2f2191cf..4998533418 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyObjectConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyObjectConst.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -37,7 +29,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyRef.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyRef.TD.json index d312c911e2..6c0ac4397f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyRef.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyRef.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -29,7 +21,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyStringConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyStringConst.TD.json index ce294f3d66..f7598eb717 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyStringConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyStringConst.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -30,7 +22,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyTypeNull.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyTypeNull.TD.json index 94dfc1f07b..26a4eaa364 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyTypeNull.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyTypeNull.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -29,7 +21,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectRequiredNoProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectRequiredNoProperty.TD.json index 0ceb7099d4..3ce417077e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectRequiredNoProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectRequiredNoProperty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionRef.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionRef.TD.json index 519a12169e..339c878841 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionRef.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionRef.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "dtv:ref": "../../json-schemas/AnObjectSchema.json" @@ -24,7 +16,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstContentEncoding.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstContentEncoding.TD.json index 1671c02771..417d889639 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstContentEncoding.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstContentEncoding.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "string", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstFormat.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstFormat.TD.json index 41e402c72c..4aace95fb3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstFormat.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstFormat.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "string", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstPattern.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstPattern.TD.json index eb9d4469a2..73f62b6bd2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstPattern.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstPattern.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "string", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstUnsupportedProperty.TD.json index e63ef1fed0..8d75343d03 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstUnsupportedProperty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "string", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstValueNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstValueNotString.TD.json index 76095b2058..b45a425a83 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstValueNotString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstValueNotString.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "string", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringContentEncodingUnsupportedValue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringContentEncodingUnsupportedValue.TD.json index 291ea6212d..2b041af76d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringContentEncodingUnsupportedValue.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringContentEncodingUnsupportedValue.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "string", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumConst.TD.json index 9b31e099c6..9dd8ac86ef 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumConst.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "string", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumContentEncoding.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumContentEncoding.TD.json index 3b481349de..faffaa7439 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumContentEncoding.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumContentEncoding.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "string", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumElementInvalid.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumElementInvalid.TD.json index 77ecea0204..b1e29dd961 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumElementInvalid.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumElementInvalid.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "string", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumFormat.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumFormat.TD.json index aeb92aca73..33fda6badd 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumFormat.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumFormat.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "string", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumPattern.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumPattern.TD.json index 9c53faaa2c..cb5c2bf636 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumPattern.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumPattern.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "string", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumReadOnly.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumReadOnly.TD.json index 84c0dd199f..088e742895 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumReadOnly.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumReadOnly.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "string", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumUnsupportedProperty.TD.json index 3ad027f6d4..3d7f531012 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumUnsupportedProperty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "string", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndContentEncoding.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndContentEncoding.TD.json index d2ba4d558e..28bf6e04bb 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndContentEncoding.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndContentEncoding.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "string", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndPattern.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndPattern.TD.json index 64b6dc7c3e..41d8928f23 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndPattern.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndPattern.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "string", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatUnsupportedValue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatUnsupportedValue.TD.json index 34a15aa7e2..e30758ce5e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatUnsupportedValue.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatUnsupportedValue.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "string", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternAndContentEncoding.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternAndContentEncoding.TD.json index fe8c12b6a1..79ae7cece6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternAndContentEncoding.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternAndContentEncoding.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "string", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternNotDurationOrDecimal.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternNotDurationOrDecimal.TD.json index 6dd96d9aaf..a9b43dae43 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternNotDurationOrDecimal.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternNotDurationOrDecimal.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "string", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternRegexInvalid.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternRegexInvalid.TD.json index 34c726bae2..015e55f9d6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternRegexInvalid.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternRegexInvalid.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "string", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringReadOnly.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringReadOnly.TD.json index 1b9879b0a6..b2a5034711 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringReadOnly.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringReadOnly.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "string", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringUnsupportedProperty.TD.json index 90dbfd91d7..c0fb44005a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringUnsupportedProperty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "string", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionTypeNull.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionTypeNull.TD.json index 679495da59..bac652109c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionTypeNull.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionTypeNull.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "null" @@ -24,7 +16,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleEmpty.TD.json index 7621643232..a4d5d2aa44 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleEmpty.TD.json @@ -3,23 +3,15 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleInvalid.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleInvalid.TD.json index b2fe0d379b..b91f63fe93 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleInvalid.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleInvalid.TD.json @@ -3,23 +3,15 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Not codegen legal", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ArrayKey.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ArrayKey.TD.json index 9ec49c2c10..13bf7db300 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ArrayKey.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ArrayKey.TD.json @@ -3,23 +3,15 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", [ "contentType" ]: "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/BooleanKey.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/BooleanKey.TD.json index 73ba2ffc94..d32226394d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/BooleanKey.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/BooleanKey.TD.json @@ -3,23 +3,15 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", true: "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/DuplicateKey.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/DuplicateKey.TD.json index 22bffd8094..404606c1ef 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/DuplicateKey.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/DuplicateKey.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ @@ -20,7 +12,7 @@ "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "contentType": "application/text", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingColon.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingColon.TD.json index afba22078c..066ca01488 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingColon.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingColon.TD.json @@ -3,23 +3,15 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType" "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingComma.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingComma.TD.json index a8596ee262..be43b57a8d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingComma.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingComma.TD.json @@ -3,23 +3,15 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json" - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingElement.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingElement.TD.json index 8cfac1bf4d..3a6bbb4566 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingElement.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingElement.TD.json @@ -3,23 +3,15 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" }, ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingKey.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingKey.TD.json index e16cbc9ff7..298d98a91a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingKey.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingKey.TD.json @@ -3,23 +3,15 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", : "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingValue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingValue.TD.json index d8d2a625c8..985966edcc 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingValue.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingValue.TD.json @@ -3,23 +3,15 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": , - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/NumericKey.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/NumericKey.TD.json index da07f43f65..1bad690406 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/NumericKey.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/NumericKey.TD.json @@ -3,23 +3,15 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", 626: "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ObjectKey.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ObjectKey.TD.json index ec1c067bf3..2973853808 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ObjectKey.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ObjectKey.TD.json @@ -3,23 +3,15 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", { "contentType": true }: "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/TrailingComma.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/TrailingComma.TD.json index 8bd802f202..2a97bdc327 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/TrailingComma.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/TrailingComma.TD.json @@ -3,23 +3,15 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction", } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedArray.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedArray.TD.json index 6c8566bcb6..29c0583797 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedArray.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedArray.TD.json @@ -3,23 +3,15 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedObject.TD.json index 4043b61224..6ae918613b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedObject.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedObject.TD.json @@ -3,23 +3,15 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpRead.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpRead.TD.json index 27d8754cac..f89956032b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpRead.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpRead.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpSub.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpSub.TD.json index 9bc338c3dd..57a5454ad1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpSub.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpSub.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpWrite.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpWrite.TD.json index 20c6f19f75..84c179196a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpWrite.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpWrite.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormsEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormsEmpty.TD.json index d74d20780f..7b5788d72e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormsEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormsEmpty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextMissingWot.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextMissingWot.TD.json index 1bc91ccec1..72141f0a39 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextMissingWot.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextMissingWot.TD.json @@ -2,23 +2,15 @@ "@context": [ { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextWrongType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextWrongType.TD.json index b1713971dc..127618028d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextWrongType.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextWrongType.TD.json @@ -1,22 +1,14 @@ { "@context": 404, - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpInvoke.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpInvoke.TD.json index fdd77dbde4..25505e7ab6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpInvoke.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpInvoke.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", - "dtv:topic": "sample/alert/{modelId}", + "dtv:topic": "sample/alert/TestThing", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpRead.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpRead.TD.json index b32b8d7624..fc511fde1e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpRead.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpRead.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", - "dtv:topic": "sample/alert/{modelId}", + "dtv:topic": "sample/alert/TestThing", "op": "readproperty" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpSubAll.TD.json index 7e9f5e207f..e73a000920 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpSubAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpSubAll.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", - "dtv:topic": "sample/alert/{modelId}", + "dtv:topic": "sample/alert/TestThing", "op": "subscribeallevents" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpWrite.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpWrite.TD.json index 140741af9c..caf5bd6165 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpWrite.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpWrite.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", - "dtv:topic": "sample/alert/{modelId}", + "dtv:topic": "sample/alert/TestThing", "op": "writeproperty" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormsEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormsEmpty.TD.json index 3e745833dd..bfca41fcf6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormsEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormsEmpty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoContext.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoContext.TD.json index d72a6324d2..b428dae6d9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoContext.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoContext.TD.json @@ -1,21 +1,13 @@ { - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/NoId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoType.TD.json similarity index 70% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/NoId.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoType.TD.json index 1fb1b38520..801086ad8e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/NoId.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoType.TD.json @@ -4,21 +4,13 @@ { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpInvoke.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpInvoke.TD.json index 817babcd88..f49b16af8f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpInvoke.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpInvoke.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpReadAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpReadAll.TD.json index 8823a32b45..385e33d33a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpReadAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpReadAll.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpSub.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpSub.TD.json index b8986ec202..9ef36f4ff1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpSub.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpSub.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpWriteMulti.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpWriteMulti.TD.json index af094da5a3..03ed8e6c24 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpWriteMulti.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpWriteMulti.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormsEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormsEmpty.TD.json index 6e6a8be3e4..9028028ddf 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormsEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormsEmpty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { }, "properties": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormEmptyHref.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormEmptyHref.TD.json deleted file mode 100644 index 26b5211815..0000000000 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormEmptyHref.TD.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "@context": [ - "https://www.w3.org/2022/wot/td/v1.1", - { "dtv": "http://azure.com/DigitalTwins/dtmi#" } - ], - "id": "dtmi:test:Noop;1", - "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], - "forms": [ - { - "href": "", - "contentType": "application/json", - "dtv:topic": "sample/{modelId}/read", - "op": "readallproperties" - } - ], - "actions": { - "noop": { - "forms": [ - { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", - "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", - "op": "invokeaction" - } - ] - } - }, - "properties": { - "alpha": { - "type": "string", - "forms": [ - { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" - } - ] - } - }, - "events": { - "alert": { - "data": { - "type": "string" - }, - "forms": [ - { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" - } - ] - } - } -} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormNoHref.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormNoHref.TD.json deleted file mode 100644 index 6ae7646759..0000000000 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormNoHref.TD.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "@context": [ - "https://www.w3.org/2022/wot/td/v1.1", - { "dtv": "http://azure.com/DigitalTwins/dtmi#" } - ], - "id": "dtmi:test:Noop;1", - "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], - "forms": [ - { - "contentType": "application/json", - "dtv:topic": "sample/{modelId}/read", - "op": "readallproperties" - } - ], - "actions": { - "noop": { - "forms": [ - { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", - "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", - "op": "invokeaction" - } - ] - } - }, - "properties": { - "alpha": { - "type": "string", - "forms": [ - { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" - } - ] - } - }, - "events": { - "alert": { - "data": { - "type": "string" - }, - "forms": [ - { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" - } - ] - } - } -} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormNoOp.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormNoOp.TD.json index 6b6d5a4ff5..3e97477c81 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormNoOp.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormNoOp.TD.json @@ -3,21 +3,13 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:read;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/read" + "dtv:topic": "sample/TestThing/read" } ], "actions": { @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpArrayEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpArrayEmpty.TD.json index eb24830e64..0ab6a8f2dc 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpArrayEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpArrayEmpty.TD.json @@ -3,21 +3,13 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:read;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/read", + "dtv:topic": "sample/TestThing/read", "op": [ ] } ], @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpElementEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpElementEmpty.TD.json index 53f0688c3a..3abbfd863f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpElementEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpElementEmpty.TD.json @@ -3,21 +3,13 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:read;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/read", + "dtv:topic": "sample/TestThing/read", "op": [ "" ] } ], @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpEmpty.TD.json index 33f13b5c51..45991bcb10 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpEmpty.TD.json @@ -3,21 +3,13 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:read;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/read", + "dtv:topic": "sample/TestThing/read", "op": "" } ], @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpReadOne.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpReadOne.TD.json index 86a14ce94c..ce3bf533e5 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpReadOne.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpReadOne.TD.json @@ -3,21 +3,13 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:read;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/read", + "dtv:topic": "sample/TestThing/read", "op": [ "readproperty" ] } ], @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpSubOne.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpSubOne.TD.json index 5b5cd5cee7..cd18920202 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpSubOne.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpSubOne.TD.json @@ -3,21 +3,13 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:events;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/evens", + "dtv:topic": "sample/TestThing/evens", "op": [ "subscribeevent" ] } ], @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpWriteOne.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpWriteOne.TD.json index 39d4c6e65f..3c5865630b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpWriteOne.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpWriteOne.TD.json @@ -3,21 +3,13 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { "href": "dtmi:test:ProtocolCompiler:write;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/write", + "dtv:topic": "sample/TestThing/write", "op": [ "writeproperty" ] } ], @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormsEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormsEmpty.TD.json index a0f959a7eb..d0141fc058 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormsEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormsEmpty.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ ], "actions": { @@ -21,7 +13,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsNotObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsNotObject.TD.json index 9adf9878c1..883048a3e6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsNotObject.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsNotObject.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "array", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeNotString.TD.json index b1c4f38c81..0b776254fc 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeNotString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeNotString.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "array", @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeUnsupported.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeUnsupported.TD.json index d9eb10b1c7..289fa3e692 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeUnsupported.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeUnsupported.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "array", @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMaxNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMaxNotNumeric.TD.json index db86ddcad7..99a2d4602c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMaxNotNumeric.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMaxNotNumeric.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "integer", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMinNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMinNotNumeric.TD.json index abbe84c1f2..f752aa1182 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMinNotNumeric.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMinNotNumeric.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "integer", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesNotObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesNotObject.TD.json index 99a0da86e5..7589d4ab67 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesNotObject.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesNotObject.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeNotString.TD.json index 8f9c7951be..e1afe04f9d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeNotString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeNotString.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TD.json index d4f9d9ef38..a1c19d896c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -27,7 +19,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMaxNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMaxNotNumeric.TD.json index 929bdc8049..3b04aa5c72 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMaxNotNumeric.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMaxNotNumeric.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "number", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMinNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMinNotNumeric.TD.json index 988c3b3031..57a8fa2dc2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMinNotNumeric.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMinNotNumeric.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "number", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectConstPropertyTypeUnsupported.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectConstPropertyTypeUnsupported.TD.json index 3ff2f12876..3b0b0494e4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectConstPropertyTypeUnsupported.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectConstPropertyTypeUnsupported.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -32,7 +24,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeNotString.TD.json index 26332e4ca8..797b5d1656 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeNotString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeNotString.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -29,7 +21,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeUnsupported.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeUnsupported.TD.json index bf007a74bd..29d4b63dfe 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeUnsupported.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeUnsupported.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -29,7 +21,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectRequiredNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectRequiredNotString.TD.json index ee51b8fd0b..8094b37f5e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectRequiredNotString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectRequiredNotString.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "object", @@ -30,7 +22,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringContentEncodingNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringContentEncodingNotString.TD.json index cb4cb8319d..0f5337475e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringContentEncodingNotString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringContentEncodingNotString.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "string", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringFormatNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringFormatNotString.TD.json index 0af3ffddc6..4a1ee93500 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringFormatNotString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringFormatNotString.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "string", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringPatternNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringPatternNotString.TD.json index 6ed9fbe50b..73c5c88df2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringPatternNotString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringPatternNotString.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "string", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeNotString.TD.json index 846dceabd8..5972e95439 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeNotString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeNotString.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": 767 @@ -24,7 +16,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeUnsupported.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeUnsupported.TD.json index b3d07bf011..db448f1664 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeUnsupported.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeUnsupported.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "someSchema": { "type": "foobar" @@ -24,7 +16,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TitleNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TitleNotString.TD.json index 641c06c68f..d31fafa20a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TitleNotString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TitleNotString.TD.json @@ -3,23 +3,15 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": 444, - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/IdEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TypeEmpty.TD.json similarity index 68% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/IdEmpty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TypeEmpty.TD.json index b1f602effb..44278d9c3b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/IdEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TypeEmpty.TD.json @@ -3,23 +3,15 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "", + "@type": "", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/IdNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TypeNotThingModel.TD.json similarity index 68% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/IdNotString.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TypeNotThingModel.TD.json index e82bd5f039..f50a377359 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/IdNotString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TypeNotThingModel.TD.json @@ -3,23 +3,15 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": 555, + "@type": "Something", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/IdInvalidReplacementButNotInTopic.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/IdInvalidReplacementButNotInTopic.TD.json index 6ae1b264c9..c8710c18ec 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/IdInvalidReplacementButNotInTopic.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/IdInvalidReplacementButNotInTopic.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "foo://bar", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkNoRel.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkNoRel.TD.json index 2fe8a825e4..d042666482 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkNoRel.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkNoRel.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "links": [ { "href": "../../TestCase.cs", @@ -25,7 +17,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkOtherRel.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkOtherRel.TD.json index e24ec03d20..0002248126 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkOtherRel.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkOtherRel.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "links": [ { "rel": "service-doc", @@ -26,7 +18,7 @@ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/Noop.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/Noop.TD.json index c4427ac432..e9106d87de 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/Noop.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/Noop.TD.json @@ -3,23 +3,15 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "actions": { "noop": { "forms": [ { "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/noop", + "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TD.json index b1eaadaa0c..1c249c143b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Error": { "type": "object", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TD.json index c6c2d70a67..790fdcc231 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TD.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:Noop;1", + "@type": "tm:ThingModel", "title": "Noop", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Error": { "type": "object", From f16ce72100ca1651bbae658fbbe7ab8debced241 Mon Sep 17 00:00:00 2001 From: "John (JD) Douceur" Date: Wed, 7 Jan 2026 14:12:13 -0800 Subject: [PATCH 34/52] remove href from forms --- .../ThingValidator.cs | 178 ++++++++---------- .../Model/TDForm.cs | 18 +- codegen2/src/TDParse/Program.cs | 1 - ...ormAdditionalResponseContentTypeEmpty.json | 2 +- ...FormAdditionalResponseContentTypeText.json | 2 +- ...nalResponseNoMatchingSchemaDefinition.json | 2 +- .../ActionFormAdditionalResponseNoSchema.json | 2 +- ...AdditionalResponseNoSchemaDefinitions.json | 2 +- ...ActionFormAdditionalResponseNoSuccess.json | 2 +- ...AdditionalResponseSchemaDefinitionMap.json | 2 +- ...onalResponseSchemaDefinitionNotObject.json | 2 +- ...tionFormAdditionalResponseSchemaEmpty.json | 2 +- ...tionFormAdditionalResponseSuccessTrue.json | 2 +- ...AdditionalResponseUnsupportedProperty.json | 2 +- ...ActionFormAdditionalResponsesMultiple.json | 2 +- .../failure/ActionFormContentTypeText.json | 2 +- .../failure/ActionFormHeaderCodeEmpty.json | 2 +- ...mHeaderCodeNoMatchingSchemaDefinition.json | 2 +- ...tionFormHeaderCodeNoSchemaDefinitions.json | 2 +- ...FormHeaderCodeSchemaDefinitionNotEnum.json | 2 +- .../ActionFormHeaderInfoContentTypeEmpty.json | 2 +- ...ctionFormHeaderInfoContentTypeNotJson.json | 2 +- .../ActionFormHeaderInfoNoContentType.json | 2 +- ...mHeaderInfoNoMatchingSchemaDefinition.json | 2 +- .../failure/ActionFormHeaderInfoNoSchema.json | 2 +- ...tionFormHeaderInfoNoSchemaDefinitions.json | 2 +- ...tionFormHeaderInfoSchemaDefinitionMap.json | 2 +- ...rmHeaderInfoSchemaDefinitionNotObject.json | 2 +- .../ActionFormHeaderInfoSchemaEmpty.json | 2 +- .../ActionFormHeaderInfoSuccessTrue.json | 2 +- ...tionFormHeaderInfoUnsupportedProperty.json | 2 +- .../ActionFormHeaderInfosMultiple.json | 2 +- .../failure/ActionFormOpInvokeDuplicate.json | 2 +- .../test-cases/failure/ActionFormOpRead.json | 2 +- .../test-cases/failure/ActionFormOpSub.json | 2 +- .../test-cases/failure/ActionFormOpWrite.json | 2 +- .../failure/ActionFormServiceGroupEmpty.json | 2 +- .../failure/ActionFormTopicNoContentType.json | 2 +- .../failure/ActionFormTopicTokenAction.json | 2 +- .../ActionFormTopicTokenConsumerId.json | 2 +- .../ActionFormTopicTokenMaintainerId.json | 2 +- .../failure/ActionFormTopicTokenSenderId.json | 2 +- .../ActionFormUnsupportedProperty.json | 2 +- .../ActionFormsMultipleContentTypes.json | 4 +- .../failure/ActionFormsOpInvokeDuplicate.json | 4 +- .../failure/ActionFormsOplessAndInvoke.json | 2 +- .../ActionInputNullAndContentTypeJson.json | 2 +- ...ActionInputObjectAndContentTypeCustom.json | 2 +- .../ActionInputObjectAndContentTypeRaw.json | 2 +- .../test-cases/failure/ActionNoForms.json | 2 +- .../ActionOutputNullAndContentTypeJson.json | 2 +- ...ctionOutputObjectAndContentTypeCustom.json | 2 +- .../ActionOutputObjectAndContentTypeRaw.json | 2 +- .../failure/ActionUnsupportedProperty.json | 2 +- .../test-cases/failure/ArrayKey.json | 2 +- .../test-cases/failure/BooleanKey.json | 2 +- .../failure/EventFormAdditionalResponses.json | 2 +- .../failure/EventFormContentTypeText.json | 2 +- .../failure/EventFormHeaderCode.json | 2 +- .../failure/EventFormHeaderInfo.json | 2 +- .../test-cases/failure/EventFormOpInvoke.json | 2 +- .../test-cases/failure/EventFormOpRead.json | 2 +- .../test-cases/failure/EventFormOpSubAll.json | 2 +- .../failure/EventFormOpSubDuplicate.json | 2 +- .../test-cases/failure/EventFormOpWrite.json | 2 +- .../failure/EventFormServiceGroupEmpty.json | 2 +- .../failure/EventFormTopicNoContentType.json | 2 +- .../failure/EventFormTopicTokenAction.json | 2 +- .../EventFormTopicTokenConsumerId.json | 2 +- .../EventFormTopicTokenExecutorId.json | 2 +- .../failure/EventFormTopicTokenInvokerId.json | 2 +- .../EventFormTopicTokenMaintainerId.json | 2 +- .../failure/EventFormUnsupportedProperty.json | 2 +- .../failure/EventFormsOpSubDuplicate.json | 4 +- .../failure/EventFormsOplessAndSub.json | 2 +- .../test-cases/failure/EventNoForms.json | 2 +- .../failure/EventNullAndContentTypeJson.json | 2 +- .../EventObjectAndContentTypeCustom.json | 2 +- .../failure/EventObjectAndContentTypeRaw.json | 2 +- .../failure/EventUnsupportedProperty.json | 2 +- .../test-cases/failure/MissingColon.json | 2 +- .../test-cases/failure/MissingComma.json | 2 +- .../test-cases/failure/MissingKey.json | 2 +- .../test-cases/failure/MissingValue.json | 2 +- .../test-cases/failure/NumericKey.json | 2 +- .../test-cases/failure/ObjectKey.json | 2 +- ...ormAdditionalResponseContentTypeEmpty.json | 2 +- ...FormAdditionalResponseContentTypeText.json | 2 +- ...nalResponseNoMatchingSchemaDefinition.json | 2 +- ...ropertyFormAdditionalResponseNoSchema.json | 2 +- ...AdditionalResponseNoSchemaDefinitions.json | 2 +- ...opertyFormAdditionalResponseNoSuccess.json | 2 +- ...AdditionalResponseSchemaDefinitionMap.json | 2 +- ...onalResponseSchemaDefinitionNotObject.json | 2 +- ...ertyFormAdditionalResponseSchemaEmpty.json | 2 +- ...ertyFormAdditionalResponseSuccessTrue.json | 2 +- ...AdditionalResponseUnsupportedProperty.json | 2 +- ...opertyFormAdditionalResponsesMultiple.json | 2 +- .../failure/PropertyFormContentTypeText.json | 2 +- .../failure/PropertyFormHeaderCode.json | 2 +- .../failure/PropertyFormHeaderInfo.json | 2 +- .../failure/PropertyFormOpInvoke.json | 2 +- .../failure/PropertyFormOpReadAll.json | 2 +- .../failure/PropertyFormOpReadDuplicate.json | 2 +- .../test-cases/failure/PropertyFormOpSub.json | 2 +- .../failure/PropertyFormOpWriteDuplicate.json | 2 +- .../failure/PropertyFormOpWriteMulti.json | 2 +- ...FormReadAllWithoutAdditionalResponses.json | 2 +- ...FormReadAllWithoutAdditionalResponses.json | 2 +- ...TopicWriteWithTopicAndRootFormReadAll.json | 4 +- .../failure/PropertyFormServiceGroup.json | 2 +- .../PropertyFormTopicNoContentType.json | 2 +- .../PropertyFormTopicTokenExecutorId.json | 2 +- .../PropertyFormTopicTokenInvokerId.json | 2 +- ...picTokenNoActionWhenNoOpAndNoReadOnly.json | 2 +- ...TokenNoActionWhenNoOpAndReadOnlyFalse.json | 2 +- ...ormTopicTokenNoActionWhenReadAndWrite.json | 2 +- .../PropertyFormTopicTokenSenderId.json | 2 +- .../PropertyFormUnsupportedProperty.json | 2 +- ...mWriteMultiWithoutAdditionalResponses.json | 4 +- ...teWithoutTopicAndNoRootFormWriteMulti.json | 2 +- .../failure/PropertyFormsOpReadDuplicate.json | 4 +- .../PropertyFormsOpWriteDuplicate.json | 4 +- .../failure/PropertyFormsOpWriteNoRead.json | 2 +- .../failure/PropertyFormsOplessAndRead.json | 2 +- .../test-cases/failure/PropertyNoForms.json | 2 +- .../failure/PropertyUnsupportedProperty.json | 2 +- ...ormAdditionalResponseContentTypeEmpty.json | 2 +- ...FormAdditionalResponseContentTypeText.json | 2 +- .../RootFormAdditionalResponseNoSuccess.json | 2 +- .../RootFormAdditionalResponseSchema.json | 2 +- ...RootFormAdditionalResponseSuccessTrue.json | 2 +- ...AdditionalResponseUnsupportedProperty.json | 2 +- .../RootFormAdditionalResponsesAndSubAll.json | 4 +- .../RootFormAdditionalResponsesMultiple.json | 2 +- .../failure/RootFormContentTypeCustom.json | 2 +- .../failure/RootFormContentTypeRaw.json | 2 +- .../failure/RootFormContentTypeText.json | 2 +- .../failure/RootFormHeaderCode.json | 2 +- .../failure/RootFormHeaderInfo.json | 2 +- .../failure/RootFormNoContentType.json | 2 +- .../failure/RootFormOpArrayEmpty.json | 2 +- .../failure/RootFormOpElementEmpty.json | 2 +- .../test-cases/failure/RootFormOpEmpty.json | 2 +- .../failure/RootFormOpReadAllAndSubAll.json | 2 +- .../failure/RootFormOpReadAllDuplicate.json | 2 +- .../test-cases/failure/RootFormOpReadOne.json | 2 +- .../failure/RootFormOpSubAllDuplicate.json | 2 +- .../test-cases/failure/RootFormOpSubOne.json | 2 +- .../failure/RootFormOpWiteMultiAndSubAll.json | 2 +- .../RootFormOpWriteMultiDuplicate.json | 2 +- .../failure/RootFormOpWriteOne.json | 2 +- .../RootFormReadAllButNoProperties.json | 4 +- .../failure/RootFormServiceGroupEmpty.json | 2 +- .../failure/RootFormServiceGroupNoSubAll.json | 2 +- .../failure/RootFormSubAllButNoEvents.json | 4 +- .../failure/RootFormTopicEmpty.json | 2 +- .../failure/RootFormTopicLevelEmpty.json | 2 +- .../failure/RootFormTopicLevelInvalid.json | 2 +- .../failure/RootFormTopicReservedStart.json | 2 +- .../RootFormTopicTokenActionWhenSubAll.json | 2 +- ...ootFormTopicTokenConsumerIdWhenSubAll.json | 2 +- .../RootFormTopicTokenCustomEmpty.json | 2 +- .../RootFormTopicTokenCustomInvalid.json | 2 +- .../failure/RootFormTopicTokenEmpty.json | 2 +- .../failure/RootFormTopicTokenExecutorId.json | 2 +- .../failure/RootFormTopicTokenInvokerId.json | 2 +- ...tFormTopicTokenMaintainerIdWhenSubAll.json | 2 +- ...TokenNoActionWhenReadAllAndWriteMulti.json | 2 +- ...RootFormTopicTokenSenderIdWhenReadAll.json | 2 +- ...tFormTopicTokenSenderIdWhenWriteMulti.json | 2 +- .../RootFormTopicTokenUnrecognized.json | 2 +- ...FormWriteMultiButNoWritableProperties.json | 4 +- .../failure/RootFormsOpReadAllDuplicate.json | 4 +- .../failure/RootFormsOpSubAllDuplicate.json | 4 +- .../RootFormsOpWriteMultiDuplicate.json | 4 +- .../RootFormsOpWriteMultiNoReadAll.json | 2 +- .../test-cases/failure/TrailingComma.json | 2 +- .../test-cases/failure/UnclosedArray.json | 2 +- .../test-cases/failure/UnclosedObject.json | 2 +- .../IdInvalidReplacementButNotInTopic.json | 7 - ...AdditionalResponseContentTypeEmpty.TD.json | 1 - ...mAdditionalResponseContentTypeText.TD.json | 1 - ...ResponseNoMatchingSchemaDefinition.TD.json | 1 - ...tionFormAdditionalResponseNoSchema.TD.json | 1 - ...itionalResponseNoSchemaDefinitions.TD.json | 1 - ...ionFormAdditionalResponseNoSuccess.TD.json | 1 - ...itionalResponseSchemaDefinitionMap.TD.json | 1 - ...lResponseSchemaDefinitionNotObject.TD.json | 1 - ...nFormAdditionalResponseSchemaEmpty.TD.json | 1 - ...nFormAdditionalResponseSuccessTrue.TD.json | 1 - ...itionalResponseUnsupportedProperty.TD.json | 1 - ...ionFormAdditionalResponsesMultiple.TD.json | 1 - .../ActionFormContentTypeText.TD.json | 1 - .../ActionFormHeaderCodeEmpty.TD.json | 1 - ...aderCodeNoMatchingSchemaDefinition.TD.json | 1 - ...nFormHeaderCodeNoSchemaDefinitions.TD.json | 1 - ...mHeaderCodeSchemaDefinitionNotEnum.TD.json | 1 - ...tionFormHeaderInfoContentTypeEmpty.TD.json | 1 - ...onFormHeaderInfoContentTypeNotJson.TD.json | 1 - .../ActionFormHeaderInfoNoContentType.TD.json | 1 - ...aderInfoNoMatchingSchemaDefinition.TD.json | 1 - .../ActionFormHeaderInfoNoSchema.TD.json | 1 - ...nFormHeaderInfoNoSchemaDefinitions.TD.json | 1 - ...nFormHeaderInfoSchemaDefinitionMap.TD.json | 1 - ...eaderInfoSchemaDefinitionNotObject.TD.json | 1 - .../ActionFormHeaderInfoSchemaEmpty.TD.json | 1 - .../ActionFormHeaderInfoSuccessTrue.TD.json | 1 - ...nFormHeaderInfoUnsupportedProperty.TD.json | 1 - .../ActionFormHeaderInfosMultiple.TD.json | 1 - .../ActionFormOpInvokeDuplicate.TD.json | 1 - .../ActionFormServiceGroupEmpty.TD.json | 1 - .../ActionFormTopicNoContentType.TD.json | 1 - .../ActionFormTopicTokenAction.TD.json | 1 - .../ActionFormTopicTokenConsumerId.TD.json | 1 - .../ActionFormTopicTokenMaintainerId.TD.json | 1 - .../ActionFormTopicTokenSenderId.TD.json | 1 - .../ActionFormUnsupportedProperty.TD.json | 1 - .../ActionFormsMultipleContentTypes.TD.json | 2 - .../ActionFormsOpInvokeDuplicate.TD.json | 2 - .../ActionFormsOplessAndInvoke.TD.json | 2 - .../ActionFormsOplessDuplicate.TD.json | 2 - .../invalidAioBinding/ActionInputMap.TD.json | 1 - .../ActionInputNullAndContentTypeJson.TD.json | 1 - .../ActionInputNumber.TD.json | 1 - ...ionInputObjectAndContentTypeCustom.TD.json | 1 - ...ActionInputObjectAndContentTypeRaw.TD.json | 1 - .../ActionInputObjectConst.TD.json | 1 - .../ActionInputObjectErrorMessage.TD.json | 1 - .../ActionInputString.TD.json | 1 - .../ActionNoFormsWithTopic.TD.json | 1 - .../invalidAioBinding/ActionOutputMap.TD.json | 1 - ...ActionOutputNullAndContentTypeJson.TD.json | 1 - .../ActionOutputNumber.TD.json | 1 - ...onOutputObjectAndContentTypeCustom.TD.json | 1 - ...ctionOutputObjectAndContentTypeRaw.TD.json | 1 - .../ActionOutputObjectConst.TD.json | 1 - .../ActionOutputObjectErrorMessage.TD.json | 1 - .../ActionOutputString.TD.json | 1 - .../ActionUnsupportedProperty.TD.json | 1 - .../ContextDtvWrongPrefix.TD.json | 1 - .../ContextDtvWrongUri.TD.json | 1 - .../ContextMissingDtv.TD.json | 1 - .../EventBooleanConst.TD.json | 1 - .../EventFormAdditionalResponses.TD.json | 1 - .../EventFormContentTypeText.TD.json | 1 - .../EventFormHeaderCode.TD.json | 1 - .../EventFormHeaderInfo.TD.json | 1 - .../EventFormOpSubDuplicate.TD.json | 1 - .../EventFormServiceGroupEmpty.TD.json | 1 - .../EventFormTopicNoContentType.TD.json | 1 - .../EventFormTopicTokenAction.TD.json | 1 - .../EventFormTopicTokenConsumerId.TD.json | 1 - .../EventFormTopicTokenExecutorId.TD.json | 1 - .../EventFormTopicTokenInvokerId.TD.json | 1 - .../EventFormTopicTokenMaintainerId.TD.json | 1 - .../EventFormUnsupportedProperty.TD.json | 1 - .../EventFormsOpSubDuplicate.TD.json | 2 - .../EventFormsOplessAndSub.TD.json | 2 - .../EventFormsOplessDuplicate.TD.json | 2 - .../EventIntegerConst.TD.json | 1 - ...oFormsWithTopicAndNoRootFormSubAll.TD.json | 1 - .../EventNullAndContentTypeJson.TD.json | 1 - .../EventNumberConst.TD.json | 1 - .../EventObjectAndContentTypeCustom.TD.json | 1 - .../EventObjectAndContentTypeRaw.TD.json | 1 - .../EventObjectConst.TD.json | 1 - .../EventObjectErrorMessage.TD.json | 1 - .../EventStringConst.TD.json | 1 - .../EventUnsupportedProperty.TD.json | 1 - .../invalidAioBinding/LinkEmptyHref.TD.json | 1 - .../invalidAioBinding/LinkEmptyType.TD.json | 1 - .../invalidAioBinding/LinkNoHref.TD.json | 1 - .../invalidAioBinding/LinkNoType.TD.json | 1 - .../invalidAioBinding/LinkNonJsonFile.TD.json | 1 - .../LinkNonexistentFile.TD.json | 1 - .../invalidAioBinding/LinkTypeNotJson.TD.json | 1 - .../LinkUnsupportedProperty.TD.json | 1 - .../invalidAioBinding/MultipleLinks.TD.json | 1 - .../invalidAioBinding/NoTitle.TD.json | 1 - .../PropertyBooleanConst.TD.json | 1 - ...AdditionalResponseContentTypeEmpty.TD.json | 1 - ...mAdditionalResponseContentTypeText.TD.json | 1 - ...ResponseNoMatchingSchemaDefinition.TD.json | 1 - ...ertyFormAdditionalResponseNoSchema.TD.json | 1 - ...itionalResponseNoSchemaDefinitions.TD.json | 1 - ...rtyFormAdditionalResponseNoSuccess.TD.json | 1 - ...itionalResponseSchemaDefinitionMap.TD.json | 1 - ...lResponseSchemaDefinitionNotObject.TD.json | 1 - ...yFormAdditionalResponseSchemaEmpty.TD.json | 1 - ...yFormAdditionalResponseSuccessTrue.TD.json | 1 - ...itionalResponseUnsupportedProperty.TD.json | 1 - ...rtyFormAdditionalResponsesMultiple.TD.json | 1 - .../PropertyFormContentTypeText.TD.json | 1 - .../PropertyFormHeaderCode.TD.json | 1 - .../PropertyFormHeaderInfo.TD.json | 1 - .../PropertyFormOpReadDuplicate.TD.json | 1 - .../PropertyFormOpWriteDuplicate.TD.json | 1 - ...mReadAllWithoutAdditionalResponses.TD.json | 2 - ...ssWithoutTopicAndNoRootFormReadAll.TD.json | 1 - ...mReadAllWithoutAdditionalResponses.TD.json | 2 - ...adWithoutTopicAndNoRootFormReadAll.TD.json | 1 - ...icWriteWithTopicAndRootFormReadAll.TD.json | 3 - .../PropertyFormServiceGroup.TD.json | 1 - .../PropertyFormTopicNoContentType.TD.json | 1 - .../PropertyFormTopicTokenExecutorId.TD.json | 1 - .../PropertyFormTopicTokenInvokerId.TD.json | 1 - ...TokenNoActionWhenNoOpAndNoReadOnly.TD.json | 1 - ...enNoActionWhenNoOpAndReadOnlyFalse.TD.json | 1 - ...TopicTokenNoActionWhenReadAndWrite.TD.json | 1 - .../PropertyFormTopicTokenSenderId.TD.json | 1 - .../PropertyFormUnsupportedProperty.TD.json | 1 - ...iteMultiWithoutAdditionalResponses.TD.json | 4 - ...ithoutTopicAndNoRootFormWriteMulti.TD.json | 2 - .../PropertyFormsOpReadDuplicate.TD.json | 2 - .../PropertyFormsOpWriteDuplicate.TD.json | 2 - .../PropertyFormsOpWriteNoRead.TD.json | 1 - .../PropertyFormsOplessAndRead.TD.json | 2 - .../PropertyFormsOplessDuplicate.TD.json | 2 - .../PropertyIntegerConst.TD.json | 1 - .../PropertyNumberConst.TD.json | 1 - .../PropertyObjectConst.TD.json | 1 - .../PropertyObjectErrorMessage.TD.json | 1 - .../PropertyStringConst.TD.json | 1 - .../PropertyTypeNull.TD.json | 1 - .../PropertyUnsupportedProperty.TD.json | 1 - ...AdditionalResponseContentTypeEmpty.TD.json | 4 - ...mAdditionalResponseContentTypeText.TD.json | 4 - ...ootFormAdditionalResponseNoSuccess.TD.json | 4 - .../RootFormAdditionalResponseSchema.TD.json | 4 - ...tFormAdditionalResponseSuccessTrue.TD.json | 4 - ...itionalResponseUnsupportedProperty.TD.json | 4 - ...otFormAdditionalResponsesAndSubAll.TD.json | 4 - ...ootFormAdditionalResponsesMultiple.TD.json | 4 - .../RootFormContentTypeCustom.TD.json | 4 - .../RootFormContentTypeRaw.TD.json | 4 - .../RootFormContentTypeText.TD.json | 4 - .../RootFormHeaderCode.TD.json | 4 - .../RootFormHeaderInfo.TD.json | 4 - .../RootFormNoContentType.TD.json | 4 - .../invalidAioBinding/RootFormNoTopic.TD.json | 4 - .../RootFormOpReadAllAndSubAll.TD.json | 4 - .../RootFormOpReadAllDuplicate.TD.json | 4 - .../RootFormOpSubAllDuplicate.TD.json | 4 - .../RootFormOpWiteMultiAndSubAll.TD.json | 4 - .../RootFormOpWriteMultiDuplicate.TD.json | 4 - .../RootFormReadAllButNoProperties.TD.json | 1 - .../RootFormServiceGroupEmpty.TD.json | 4 - .../RootFormServiceGroupNoSubAll.TD.json | 4 - .../RootFormSubAllButNoEvents.TD.json | 1 - .../RootFormTopicEmpty.TD.json | 4 - .../RootFormTopicLevelEmpty.TD.json | 4 - .../RootFormTopicLevelInvalid.TD.json | 4 - .../RootFormTopicReservedStart.TD.json | 4 - ...RootFormTopicTokenActionWhenSubAll.TD.json | 4 - ...FormTopicTokenConsumerIdWhenSubAll.TD.json | 4 - .../RootFormTopicTokenCustomEmpty.TD.json | 4 - .../RootFormTopicTokenCustomInvalid.TD.json | 4 - .../RootFormTopicTokenEmpty.TD.json | 4 - .../RootFormTopicTokenExecutorId.TD.json | 4 - .../RootFormTopicTokenInvokerId.TD.json | 4 - ...rmTopicTokenMaintainerIdWhenSubAll.TD.json | 4 - ...enNoActionWhenReadAllAndWriteMulti.TD.json | 4 - ...tFormTopicTokenSenderIdWhenReadAll.TD.json | 4 - ...rmTopicTokenSenderIdWhenWriteMulti.TD.json | 4 - .../RootFormTopicTokenUnrecognized.TD.json | 4 - ...mWriteMultiButNoWritableProperties.TD.json | 4 - .../RootFormsOpReadAllDuplicate.TD.json | 5 - .../RootFormsOpSubAllDuplicate.TD.json | 5 - .../RootFormsOpWriteMultiDuplicate.TD.json | 5 - .../RootFormsOpWriteMultiNoReadAll.TD.json | 4 - .../SchemaDefinitionArrayConst.TD.json | 1 - .../SchemaDefinitionArrayItemsNoType.TD.json | 1 - ...emaDefinitionArrayItemsObjectConst.TD.json | 1 - .../SchemaDefinitionArrayItemsRef.TD.json | 1 - ...emaDefinitionArrayItemsStringConst.TD.json | 1 - ...SchemaDefinitionArrayItemsTypeNull.TD.json | 1 - .../SchemaDefinitionArrayNoItems.TD.json | 1 - ...initionBooleanConstValueNotBoolean.TD.json | 1 - .../SchemaDefinitionBooleanReadOnly.TD.json | 1 - ...finitionBooleanUnsupportedProperty.TD.json | 1 - ...efinitionIntegerConstValueAboveMax.TD.json | 1 - ...efinitionIntegerConstValueBelowMin.TD.json | 1 - ...initionIntegerConstValueNotInteger.TD.json | 1 - ...initionIntegerConstValueNotNumeric.TD.json | 1 - ...hemaDefinitionIntegerMaxNotInteger.TD.json | 1 - ...SchemaDefinitionIntegerMinAboveMax.TD.json | 1 - ...hemaDefinitionIntegerMinNotInteger.TD.json | 1 - .../SchemaDefinitionIntegerReadOnly.TD.json | 1 - ...finitionIntegerUnsupportedProperty.TD.json | 1 - ...itionMapAdditionalPropertiesNoType.TD.json | 1 - ...MapAdditionalPropertiesObjectConst.TD.json | 1 - ...finitionMapAdditionalPropertiesRef.TD.json | 1 - ...MapAdditionalPropertiesStringConst.TD.json | 1 - ...ionMapAdditionalPropertiesTypeNull.TD.json | 1 - .../SchemaDefinitionMapConst.TD.json | 1 - .../SchemaDefinitionNoType.TD.json | 1 - ...DefinitionNumberConstValueAboveMax.TD.json | 1 - ...DefinitionNumberConstValueBelowMin.TD.json | 1 - ...finitionNumberConstValueNotNumeric.TD.json | 1 - .../SchemaDefinitionNumberMinAboveMax.TD.json | 1 - .../SchemaDefinitionNumberReadOnly.TD.json | 1 - ...efinitionNumberUnsupportedProperty.TD.json | 1 - ...maDefinitionObjectBothDeterminants.TD.json | 1 - ...hemaDefinitionObjectConstNotObject.TD.json | 1 - ...ionObjectConstPropertyBooleanConst.TD.json | 1 - ...jectConstPropertyBooleanNotBoolean.TD.json | 1 - ...PropertyBooleanUnsupportedProperty.TD.json | 1 - ...ObjectConstPropertyIntegerAboveMax.TD.json | 1 - ...ObjectConstPropertyIntegerBelowMin.TD.json | 1 - ...ionObjectConstPropertyIntegerConst.TD.json | 1 - ...jectConstPropertyIntegerNotInteger.TD.json | 1 - ...jectConstPropertyIntegerNotNumeric.TD.json | 1 - ...PropertyIntegerUnsupportedProperty.TD.json | 1 - ...efinitionObjectConstPropertyNoType.TD.json | 1 - ...finitionObjectConstPropertyNoValue.TD.json | 1 - ...nObjectConstPropertyNumberAboveMax.TD.json | 1 - ...nObjectConstPropertyNumberBelowMin.TD.json | 1 - ...tionObjectConstPropertyNumberConst.TD.json | 1 - ...bjectConstPropertyNumberNotNumeric.TD.json | 1 - ...tPropertyNumberUnsupportedProperty.TD.json | 1 - ...tionObjectConstPropertyStringConst.TD.json | 1 - ...tPropertyStringUnsupportedProperty.TD.json | 1 - ...tConstPropertyStringValueNotString.TD.json | 1 - ...nitionObjectConstPropertyTypeArray.TD.json | 1 - ...initionObjectConstPropertyTypeNull.TD.json | 1 - ...itionObjectConstPropertyTypeObject.TD.json | 1 - ...tionObjectConstUnsupportedProperty.TD.json | 1 - ...DefinitionObjectConstValueNoSchema.TD.json | 1 - ...nitionObjectErrorMessageNoProperty.TD.json | 1 - ...initionObjectErrorMessageNotString.TD.json | 1 - ...bjectErrorMessagePropertyNotString.TD.json | 1 - ...chemaDefinitionObjectNoDeterminant.TD.json | 1 - ...efinitionObjectPropertiesNotObject.TD.json | 1 - ...hemaDefinitionObjectPropertyNoType.TD.json | 1 - ...efinitionObjectPropertyObjectConst.TD.json | 1 - .../SchemaDefinitionObjectPropertyRef.TD.json | 1 - ...efinitionObjectPropertyStringConst.TD.json | 1 - ...maDefinitionObjectPropertyTypeNull.TD.json | 1 - ...DefinitionObjectRequiredNoProperty.TD.json | 1 - .../SchemaDefinitionRef.TD.json | 1 - ...finitionStringConstContentEncoding.TD.json | 1 - .../SchemaDefinitionStringConstFormat.TD.json | 1 - ...SchemaDefinitionStringConstPattern.TD.json | 1 - ...tionStringConstUnsupportedProperty.TD.json | 1 - ...efinitionStringConstValueNotString.TD.json | 1 - ...ingContentEncodingUnsupportedValue.TD.json | 1 - .../SchemaDefinitionStringEnumConst.TD.json | 1 - ...efinitionStringEnumContentEncoding.TD.json | 1 - ...DefinitionStringEnumElementInvalid.TD.json | 1 - .../SchemaDefinitionStringEnumFormat.TD.json | 1 - .../SchemaDefinitionStringEnumPattern.TD.json | 1 - ...SchemaDefinitionStringEnumReadOnly.TD.json | 1 - ...itionStringEnumUnsupportedProperty.TD.json | 1 - ...tionStringFormatAndContentEncoding.TD.json | 1 - ...maDefinitionStringFormatAndPattern.TD.json | 1 - ...nitionStringFormatUnsupportedValue.TD.json | 1 - ...ionStringPatternAndContentEncoding.TD.json | 1 - ...nStringPatternNotDurationOrDecimal.TD.json | 1 - ...efinitionStringPatternRegexInvalid.TD.json | 1 - .../SchemaDefinitionStringReadOnly.TD.json | 1 - ...efinitionStringUnsupportedProperty.TD.json | 1 - .../SchemaDefinitionTypeNull.TD.json | 1 - .../invalidAioBinding/TitleEmpty.TD.json | 1 - .../invalidAioBinding/TitleInvalid.TD.json | 1 - .../invalidJson/ArrayKey.TD.json | 1 - .../invalidJson/BooleanKey.TD.json | 1 - .../invalidJson/DuplicateKey.TD.json | 1 - .../invalidJson/MissingColon.TD.json | 1 - .../invalidJson/MissingComma.TD.json | 1 - .../invalidJson/MissingElement.TD.json | 1 - .../invalidJson/MissingKey.TD.json | 1 - .../invalidJson/MissingValue.TD.json | 1 - .../invalidJson/NumericKey.TD.json | 1 - .../invalidJson/ObjectKey.TD.json | 1 - .../invalidJson/TrailingComma.TD.json | 1 - .../invalidJson/UnclosedArray.TD.json | 1 - .../invalidJson/UnclosedObject.TD.json | 1 - .../invalidThing/ActionFormOpRead.TD.json | 1 - .../invalidThing/ActionFormOpSub.TD.json | 1 - .../invalidThing/ActionFormOpWrite.TD.json | 1 - .../invalidThing/ContextMissingWot.TD.json | 1 - .../invalidThing/ContextWrongType.TD.json | 1 - .../invalidThing/EventFormOpInvoke.TD.json | 1 - .../invalidThing/EventFormOpRead.TD.json | 1 - .../invalidThing/EventFormOpSubAll.TD.json | 1 - .../invalidThing/EventFormOpWrite.TD.json | 1 - .../invalidThing/NoContext.TD.json | 1 - .../invalidThing/NoType.TD.json | 1 - .../invalidThing/PropertyFormOpInvoke.TD.json | 1 - .../PropertyFormOpReadAll.TD.json | 1 - .../invalidThing/PropertyFormOpSub.TD.json | 1 - .../PropertyFormOpWriteMulti.TD.json | 1 - .../invalidThing/RootFormNoOp.TD.json | 4 - .../invalidThing/RootFormOpArrayEmpty.TD.json | 4 - .../RootFormOpElementEmpty.TD.json | 4 - .../invalidThing/RootFormOpEmpty.TD.json | 4 - .../invalidThing/RootFormOpReadOne.TD.json | 4 - .../invalidThing/RootFormOpSubOne.TD.json | 4 - .../invalidThing/RootFormOpWriteOne.TD.json | 4 - .../invalidThing/RootFormsEmpty.TD.json | 3 - ...chemaDefinitionArrayItemsNotObject.TD.json | 1 - ...aDefinitionArrayItemsTypeNotString.TD.json | 1 - ...efinitionArrayItemsTypeUnsupported.TD.json | 1 - ...hemaDefinitionIntegerMaxNotNumeric.TD.json | 1 - ...hemaDefinitionIntegerMinNotNumeric.TD.json | 1 - ...onMapAdditionalPropertiesNotObject.TD.json | 1 - ...pAdditionalPropertiesTypeNotString.TD.json | 1 - ...dditionalPropertiesTypeUnsupported.TD.json | 1 - ...chemaDefinitionNumberMaxNotNumeric.TD.json | 1 - ...chemaDefinitionNumberMinNotNumeric.TD.json | 1 - ...ObjectConstPropertyTypeUnsupported.TD.json | 1 - ...initionObjectPropertyTypeNotString.TD.json | 1 - ...itionObjectPropertyTypeUnsupported.TD.json | 1 - ...aDefinitionObjectRequiredNotString.TD.json | 1 - ...tionStringContentEncodingNotString.TD.json | 1 - ...emaDefinitionStringFormatNotString.TD.json | 1 - ...maDefinitionStringPatternNotString.TD.json | 1 - .../SchemaDefinitionTypeNotString.TD.json | 1 - .../SchemaDefinitionTypeUnsupported.TD.json | 1 - .../invalidThing/TitleNotString.TD.json | 1 - .../invalidThing/TypeEmpty.TD.json | 1 - .../invalidThing/TypeNotThingModel.TD.json | 1 - .../IdInvalidReplacementButNotInTopic.TD.json | 24 --- .../valid/LinkNoRel.TD.json | 1 - .../valid/LinkOtherRel.TD.json | 1 - .../thing-descriptions/valid/Noop.TD.json | 1 - ...eadablePropertyAdditionalResponses.TD.json | 3 - ...ritablePropertyAdditionalResponses.TD.json | 4 - 529 files changed, 274 insertions(+), 862 deletions(-) delete mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/IdInvalidReplacementButNotInTopic.json delete mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/IdInvalidReplacementButNotInTopic.TD.json diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs index 4b6d4e2cfb..1a5bb5218e 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs @@ -190,11 +190,6 @@ private void CheckSchemaDefinitionsCoverage(MapTracker? schemaDefi private bool TryValidateRootForms(ArrayTracker? forms, MapTracker? schemaDefinitions, HashSet serializationFormats) { - if (forms?.Elements == null) - { - return true; - } - if (!TryValidateForms(forms, FormsKind.Root, schemaDefinitions, out ValueTracker? contentType)) { return false; @@ -205,12 +200,12 @@ private bool TryValidateRootForms(ArrayTracker? forms, MapTracker> aggregateOps = forms.Elements.SelectMany(form => form.Value.Op?.Elements ?? new()).ToList(); + List> aggregateOps = forms?.Elements?.SelectMany(form => form.Value.Op?.Elements ?? new()).ToList() ?? new(); ValueTracker? writeMultiOp = aggregateOps.FirstOrDefault(op => op.Value.Value == TDValues.OpWriteMultProps); ValueTracker? readAllOp = aggregateOps.FirstOrDefault(op => op.Value.Value == TDValues.OpReadAllProps); if (writeMultiOp != null && readAllOp == null) { - errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"'{TDThing.FormsName}' array contains '{TDForm.OpName}' property with value '{TDValues.OpWriteMultProps}' but no '{TDForm.OpName}' property with value '{TDValues.OpReadAllProps}'.", writeMultiOp.TokenIndex, forms.TokenIndex); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"'{TDThing.FormsName}' array contains '{TDForm.OpName}' property with value '{TDValues.OpWriteMultProps}' but no '{TDForm.OpName}' property with value '{TDValues.OpReadAllProps}'.", writeMultiOp.TokenIndex, forms?.TokenIndex ?? -1); return false; } @@ -255,7 +250,7 @@ private bool TryValidateCrossFormConsistency(ArrayTracker? rootForms, Ma properties?.TokenIndex ?? -1); hasError = true; } - else if (aggregateReadHasAdditionalResponses && !properties.Entries.Any(p => p.Value.Value.Forms!.Elements!.Any(f => (f.Value.Op?.Elements?.Any(op => op.Value.Value == TDValues.OpReadProp) ?? true) && (f.Value.AdditionalResponses?.Elements?.Count ?? 0) > 0))) + else if (aggregateReadHasAdditionalResponses && !properties.Entries.Any(p => p.Value.Value.Forms?.Elements?.Any(f => (f.Value.Op?.Elements?.Any(op => op.Value.Value == TDValues.OpReadProp) ?? true) && (f.Value.AdditionalResponses?.Elements?.Count ?? 0) > 0) ?? false)) { errorReporter.ReportWarning($"Root-level form has '{TDForm.OpName}' value of '{TDValues.OpReadAllProps}' and an '{TDForm.AdditionalResponsesName}' value; however, no readable '{TDThing.PropertiesName}' element has a form with an '{TDForm.AdditionalResponsesName}' value to aggregate.", readAllForm.TokenIndex, @@ -265,14 +260,14 @@ private bool TryValidateCrossFormConsistency(ArrayTracker? rootForms, Ma if (writeMultiForm != null) { - if (properties?.Entries == null || properties.Entries.Count(p => p.Value.Value.ReadOnly?.Value.Value != true && p.Value.Value.Forms!.Elements!.Any(f => f.Value.Op?.Elements?.Any(op => op.Value.Value == TDValues.OpWriteProp) ?? true)) == 0) + if (properties?.Entries == null || properties.Entries.Count(p => p.Value.Value.ReadOnly?.Value.Value != true && (p.Value.Value.Forms?.Elements?.Any(f => f.Value.Op?.Elements?.Any(op => op.Value.Value == TDValues.OpWriteProp) ?? true) ?? true)) == 0) { errorReporter.ReportError(ErrorCondition.Unusable, $"Root-level form has '{TDForm.OpName}' property with value '{TDValues.OpWriteMultProps}' to write a selected aggregation of writable properties, but Thing Description has no writable properties.", writeMultiForm.Value.Op!.Elements!.First(op => op.Value.Value == TDValues.OpWriteMultProps).TokenIndex, properties?.TokenIndex ?? -1); hasError = true; } - else if (aggregateWriteHasAdditionalResponses && !properties.Entries.Any(p => p.Value.Value.ReadOnly?.Value.Value != true && p.Value.Value.Forms!.Elements!.Any(f => (f.Value.Op?.Elements?.Any(op => op.Value.Value == TDValues.OpWriteProp) ?? true) && (f.Value.AdditionalResponses?.Elements?.Count ?? 0) > 0))) + else if (aggregateWriteHasAdditionalResponses && !properties.Entries.Any(p => p.Value.Value.ReadOnly?.Value.Value != true && (p.Value.Value.Forms?.Elements?.Any(f => (f.Value.Op?.Elements?.Any(op => op.Value.Value == TDValues.OpWriteProp) ?? true) && (f.Value.AdditionalResponses?.Elements?.Count ?? 0) > 0) ?? false))) { errorReporter.ReportWarning($"Root-level form has '{TDForm.OpName}' value of '{TDValues.OpWriteMultProps}' and an '{TDForm.AdditionalResponsesName}' value; however, no writable '{TDThing.PropertiesName}' element has a form with an '{TDForm.AdditionalResponsesName}' value to aggregate.", writeMultiForm.TokenIndex, @@ -284,63 +279,76 @@ private bool TryValidateCrossFormConsistency(ArrayTracker? rootForms, Ma { foreach (KeyValuePair> prop in properties.Entries) { - foreach (ValueTracker form in prop.Value.Value.Forms!.Elements!) + if (prop.Value.Value.Forms?.Elements == null) { - bool propFormHasAdditionalResponses = (form.Value.AdditionalResponses?.Elements?.Count ?? 0) > 0; - - if (form.Value.Topic == null) + if (readAllForm == null) { - if (form.Value.Op == null) - { - if (readAllForm == null) - { - errorReporter.ReportError(ErrorCondition.Unusable, $"Property '{prop.Key}' has '{TDProperty.FormsName}' element with no '{TDForm.TopicName}' property, so it cannot be read individually; however, there is no root-level form with an '{TDForm.OpName}' property that has value '{TDValues.OpReadAllProps}', so this property also cannot be read in aggregate.", - form.TokenIndex, - rootForms?.TokenIndex ?? -1); - hasError = true; - } - else if (propFormHasAdditionalResponses && !aggregateReadHasAdditionalResponses && !aggregateWriteHasAdditionalResponses) - { - errorReporter.ReportError(ErrorCondition.Unusable, $"Property '{prop.Key}' has '{TDProperty.FormsName}' element with no '{TDForm.TopicName}' property, so its '{TDForm.AdditionalResponsesName}' value cannot be returned on an individual read or write, nor can it be returned on an aggregate read or write because no root-level form with '{TDForm.OpName}' value of '{TDValues.OpReadAllProps}' or '{TDValues.OpWriteMultProps}' has an '{TDForm.AdditionalResponsesName}' value.", - form.TokenIndex, - rootForms?.TokenIndex ?? -1); - hasError = true; - } - } + errorReporter.ReportError(ErrorCondition.Unusable, $"Property '{prop.Key}' has no '{TDProperty.FormsName}' property, so it cannot be read individually; however, there is no root-level form with an '{TDForm.OpName}' property that has value '{TDValues.OpReadAllProps}', so this property also cannot be read in aggregate.", + prop.Value.TokenIndex, + rootForms?.TokenIndex ?? -1); + hasError = true; + } + } + else + { + foreach (ValueTracker form in prop.Value.Value.Forms.Elements) + { + bool propFormHasAdditionalResponses = (form.Value.AdditionalResponses?.Elements?.Count ?? 0) > 0; - if (form.Value.Op?.Elements != null && form.Value.Op.Elements.Any(op => op.Value.Value == TDValues.OpReadProp)) + if (form.Value.Topic == null) { - if (readAllForm == null) + if (form.Value.Op == null) { - errorReporter.ReportError(ErrorCondition.Unusable, $"Property '{prop.Key}' has '{TDProperty.FormsName}' element with '{TDForm.OpName}' value of '{TDValues.OpReadProp}' but no '{TDForm.TopicName}' property, so it cannot be read individually; however, there is no root-level form with an '{TDForm.OpName}' property that has value '{TDValues.OpReadAllProps}', so this property also cannot be read in aggregate.", - form.TokenIndex, - rootForms?.TokenIndex ?? -1); - hasError = true; - } - else if (propFormHasAdditionalResponses && !aggregateReadHasAdditionalResponses) - { - errorReporter.ReportError(ErrorCondition.Unusable, $"Property '{prop.Key}' has '{TDProperty.FormsName}' element with '{TDForm.OpName}' value of '{TDValues.OpReadProp}' but no '{TDForm.TopicName}' property, so its '{TDForm.AdditionalResponsesName}' value cannot be returned on an individual read, nor can it be returned on an aggregate read because the root-level form with '{TDForm.OpName}' value of '{TDValues.OpReadAllProps}' has no '{TDForm.AdditionalResponsesName}' value.", - form.TokenIndex, - readAllForm.TokenIndex); - hasError = true; + if (readAllForm == null) + { + errorReporter.ReportError(ErrorCondition.Unusable, $"Property '{prop.Key}' has '{TDProperty.FormsName}' element with no '{TDForm.TopicName}' property, so it cannot be read individually; however, there is no root-level form with an '{TDForm.OpName}' property that has value '{TDValues.OpReadAllProps}', so this property also cannot be read in aggregate.", + form.TokenIndex, + rootForms?.TokenIndex ?? -1); + hasError = true; + } + else if (propFormHasAdditionalResponses && !aggregateReadHasAdditionalResponses && !aggregateWriteHasAdditionalResponses) + { + errorReporter.ReportError(ErrorCondition.Unusable, $"Property '{prop.Key}' has '{TDProperty.FormsName}' element with no '{TDForm.TopicName}' property, so its '{TDForm.AdditionalResponsesName}' value cannot be returned on an individual read or write, nor can it be returned on an aggregate read or write because no root-level form with '{TDForm.OpName}' value of '{TDValues.OpReadAllProps}' or '{TDValues.OpWriteMultProps}' has an '{TDForm.AdditionalResponsesName}' value.", + form.TokenIndex, + rootForms?.TokenIndex ?? -1); + hasError = true; + } } - } - if (form.Value.Op?.Elements != null && form.Value.Op.Elements.Any(op => op.Value.Value == TDValues.OpWriteProp)) - { - if (writeMultiForm == null) + if (form.Value.Op?.Elements != null && form.Value.Op.Elements.Any(op => op.Value.Value == TDValues.OpReadProp)) { - errorReporter.ReportError(ErrorCondition.Unusable, $"Property '{prop.Key}' has '{TDProperty.FormsName}' element with '{TDForm.OpName}' value of '{TDValues.OpWriteProp}' but no '{TDForm.TopicName}' property, so it cannot be written individually; however, there is no root-level form with an '{TDForm.OpName}' property that has value '{TDValues.OpWriteMultProps}', so this property also cannot be written in aggregate.", - form.TokenIndex, - rootForms?.TokenIndex ?? -1); - hasError = true; + if (readAllForm == null) + { + errorReporter.ReportError(ErrorCondition.Unusable, $"Property '{prop.Key}' has '{TDProperty.FormsName}' element with '{TDForm.OpName}' value of '{TDValues.OpReadProp}' but no '{TDForm.TopicName}' property, so it cannot be read individually; however, there is no root-level form with an '{TDForm.OpName}' property that has value '{TDValues.OpReadAllProps}', so this property also cannot be read in aggregate.", + form.TokenIndex, + rootForms?.TokenIndex ?? -1); + hasError = true; + } + else if (propFormHasAdditionalResponses && !aggregateReadHasAdditionalResponses) + { + errorReporter.ReportError(ErrorCondition.Unusable, $"Property '{prop.Key}' has '{TDProperty.FormsName}' element with '{TDForm.OpName}' value of '{TDValues.OpReadProp}' but no '{TDForm.TopicName}' property, so its '{TDForm.AdditionalResponsesName}' value cannot be returned on an individual read, nor can it be returned on an aggregate read because the root-level form with '{TDForm.OpName}' value of '{TDValues.OpReadAllProps}' has no '{TDForm.AdditionalResponsesName}' value.", + form.TokenIndex, + readAllForm.TokenIndex); + hasError = true; + } } - else if (propFormHasAdditionalResponses && (writeMultiForm.Value.AdditionalResponses?.Elements?.Count ?? 0) == 0) + + if (form.Value.Op?.Elements != null && form.Value.Op.Elements.Any(op => op.Value.Value == TDValues.OpWriteProp)) { - errorReporter.ReportError(ErrorCondition.Unusable, $"Property '{prop.Key}' has '{TDProperty.FormsName}' element with '{TDForm.OpName}' value of '{TDValues.OpWriteProp}' but no '{TDForm.TopicName}' property, so its '{TDForm.AdditionalResponsesName}' value cannot be returned on an individual write, nor can it be returned on an aggregate write because the root-level form with '{TDForm.OpName}' value of '{TDValues.OpWriteMultProps}' has no '{TDForm.AdditionalResponsesName}' value.", - form.TokenIndex, - writeMultiForm.TokenIndex); - hasError = true; + if (writeMultiForm == null) + { + errorReporter.ReportError(ErrorCondition.Unusable, $"Property '{prop.Key}' has '{TDProperty.FormsName}' element with '{TDForm.OpName}' value of '{TDValues.OpWriteProp}' but no '{TDForm.TopicName}' property, so it cannot be written individually; however, there is no root-level form with an '{TDForm.OpName}' property that has value '{TDValues.OpWriteMultProps}', so this property also cannot be written in aggregate.", + form.TokenIndex, + rootForms?.TokenIndex ?? -1); + hasError = true; + } + else if (propFormHasAdditionalResponses && (writeMultiForm.Value.AdditionalResponses?.Elements?.Count ?? 0) == 0) + { + errorReporter.ReportError(ErrorCondition.Unusable, $"Property '{prop.Key}' has '{TDProperty.FormsName}' element with '{TDForm.OpName}' value of '{TDValues.OpWriteProp}' but no '{TDForm.TopicName}' property, so its '{TDForm.AdditionalResponsesName}' value cannot be returned on an individual write, nor can it be returned on an aggregate write because the root-level form with '{TDForm.OpName}' value of '{TDValues.OpWriteMultProps}' has no '{TDForm.AdditionalResponsesName}' value.", + form.TokenIndex, + writeMultiForm.TokenIndex); + hasError = true; + } } } } @@ -618,13 +626,7 @@ private bool TryValidateActions(MapTracker? actions, MapTracker action, MapTracker? schemaDefinitions, out ValueTracker? contentType) { - if (action.Value.Forms == null) - { - errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Action '{name}' element is missing required '{TDAction.FormsName}' property.", action.TokenIndex); - contentType = null; - return false; - } - else if (!TryValidateForms(action.Value.Forms, FormsKind.Action, schemaDefinitions, out contentType)) + if (!TryValidateForms(action.Value.Forms, FormsKind.Action, schemaDefinitions, out contentType)) { return false; } @@ -701,13 +703,7 @@ private bool TryValidateProperties(MapTracker? properties, MapTracke private bool TryValidateProperty(string name, ValueTracker property, MapTracker? schemaDefinitions, out ValueTracker? contentType) { - if (property.Value.Forms == null) - { - errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Property '{name}' element is missing required '{TDProperty.FormsName}' property.", property.TokenIndex); - contentType = null; - return false; - } - else if (!TryValidatePropertyForms(name, property.Value.Forms, schemaDefinitions, property.Value.ReadOnly, out contentType)) + if (!TryValidatePropertyForms(name, property.Value.Forms, schemaDefinitions, property.Value.ReadOnly, out contentType)) { return false; } @@ -720,7 +716,7 @@ private bool TryValidateProperty(string name, ValueTracker property, return true; } - private bool TryValidatePropertyForms(string name, ArrayTracker forms, MapTracker? schemaDefinitions, ValueTracker? readOnly, out ValueTracker? contentType) + private bool TryValidatePropertyForms(string name, ArrayTracker? forms, MapTracker? schemaDefinitions, ValueTracker? readOnly, out ValueTracker? contentType) { bool isReadOnly = readOnly?.Value.Value == true; @@ -731,7 +727,7 @@ private bool TryValidatePropertyForms(string name, ArrayTracker forms, M bool hasError = false; - List> aggregateOps = forms.Elements!.SelectMany(form => form.Value.Op?.Elements ?? new()).ToList(); + List> aggregateOps = forms?.Elements?.SelectMany(form => form.Value.Op?.Elements ?? new())?.ToList() ?? new(); ValueTracker? writeOp = aggregateOps.FirstOrDefault(op => op.Value.Value == TDValues.OpWriteProp); ValueTracker? readOp = aggregateOps.FirstOrDefault(op => op.Value.Value == TDValues.OpReadProp); @@ -744,16 +740,16 @@ private bool TryValidatePropertyForms(string name, ArrayTracker forms, M } if (readOp == null) { - errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"'{TDProperty.FormsName}' array contains '{TDForm.OpName}' property with value '{TDValues.OpWriteProp}' but no '{TDForm.OpName}' property with value '{TDValues.OpReadProp}'.", writeOp.TokenIndex, forms.TokenIndex); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"'{TDProperty.FormsName}' array contains '{TDForm.OpName}' property with value '{TDValues.OpWriteProp}' but no '{TDForm.OpName}' property with value '{TDValues.OpReadProp}'.", writeOp.TokenIndex, forms?.TokenIndex ?? -1); hasError = true; } else { - ValueTracker? topicalWriteForm = forms.Elements!.FirstOrDefault(form => form.Value.Topic != null && (form.Value.Op?.Elements?.Any(op => op.Value.Value == TDValues.OpWriteProp) ?? false)); - bool hasTopicalReadForm = forms.Elements!.Any(form => form.Value.Topic != null && (form.Value.Op?.Elements?.Any(op => op.Value.Value == TDValues.OpReadProp) ?? false)); + ValueTracker? topicalWriteForm = forms?.Elements?.FirstOrDefault(form => form.Value.Topic != null && (form.Value.Op?.Elements?.Any(op => op.Value.Value == TDValues.OpWriteProp) ?? false)); + bool hasTopicalReadForm = forms?.Elements?.Any(form => form.Value.Topic != null && (form.Value.Op?.Elements?.Any(op => op.Value.Value == TDValues.OpReadProp) ?? false)) ?? false; if (topicalWriteForm != null && !hasTopicalReadForm) { - errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"'{TDProperty.FormsName}' array contains entry with '{TDForm.TopicName}' property and '{TDForm.OpName}' property with value '{TDValues.OpWriteProp}' but no entry with '{TDForm.TopicName}' property and '{TDForm.OpName}' property with value '{TDValues.OpReadProp}'.", topicalWriteForm.TokenIndex, forms.TokenIndex); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"'{TDProperty.FormsName}' array contains entry with '{TDForm.TopicName}' property and '{TDForm.OpName}' property with value '{TDValues.OpWriteProp}' but no entry with '{TDForm.TopicName}' property and '{TDForm.OpName}' property with value '{TDValues.OpReadProp}'.", topicalWriteForm.TokenIndex, forms?.TokenIndex ?? -1); hasError = true; } } @@ -800,13 +796,7 @@ private bool TryValidateEvents(MapTracker? evts, MapTracker evt, MapTracker? schemaDefinitions, out ValueTracker? contentType) { - if (evt.Value.Forms == null) - { - errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Event '{name}' element is missing required '{TDEvent.FormsName}' property.", evt.TokenIndex); - contentType = null; - return false; - } - else if (!TryValidateForms(evt.Value.Forms, FormsKind.Event, schemaDefinitions, out contentType)) + if (!TryValidateForms(evt.Value.Forms, FormsKind.Event, schemaDefinitions, out contentType)) { return false; } @@ -837,10 +827,15 @@ private bool TryValidateEvent(string name, ValueTracker evt, MapTracker return !hasError; } - private bool TryValidateForms(ArrayTracker forms, FormsKind formsKind, MapTracker? schemaDefinitions, out ValueTracker? contentType, bool isReadOnly = false) + private bool TryValidateForms(ArrayTracker? forms, FormsKind formsKind, MapTracker? schemaDefinitions, out ValueTracker? contentType, bool isReadOnly = false) { contentType = null; + if (forms?.Elements == null) + { + return true; + } + if (forms.Elements!.Count == 0) { errorReporter.ReportError(ErrorCondition.ElementMissing, $"Property '{TDEvent.FormsName}' array value contains no elements; at least one form is required.", forms.TokenIndex); @@ -899,17 +894,6 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map { bool hasError = false; - if (form.Value.Href == null) - { - errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Form is missing required '{TDForm.HrefName}' property.", form.TokenIndex); - hasError = true; - } - else if (string.IsNullOrWhiteSpace(form.Value.Href.Value.Value)) - { - errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Form '{TDForm.HrefName}' property has empty value.", form.Value.Href.TokenIndex); - hasError = true; - } - if (form.Value.Op?.Elements == null) { if (formsKind == FormsKind.Root) @@ -1129,7 +1113,7 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map foreach (KeyValuePair propertyName in form.Value.PropertyNames) { - if (propertyName.Key != TDForm.HrefName && propertyName.Key != TDForm.ContentTypeName && propertyName.Key != TDForm.AdditionalResponsesName && propertyName.Key != TDForm.HeaderInfoName && propertyName.Key != TDForm.HeaderCodeName && propertyName.Key != TDForm.ServiceGroupIdName && propertyName.Key != TDForm.TopicName && propertyName.Key != TDForm.OpName) + if (propertyName.Key != TDForm.ContentTypeName && propertyName.Key != TDForm.AdditionalResponsesName && propertyName.Key != TDForm.HeaderInfoName && propertyName.Key != TDForm.HeaderCodeName && propertyName.Key != TDForm.ServiceGroupIdName && propertyName.Key != TDForm.TopicName && propertyName.Key != TDForm.OpName) { if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) { diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDForm.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDForm.cs index ffb5e9b3d8..b665a3d8cd 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDForm.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDForm.cs @@ -6,7 +6,6 @@ public class TDForm : IEquatable, IDeserializable { - public const string HrefName = "href"; public const string ContentTypeName = "contentType"; public const string AdditionalResponsesName = "additionalResponses"; public const string HeaderInfoName = "dtv:headerInfo"; @@ -15,8 +14,6 @@ public class TDForm : IEquatable, IDeserializable public const string TopicName = "dtv:topic"; public const string OpName = "op"; - public ValueTracker? Href { get; set; } - public ValueTracker? ContentType { get; set; } public ArrayTracker? AdditionalResponses { get; set; } @@ -41,8 +38,7 @@ public virtual bool Equals(TDForm? other) } else { - return Href == other.Href && - ContentType == other.ContentType && + return ContentType == other.ContentType && AdditionalResponses == other.AdditionalResponses && HeaderInfo == other.HeaderInfo && HeaderCode == other.HeaderCode && @@ -54,7 +50,7 @@ public virtual bool Equals(TDForm? other) public override int GetHashCode() { - return (Href, ContentType, AdditionalResponses, HeaderInfo, HeaderCode, ServiceGroupId, Topic, Op).GetHashCode(); + return (ContentType, AdditionalResponses, HeaderInfo, HeaderCode, ServiceGroupId, Topic, Op).GetHashCode(); } public static bool operator ==(TDForm? left, TDForm? right) @@ -96,13 +92,6 @@ public override bool Equals(object? obj) public IEnumerable Traverse() { - if (Href != null) - { - foreach (ITraversable item in Href.Traverse()) - { - yield return item; - } - } if (ContentType != null) { foreach (ITraversable item in ContentType.Traverse()) @@ -173,9 +162,6 @@ public static TDForm Deserialize(ref Utf8JsonReader reader) switch (propertyName) { - case HrefName: - form.Href = ValueTracker.Deserialize(ref reader, HrefName); - break; case ContentTypeName: form.ContentType = ValueTracker.Deserialize(ref reader, ContentTypeName); break; diff --git a/codegen2/src/TDParse/Program.cs b/codegen2/src/TDParse/Program.cs index fdc2cb649a..2dd48a0f60 100644 --- a/codegen2/src/TDParse/Program.cs +++ b/codegen2/src/TDParse/Program.cs @@ -42,7 +42,6 @@ static void Main(string[] args) { foreach (var form in thing.Forms.Elements) { - Console.WriteLine($"Form href: {form.Value.Href}"); if (form.Value.ContentType != null) { Console.WriteLine($" ContentType: {form.Value.ContentType}"); diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeEmpty.json index 2ca2235f98..92e57d7c40 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "ActionFormAdditionalResponseContentTypeEmpty.TD.json", - "line": 37, + "line": 36, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeText.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeText.json index f0667eed12..3ec0f208b6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeText.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeText.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "ActionFormAdditionalResponseContentTypeText.TD.json", - "line": 37, + "line": 36, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoMatchingSchemaDefinition.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoMatchingSchemaDefinition.json index 58d565a875..b0034e12b5 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoMatchingSchemaDefinition.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoMatchingSchemaDefinition.json @@ -8,7 +8,7 @@ { "condition": "ItemNotFound", "filename": "ActionFormAdditionalResponseNoMatchingSchemaDefinition.TD.json", - "line": 29, + "line": 28, "cfLine": 8, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchema.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchema.json index c516a47a8d..5a201039e0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchema.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchema.json @@ -8,7 +8,7 @@ { "condition": "PropertyMissing", "filename": "ActionFormAdditionalResponseNoSchema.TD.json", - "line": 35, + "line": 34, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchemaDefinitions.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchemaDefinitions.json index b14de437cf..780e982d19 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchemaDefinitions.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchemaDefinitions.json @@ -8,7 +8,7 @@ { "condition": "ItemNotFound", "filename": "ActionFormAdditionalResponseNoSchemaDefinitions.TD.json", - "line": 19, + "line": 18, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSuccess.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSuccess.json index 48aa375c9c..5ed8b06de5 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSuccess.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSuccess.json @@ -8,7 +8,7 @@ { "condition": "PropertyMissing", "filename": "ActionFormAdditionalResponseNoSuccess.TD.json", - "line": 34, + "line": 33, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionMap.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionMap.json index 4174f132cc..102c68662e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionMap.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionMap.json @@ -8,7 +8,7 @@ { "condition": "TypeMismatch", "filename": "ActionFormAdditionalResponseSchemaDefinitionMap.TD.json", - "line": 34, + "line": 33, "cfLine": 16, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionNotObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionNotObject.json index 3d9496f9ca..fb81bfc125 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionNotObject.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionNotObject.json @@ -8,7 +8,7 @@ { "condition": "TypeMismatch", "filename": "ActionFormAdditionalResponseSchemaDefinitionNotObject.TD.json", - "line": 36, + "line": 35, "cfLine": 9, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaEmpty.json index a9bdf71cbe..72a8136510 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "ActionFormAdditionalResponseSchemaEmpty.TD.json", - "line": 37, + "line": 36, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSuccessTrue.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSuccessTrue.json index e0bdc23845..c267c84ad3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSuccessTrue.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSuccessTrue.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "ActionFormAdditionalResponseSuccessTrue.TD.json", - "line": 35, + "line": 34, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseUnsupportedProperty.json index 9fd3fa6a1b..78c00e2313 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseUnsupportedProperty.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "ActionFormAdditionalResponseUnsupportedProperty.TD.json", - "line": 38, + "line": 37, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponsesMultiple.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponsesMultiple.json index 6acbb2580d..7a5de39dfb 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponsesMultiple.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponsesMultiple.json @@ -8,7 +8,7 @@ { "condition": "ElementsPlural", "filename": "ActionFormAdditionalResponsesMultiple.TD.json", - "line": 34, + "line": 33, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormContentTypeText.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormContentTypeText.json index ba0f010302..3f243c2b1d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormContentTypeText.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormContentTypeText.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "ActionFormContentTypeText.TD.json", - "line": 13, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeEmpty.json index 16c2d3b38f..080d3a7a74 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "ActionFormHeaderCodeEmpty.TD.json", - "line": 16, + "line": 15, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoMatchingSchemaDefinition.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoMatchingSchemaDefinition.json index 723c4f006f..5e4bd7e4d3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoMatchingSchemaDefinition.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoMatchingSchemaDefinition.json @@ -8,7 +8,7 @@ { "condition": "ItemNotFound", "filename": "ActionFormHeaderCodeNoMatchingSchemaDefinition.TD.json", - "line": 21, + "line": 20, "cfLine": 8, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoSchemaDefinitions.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoSchemaDefinitions.json index 9c02898df3..4efc9a32de 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoSchemaDefinitions.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoSchemaDefinitions.json @@ -8,7 +8,7 @@ { "condition": "ItemNotFound", "filename": "ActionFormHeaderCodeNoSchemaDefinitions.TD.json", - "line": 16, + "line": 15, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeSchemaDefinitionNotEnum.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeSchemaDefinitionNotEnum.json index 51ccefd397..2615f64756 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeSchemaDefinitionNotEnum.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeSchemaDefinitionNotEnum.json @@ -8,7 +8,7 @@ { "condition": "TypeMismatch", "filename": "ActionFormHeaderCodeSchemaDefinitionNotEnum.TD.json", - "line": 21, + "line": 20, "cfLine": 9, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeEmpty.json index 06c9a411fd..d7fe91fce7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "ActionFormHeaderInfoContentTypeEmpty.TD.json", - "line": 37, + "line": 36, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeNotJson.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeNotJson.json index e8d039c800..a5161c4b9f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeNotJson.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeNotJson.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "ActionFormHeaderInfoContentTypeNotJson.TD.json", - "line": 37, + "line": 36, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoContentType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoContentType.json index c69e1455ba..4e571586ce 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoContentType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoContentType.json @@ -8,7 +8,7 @@ { "condition": "PropertyMissing", "filename": "ActionFormHeaderInfoNoContentType.TD.json", - "line": 34, + "line": 33, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoMatchingSchemaDefinition.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoMatchingSchemaDefinition.json index d225470505..448f598a58 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoMatchingSchemaDefinition.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoMatchingSchemaDefinition.json @@ -8,7 +8,7 @@ { "condition": "ItemNotFound", "filename": "ActionFormHeaderInfoNoMatchingSchemaDefinition.TD.json", - "line": 29, + "line": 28, "cfLine": 8, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchema.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchema.json index fae238900f..ae31b26901 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchema.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchema.json @@ -8,7 +8,7 @@ { "condition": "PropertyMissing", "filename": "ActionFormHeaderInfoNoSchema.TD.json", - "line": 35, + "line": 34, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchemaDefinitions.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchemaDefinitions.json index 112636dd34..c2d4fb0d3a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchemaDefinitions.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchemaDefinitions.json @@ -8,7 +8,7 @@ { "condition": "ItemNotFound", "filename": "ActionFormHeaderInfoNoSchemaDefinitions.TD.json", - "line": 19, + "line": 18, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionMap.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionMap.json index 28e10b955f..094f28375b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionMap.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionMap.json @@ -8,7 +8,7 @@ { "condition": "TypeMismatch", "filename": "ActionFormHeaderInfoSchemaDefinitionMap.TD.json", - "line": 34, + "line": 33, "cfLine": 16, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionNotObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionNotObject.json index 9bf469cc6f..2a08e1af57 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionNotObject.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionNotObject.json @@ -8,7 +8,7 @@ { "condition": "TypeMismatch", "filename": "ActionFormHeaderInfoSchemaDefinitionNotObject.TD.json", - "line": 36, + "line": 35, "cfLine": 9, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaEmpty.json index a76ea58cf0..61c1ec5856 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "ActionFormHeaderInfoSchemaEmpty.TD.json", - "line": 37, + "line": 36, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSuccessTrue.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSuccessTrue.json index fda8d980f8..e9c5787d07 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSuccessTrue.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSuccessTrue.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "ActionFormHeaderInfoSuccessTrue.TD.json", - "line": 35, + "line": 34, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoUnsupportedProperty.json index 0e91fe3eb7..b58ce6779c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoUnsupportedProperty.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "ActionFormHeaderInfoUnsupportedProperty.TD.json", - "line": 38, + "line": 37, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfosMultiple.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfosMultiple.json index 6e095435c6..b979825bb2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfosMultiple.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfosMultiple.json @@ -8,7 +8,7 @@ { "condition": "ElementsPlural", "filename": "ActionFormHeaderInfosMultiple.TD.json", - "line": 34, + "line": 33, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpInvokeDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpInvokeDuplicate.json index ee826dfbb1..cde13a0f30 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpInvokeDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpInvokeDuplicate.json @@ -8,7 +8,7 @@ { "condition": "Duplication", "filename": "ActionFormOpInvokeDuplicate.TD.json", - "line": 15, + "line": 14, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpRead.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpRead.json index d7f98a805d..6e8bb21e78 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpRead.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpRead.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "ActionFormOpRead.TD.json", - "line": 15, + "line": 14, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpSub.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpSub.json index 17b74459f4..ce3d2f9246 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpSub.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpSub.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "ActionFormOpSub.TD.json", - "line": 15, + "line": 14, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpWrite.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpWrite.json index a26e9ba9b2..cb7dd2fbb0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpWrite.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpWrite.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "ActionFormOpWrite.TD.json", - "line": 15, + "line": 14, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormServiceGroupEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormServiceGroupEmpty.json index dd080cc93b..69dca2d246 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormServiceGroupEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormServiceGroupEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "ActionFormServiceGroupEmpty.TD.json", - "line": 16, + "line": 15, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicNoContentType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicNoContentType.json index c462bbd695..c4e15afdb0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicNoContentType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicNoContentType.json @@ -9,7 +9,7 @@ "condition": "ValuesInconsistent", "filename": "ActionFormTopicNoContentType.TD.json", "line": 11, - "cfLine": 13, + "cfLine": 12, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenAction.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenAction.json index 2cf3f61640..924afccb4a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenAction.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenAction.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "ActionFormTopicTokenAction.TD.json", - "line": 14, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenConsumerId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenConsumerId.json index 1dfffcd920..940ce0dfb1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenConsumerId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenConsumerId.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "ActionFormTopicTokenConsumerId.TD.json", - "line": 14, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenMaintainerId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenMaintainerId.json index 4b2f91eb8d..ef0ab2d926 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenMaintainerId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenMaintainerId.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "ActionFormTopicTokenMaintainerId.TD.json", - "line": 14, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenSenderId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenSenderId.json index 5f25781c81..9b9a6adbda 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenSenderId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenSenderId.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "ActionFormTopicTokenSenderId.TD.json", - "line": 14, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormUnsupportedProperty.json index e026a721b5..37557d0103 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormUnsupportedProperty.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "ActionFormUnsupportedProperty.TD.json", - "line": 16, + "line": 15, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsMultipleContentTypes.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsMultipleContentTypes.json index 28893651b0..578f79e348 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsMultipleContentTypes.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsMultipleContentTypes.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "ActionFormsMultipleContentTypes.TD.json", - "line": 13, - "cfLine": 19, + "line": 12, + "cfLine": 17, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOpInvokeDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOpInvokeDuplicate.json index c48f9beda8..1afd51a4dc 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOpInvokeDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOpInvokeDuplicate.json @@ -8,8 +8,8 @@ { "condition": "Duplication", "filename": "ActionFormsOpInvokeDuplicate.TD.json", - "line": 15, - "cfLine": 21, + "line": 14, + "cfLine": 19, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessAndInvoke.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessAndInvoke.json index a263b7002e..69b15c6aa6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessAndInvoke.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessAndInvoke.json @@ -8,7 +8,7 @@ { "condition": "ValuesInconsistent", "filename": "ActionFormsOplessAndInvoke.TD.json", - "line": 17, + "line": 16, "cfLine": 10, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNullAndContentTypeJson.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNullAndContentTypeJson.json index 596de17e0b..6973821144 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNullAndContentTypeJson.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNullAndContentTypeJson.json @@ -9,7 +9,7 @@ "condition": "ValuesInconsistent", "filename": "ActionInputNullAndContentTypeJson.TD.json", "line": 11, - "cfLine": 16, + "cfLine": 15, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeCustom.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeCustom.json index 3d0759a3c1..9f2fa5f5ae 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeCustom.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeCustom.json @@ -9,7 +9,7 @@ "condition": "ValuesInconsistent", "filename": "ActionInputObjectAndContentTypeCustom.TD.json", "line": 11, - "cfLine": 21, + "cfLine": 20, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeRaw.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeRaw.json index 2b4b1fdbef..e043cd395c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeRaw.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeRaw.json @@ -9,7 +9,7 @@ "condition": "ValuesInconsistent", "filename": "ActionInputObjectAndContentTypeRaw.TD.json", "line": 11, - "cfLine": 21, + "cfLine": 20, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoForms.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoForms.json index 3e9fe52eae..4b7abf350d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoForms.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoForms.json @@ -6,7 +6,7 @@ }, "errors": [ { - "condition": "PropertyMissing", + "condition": "Unusable", "filename": "ActionNoForms.TD.json", "line": 9, "cfLine": 0, diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNullAndContentTypeJson.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNullAndContentTypeJson.json index 917432df00..24da326f3b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNullAndContentTypeJson.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNullAndContentTypeJson.json @@ -9,7 +9,7 @@ "condition": "ValuesInconsistent", "filename": "ActionOutputNullAndContentTypeJson.TD.json", "line": 11, - "cfLine": 16, + "cfLine": 15, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeCustom.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeCustom.json index c8e7c30be6..ee322d2cbb 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeCustom.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeCustom.json @@ -9,7 +9,7 @@ "condition": "ValuesInconsistent", "filename": "ActionOutputObjectAndContentTypeCustom.TD.json", "line": 11, - "cfLine": 21, + "cfLine": 20, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeRaw.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeRaw.json index 855237d838..7b34fedeac 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeRaw.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeRaw.json @@ -9,7 +9,7 @@ "condition": "ValuesInconsistent", "filename": "ActionOutputObjectAndContentTypeRaw.TD.json", "line": 11, - "cfLine": 21, + "cfLine": 20, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionUnsupportedProperty.json index c18d40ab31..410f5a5140 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionUnsupportedProperty.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "ActionUnsupportedProperty.TD.json", - "line": 18, + "line": 17, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ArrayKey.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ArrayKey.json index 3f8b491253..f62631b3ea 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ArrayKey.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ArrayKey.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "ArrayKey.TD.json", - "line": 13, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/BooleanKey.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/BooleanKey.json index 75d124a364..876f58a7bb 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/BooleanKey.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/BooleanKey.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "BooleanKey.TD.json", - "line": 13, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormAdditionalResponses.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormAdditionalResponses.json index 4234974a69..c45a75edad 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormAdditionalResponses.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormAdditionalResponses.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "EventFormAdditionalResponses.TD.json", - "line": 33, + "line": 32, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormContentTypeText.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormContentTypeText.json index 529eea7fd1..3175ffa12c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormContentTypeText.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormContentTypeText.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "EventFormContentTypeText.TD.json", - "line": 20, + "line": 19, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderCode.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderCode.json index 93a06b8f6c..7b218fcee3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderCode.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderCode.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "EventFormHeaderCode.TD.json", - "line": 32, + "line": 31, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderInfo.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderInfo.json index 4ff6952ed9..dec538f1cf 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderInfo.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderInfo.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "EventFormHeaderInfo.TD.json", - "line": 33, + "line": 32, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpInvoke.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpInvoke.json index f068e594ed..2586510d3d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpInvoke.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpInvoke.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "EventFormOpInvoke.TD.json", - "line": 22, + "line": 21, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpRead.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpRead.json index ef86bc5282..71a44c977b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpRead.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpRead.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "EventFormOpRead.TD.json", - "line": 22, + "line": 21, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubAll.json index 116c116357..551b75946e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubAll.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "EventFormOpSubAll.TD.json", - "line": 22, + "line": 21, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubDuplicate.json index b254f0c3ab..6fda50ef0a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubDuplicate.json @@ -8,7 +8,7 @@ { "condition": "Duplication", "filename": "EventFormOpSubDuplicate.TD.json", - "line": 22, + "line": 21, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpWrite.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpWrite.json index 65605cb8c0..1b12c694f2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpWrite.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpWrite.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "EventFormOpWrite.TD.json", - "line": 22, + "line": 21, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormServiceGroupEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormServiceGroupEmpty.json index 53d32ea4fa..7fd53c3d70 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormServiceGroupEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormServiceGroupEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "EventFormServiceGroupEmpty.TD.json", - "line": 23, + "line": 22, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicNoContentType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicNoContentType.json index 1830f0533a..2dc3537585 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicNoContentType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicNoContentType.json @@ -9,7 +9,7 @@ "condition": "ValuesInconsistent", "filename": "EventFormTopicNoContentType.TD.json", "line": 18, - "cfLine": 20, + "cfLine": 19, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenAction.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenAction.json index a01eed912b..1db97a637c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenAction.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenAction.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "EventFormTopicTokenAction.TD.json", - "line": 21, + "line": 20, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenConsumerId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenConsumerId.json index e3fc385084..0f55d3c0e0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenConsumerId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenConsumerId.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "EventFormTopicTokenConsumerId.TD.json", - "line": 21, + "line": 20, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenExecutorId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenExecutorId.json index b2f1829f78..13683cc7bf 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenExecutorId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenExecutorId.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "EventFormTopicTokenExecutorId.TD.json", - "line": 21, + "line": 20, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenInvokerId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenInvokerId.json index 394d8aaf19..624a6538bf 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenInvokerId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenInvokerId.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "EventFormTopicTokenInvokerId.TD.json", - "line": 21, + "line": 20, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenMaintainerId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenMaintainerId.json index 14be19a82e..e51bfedffb 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenMaintainerId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenMaintainerId.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "EventFormTopicTokenMaintainerId.TD.json", - "line": 21, + "line": 20, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormUnsupportedProperty.json index 647b847ce3..bb67f395dc 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormUnsupportedProperty.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "EventFormUnsupportedProperty.TD.json", - "line": 23, + "line": 22, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOpSubDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOpSubDuplicate.json index 7dd933017f..ba4907d2c2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOpSubDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOpSubDuplicate.json @@ -8,8 +8,8 @@ { "condition": "Duplication", "filename": "EventFormsOpSubDuplicate.TD.json", - "line": 22, - "cfLine": 28, + "line": 21, + "cfLine": 26, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessAndSub.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessAndSub.json index fc173b1c2f..b7e30f0be7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessAndSub.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessAndSub.json @@ -8,7 +8,7 @@ { "condition": "ValuesInconsistent", "filename": "EventFormsOplessAndSub.TD.json", - "line": 24, + "line": 23, "cfLine": 17, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoForms.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoForms.json index 50467ca63e..6a55ea8276 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoForms.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoForms.json @@ -6,7 +6,7 @@ }, "errors": [ { - "condition": "PropertyMissing", + "condition": "Unusable", "filename": "EventNoForms.TD.json", "line": 13, "cfLine": 0, diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNullAndContentTypeJson.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNullAndContentTypeJson.json index 48055e6c9b..ca0b9981e6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNullAndContentTypeJson.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNullAndContentTypeJson.json @@ -9,7 +9,7 @@ "condition": "ValuesInconsistent", "filename": "EventNullAndContentTypeJson.TD.json", "line": 15, - "cfLine": 20, + "cfLine": 19, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeCustom.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeCustom.json index 6088e7bb1e..1fa37d242a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeCustom.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeCustom.json @@ -9,7 +9,7 @@ "condition": "ValuesInconsistent", "filename": "EventObjectAndContentTypeCustom.TD.json", "line": 15, - "cfLine": 25, + "cfLine": 24, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeRaw.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeRaw.json index ae10479cc5..005e4d0fc1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeRaw.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeRaw.json @@ -9,7 +9,7 @@ "condition": "ValuesInconsistent", "filename": "EventObjectAndContentTypeRaw.TD.json", "line": 15, - "cfLine": 25, + "cfLine": 24, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventUnsupportedProperty.json index 4ebc23230f..1a3741183c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventUnsupportedProperty.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "EventUnsupportedProperty.TD.json", - "line": 25, + "line": 24, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingColon.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingColon.json index a9ebf8780a..5d8388e896 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingColon.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingColon.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "MissingColon.TD.json", - "line": 13, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingComma.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingComma.json index 7f40d3b2ee..719e80050b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingComma.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingComma.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "MissingComma.TD.json", - "line": 14, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingKey.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingKey.json index db664da81f..1e5906472a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingKey.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingKey.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "MissingKey.TD.json", - "line": 13, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingValue.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingValue.json index 87e184e7a1..7716c801e1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingValue.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingValue.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "MissingValue.TD.json", - "line": 13, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NumericKey.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NumericKey.json index 5d0d37eb48..e43a719067 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NumericKey.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NumericKey.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "NumericKey.TD.json", - "line": 13, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ObjectKey.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ObjectKey.json index ede091c85a..dad0eeba36 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ObjectKey.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ObjectKey.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "ObjectKey.TD.json", - "line": 13, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeEmpty.json index bf6d882a53..a941b783f6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "PropertyFormAdditionalResponseContentTypeEmpty.TD.json", - "line": 40, + "line": 39, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeText.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeText.json index b8de8486da..4228c65984 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeText.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeText.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "PropertyFormAdditionalResponseContentTypeText.TD.json", - "line": 33, + "line": 32, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.json index 2a5cd100d4..df958172c6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.json @@ -8,7 +8,7 @@ { "condition": "ItemNotFound", "filename": "PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TD.json", - "line": 32, + "line": 31, "cfLine": 8, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchema.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchema.json index 02c375c412..d07ce113ff 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchema.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchema.json @@ -8,7 +8,7 @@ { "condition": "PropertyMissing", "filename": "PropertyFormAdditionalResponseNoSchema.TD.json", - "line": 38, + "line": 37, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchemaDefinitions.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchemaDefinitions.json index 379808ff76..e324da79bd 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchemaDefinitions.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchemaDefinitions.json @@ -8,7 +8,7 @@ { "condition": "ItemNotFound", "filename": "PropertyFormAdditionalResponseNoSchemaDefinitions.TD.json", - "line": 22, + "line": 21, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSuccess.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSuccess.json index 3efa1a509f..6c558b13af 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSuccess.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSuccess.json @@ -8,7 +8,7 @@ { "condition": "PropertyMissing", "filename": "PropertyFormAdditionalResponseNoSuccess.TD.json", - "line": 37, + "line": 36, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionMap.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionMap.json index 7480e5fcd2..50e760d0c8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionMap.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionMap.json @@ -8,7 +8,7 @@ { "condition": "TypeMismatch", "filename": "PropertyFormAdditionalResponseSchemaDefinitionMap.TD.json", - "line": 37, + "line": 36, "cfLine": 16, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionNotObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionNotObject.json index b81e831b31..74618088e4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionNotObject.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionNotObject.json @@ -8,7 +8,7 @@ { "condition": "TypeMismatch", "filename": "PropertyFormAdditionalResponseSchemaDefinitionNotObject.TD.json", - "line": 39, + "line": 38, "cfLine": 9, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaEmpty.json index b77c37858c..10aa74b3c6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "PropertyFormAdditionalResponseSchemaEmpty.TD.json", - "line": 40, + "line": 39, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSuccessTrue.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSuccessTrue.json index 753392560f..645893a292 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSuccessTrue.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSuccessTrue.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "PropertyFormAdditionalResponseSuccessTrue.TD.json", - "line": 38, + "line": 37, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseUnsupportedProperty.json index 2645c5695c..77ca2fb7bb 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseUnsupportedProperty.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "PropertyFormAdditionalResponseUnsupportedProperty.TD.json", - "line": 41, + "line": 40, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponsesMultiple.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponsesMultiple.json index 294ea8faf4..74c3c13639 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponsesMultiple.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponsesMultiple.json @@ -8,7 +8,7 @@ { "condition": "ElementsPlural", "filename": "PropertyFormAdditionalResponsesMultiple.TD.json", - "line": 37, + "line": 36, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormContentTypeText.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormContentTypeText.json index 361bf677a9..45298b1d5b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormContentTypeText.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormContentTypeText.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "PropertyFormContentTypeText.TD.json", - "line": 16, + "line": 15, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderCode.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderCode.json index 9f5bc50c2d..522f39b011 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderCode.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderCode.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "PropertyFormHeaderCode.TD.json", - "line": 28, + "line": 27, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderInfo.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderInfo.json index 3c5726d8fd..d2d68d936b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderInfo.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderInfo.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "PropertyFormHeaderInfo.TD.json", - "line": 29, + "line": 28, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpInvoke.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpInvoke.json index 1ffa26ce6c..6c1422c7b0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpInvoke.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpInvoke.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "PropertyFormOpInvoke.TD.json", - "line": 18, + "line": 17, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadAll.json index 0fea90f64d..2c911fbce8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadAll.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "PropertyFormOpReadAll.TD.json", - "line": 18, + "line": 17, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadDuplicate.json index a8c8b198f7..c00cdf07fa 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadDuplicate.json @@ -8,7 +8,7 @@ { "condition": "Duplication", "filename": "PropertyFormOpReadDuplicate.TD.json", - "line": 18, + "line": 17, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpSub.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpSub.json index 335f6019d8..55ae047c98 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpSub.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpSub.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "PropertyFormOpSub.TD.json", - "line": 18, + "line": 17, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteDuplicate.json index b9f0d76d68..ceb3f9fcf6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteDuplicate.json @@ -8,7 +8,7 @@ { "condition": "Duplication", "filename": "PropertyFormOpWriteDuplicate.TD.json", - "line": 18, + "line": 17, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteMulti.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteMulti.json index 2eef27bebf..f159d4fc56 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteMulti.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteMulti.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "PropertyFormOpWriteMulti.TD.json", - "line": 18, + "line": 17, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json index 296dd204e6..e41b8e5f38 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json @@ -8,7 +8,7 @@ { "condition": "Unusable", "filename": "PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json", - "line": 32, + "line": 31, "cfLine": 18, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json index 3059379315..4adcf2fa66 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json @@ -8,7 +8,7 @@ { "condition": "Unusable", "filename": "PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json", - "line": 32, + "line": 31, "cfLine": 19, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.json index 738753237c..651ee1194b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TD.json", - "line": 27, - "cfLine": 21, + "line": 25, + "cfLine": 20, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormServiceGroup.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormServiceGroup.json index 28dd2408c9..d093114ad0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormServiceGroup.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormServiceGroup.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "PropertyFormServiceGroup.TD.json", - "line": 19, + "line": 18, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicNoContentType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicNoContentType.json index d5542c9191..351a50046e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicNoContentType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicNoContentType.json @@ -9,7 +9,7 @@ "condition": "ValuesInconsistent", "filename": "PropertyFormTopicNoContentType.TD.json", "line": 14, - "cfLine": 16, + "cfLine": 15, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenExecutorId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenExecutorId.json index 1aca6de658..ea5a26b5ed 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenExecutorId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenExecutorId.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "PropertyFormTopicTokenExecutorId.TD.json", - "line": 17, + "line": 16, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenInvokerId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenInvokerId.json index ec3a22e0a9..4a803de358 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenInvokerId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenInvokerId.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "PropertyFormTopicTokenInvokerId.TD.json", - "line": 17, + "line": 16, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.json index c523c91018..e2183b1667 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.json @@ -8,7 +8,7 @@ { "condition": "ValuesInconsistent", "filename": "PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TD.json", - "line": 17, + "line": 16, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.json index 1a720d4945..278f470338 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.json @@ -8,7 +8,7 @@ { "condition": "ValuesInconsistent", "filename": "PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TD.json", - "line": 18, + "line": 17, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenReadAndWrite.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenReadAndWrite.json index d6286dc591..4e9781595a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenReadAndWrite.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenReadAndWrite.json @@ -8,7 +8,7 @@ { "condition": "ValuesInconsistent", "filename": "PropertyFormTopicTokenNoActionWhenReadAndWrite.TD.json", - "line": 17, + "line": 16, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenSenderId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenSenderId.json index b7afb382fa..4f6a7b7539 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenSenderId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenSenderId.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "PropertyFormTopicTokenSenderId.TD.json", - "line": 17, + "line": 16, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormUnsupportedProperty.json index a7ee82ff14..7cc25ff602 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormUnsupportedProperty.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "PropertyFormUnsupportedProperty.TD.json", - "line": 19, + "line": 18, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.json index fc1c2165f2..cd95e66680 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.json @@ -8,8 +8,8 @@ { "condition": "Unusable", "filename": "PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TD.json", - "line": 54, - "cfLine": 30, + "line": 51, + "cfLine": 29, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.json index f45913b68f..0b6f6380a1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.json @@ -8,7 +8,7 @@ { "condition": "Unusable", "filename": "PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TD.json", - "line": 20, + "line": 19, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpReadDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpReadDuplicate.json index 96e56c049c..188172153e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpReadDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpReadDuplicate.json @@ -8,8 +8,8 @@ { "condition": "Duplication", "filename": "PropertyFormsOpReadDuplicate.TD.json", - "line": 18, - "cfLine": 24, + "line": 17, + "cfLine": 22, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteDuplicate.json index b0b60ba847..1301579834 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteDuplicate.json @@ -8,8 +8,8 @@ { "condition": "Duplication", "filename": "PropertyFormsOpWriteDuplicate.TD.json", - "line": 18, - "cfLine": 24, + "line": 17, + "cfLine": 22, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteNoRead.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteNoRead.json index bddcbac5c8..f5711d1f4e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteNoRead.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteNoRead.json @@ -8,7 +8,7 @@ { "condition": "ValuesInconsistent", "filename": "PropertyFormsOpWriteNoRead.TD.json", - "line": 18, + "line": 17, "cfLine": 13, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessAndRead.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessAndRead.json index f30e7099bc..e2ddd56c78 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessAndRead.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessAndRead.json @@ -8,7 +8,7 @@ { "condition": "ValuesInconsistent", "filename": "PropertyFormsOplessAndRead.TD.json", - "line": 20, + "line": 19, "cfLine": 13, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNoForms.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNoForms.json index 31f1c03e1c..01524d5886 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNoForms.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNoForms.json @@ -6,7 +6,7 @@ }, "errors": [ { - "condition": "PropertyMissing", + "condition": "Unusable", "filename": "PropertyNoForms.TD.json", "line": 11, "cfLine": 0, diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyUnsupportedProperty.json index 1c6667fccf..450193cdf3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyUnsupportedProperty.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "PropertyUnsupportedProperty.TD.json", - "line": 21, + "line": 20, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeEmpty.json index 4f28b90514..acd70e8412 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "RootFormAdditionalResponseContentTypeEmpty.TD.json", - "line": 15, + "line": 14, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeText.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeText.json index db9a039fae..9b858c9271 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeText.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeText.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "RootFormAdditionalResponseContentTypeText.TD.json", - "line": 15, + "line": 14, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseNoSuccess.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseNoSuccess.json index 83f4f088ab..c86f468ee4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseNoSuccess.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseNoSuccess.json @@ -8,7 +8,7 @@ { "condition": "PropertyMissing", "filename": "RootFormAdditionalResponseNoSuccess.TD.json", - "line": 14, + "line": 13, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSchema.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSchema.json index 8a96cb67b6..b9d22bcdba 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSchema.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSchema.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "RootFormAdditionalResponseSchema.TD.json", - "line": 22, + "line": 21, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSuccessTrue.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSuccessTrue.json index e6f5945d3d..7868e41384 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSuccessTrue.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSuccessTrue.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "RootFormAdditionalResponseSuccessTrue.TD.json", - "line": 16, + "line": 15, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseUnsupportedProperty.json index 8abfe6cfbb..b05d1f8abe 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseUnsupportedProperty.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "RootFormAdditionalResponseUnsupportedProperty.TD.json", - "line": 17, + "line": 16, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesAndSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesAndSubAll.json index 34676994c1..73999e7e2d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesAndSubAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesAndSubAll.json @@ -8,8 +8,8 @@ { "condition": "ValuesInconsistent", "filename": "RootFormAdditionalResponsesAndSubAll.TD.json", - "line": 13, - "cfLine": 18, + "line": 12, + "cfLine": 17, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesMultiple.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesMultiple.json index c8270fa0c0..3cbdee72df 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesMultiple.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesMultiple.json @@ -8,7 +8,7 @@ { "condition": "ElementsPlural", "filename": "RootFormAdditionalResponsesMultiple.TD.json", - "line": 13, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeCustom.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeCustom.json index 79ba3c334f..eb1cdbd790 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeCustom.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeCustom.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "RootFormContentTypeCustom.TD.json", - "line": 12, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeRaw.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeRaw.json index 5bc17eed71..42494fe027 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeRaw.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeRaw.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "RootFormContentTypeRaw.TD.json", - "line": 12, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeText.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeText.json index 79bd0abd65..8ab5df490b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeText.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeText.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "RootFormContentTypeText.TD.json", - "line": 12, + "line": 11, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderCode.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderCode.json index 27ae77ff9c..5e71309674 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderCode.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderCode.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "RootFormHeaderCode.TD.json", - "line": 22, + "line": 21, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderInfo.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderInfo.json index 50fc4079c3..f5960b3093 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderInfo.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderInfo.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupported", "filename": "RootFormHeaderInfo.TD.json", - "line": 22, + "line": 21, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoContentType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoContentType.json index 6d9f4ee389..64c56fb405 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoContentType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoContentType.json @@ -9,7 +9,7 @@ "condition": "ValuesInconsistent", "filename": "RootFormNoContentType.TD.json", "line": 9, - "cfLine": 11, + "cfLine": 10, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpArrayEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpArrayEmpty.json index 478e8ca67f..8e105afae1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpArrayEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpArrayEmpty.json @@ -8,7 +8,7 @@ { "condition": "ElementMissing", "filename": "RootFormOpArrayEmpty.TD.json", - "line": 13, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpElementEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpElementEmpty.json index 5a0137b599..caf25022cb 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpElementEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpElementEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "RootFormOpElementEmpty.TD.json", - "line": 13, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpEmpty.json index 89a7d0a207..0f2bcf27f5 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "RootFormOpEmpty.TD.json", - "line": 13, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllAndSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllAndSubAll.json index 5cbd7e9df7..fa2813e707 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllAndSubAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllAndSubAll.json @@ -8,7 +8,7 @@ { "condition": "ValuesInconsistent", "filename": "RootFormOpReadAllAndSubAll.TD.json", - "line": 13, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllDuplicate.json index 5dfad749ea..0a9d2eb831 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllDuplicate.json @@ -8,7 +8,7 @@ { "condition": "Duplication", "filename": "RootFormOpReadAllDuplicate.TD.json", - "line": 13, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadOne.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadOne.json index 3551dc1490..74fe8a0369 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadOne.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadOne.json @@ -8,7 +8,7 @@ { "condition": "PropertyUnsupportedValue", "filename": "RootFormOpReadOne.TD.json", - "line": 13, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubAllDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubAllDuplicate.json index f9a47964e2..168e85b0ec 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubAllDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubAllDuplicate.json @@ -8,7 +8,7 @@ { "condition": "Duplication", "filename": "RootFormOpSubAllDuplicate.TD.json", - "line": 13, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubOne.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubOne.json index 5a0137b599..caf25022cb 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubOne.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubOne.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "RootFormOpElementEmpty.TD.json", - "line": 13, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWiteMultiAndSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWiteMultiAndSubAll.json index a9d60fcd9a..392b995dae 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWiteMultiAndSubAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWiteMultiAndSubAll.json @@ -8,7 +8,7 @@ { "condition": "ValuesInconsistent", "filename": "RootFormOpWiteMultiAndSubAll.TD.json", - "line": 13, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteMultiDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteMultiDuplicate.json index 108c4b2195..aa0852fb48 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteMultiDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteMultiDuplicate.json @@ -8,7 +8,7 @@ { "condition": "Duplication", "filename": "RootFormOpWriteMultiDuplicate.TD.json", - "line": 13, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteOne.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteOne.json index 5a0137b599..caf25022cb 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteOne.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteOne.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "RootFormOpElementEmpty.TD.json", - "line": 13, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormReadAllButNoProperties.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormReadAllButNoProperties.json index a262a1cc32..1675d47ae7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormReadAllButNoProperties.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormReadAllButNoProperties.json @@ -8,8 +8,8 @@ { "condition": "Unusable", "filename": "RootFormReadAllButNoProperties.TD.json", - "line": 13, - "cfLine": 18, + "line": 12, + "cfLine": 17, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupEmpty.json index 2ff743ab69..8c9604e0ae 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "RootFormServiceGroupEmpty.TD.json", - "line": 13, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupNoSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupNoSubAll.json index 131784cb52..0d7c50b8b5 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupNoSubAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupNoSubAll.json @@ -8,7 +8,7 @@ { "condition": "ValuesInconsistent", "filename": "RootFormServiceGroupNoSubAll.TD.json", - "line": 13, + "line": 12, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormSubAllButNoEvents.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormSubAllButNoEvents.json index 8fbc225487..e09d204f04 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormSubAllButNoEvents.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormSubAllButNoEvents.json @@ -8,8 +8,8 @@ { "condition": "Unusable", "filename": "RootFormSubAllButNoEvents.TD.json", - "line": 13, - "cfLine": 20, + "line": 12, + "cfLine": 19, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicEmpty.json index 49f6454964..fbc5f4a9ae 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyEmpty", "filename": "RootFormTopicEmpty.TD.json", - "line": 11, + "line": 10, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelEmpty.json index e609bbab9c..cb661ed46b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "RootFormTopicLevelEmpty.TD.json", - "line": 11, + "line": 10, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelInvalid.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelInvalid.json index 1af3c2ea63..a77c5d622f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelInvalid.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelInvalid.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "RootFormTopicLevelInvalid.TD.json", - "line": 11, + "line": 10, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicReservedStart.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicReservedStart.json index 977b0b769b..8657956f6f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicReservedStart.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicReservedStart.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "RootFormTopicReservedStart.TD.json", - "line": 11, + "line": 10, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenActionWhenSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenActionWhenSubAll.json index 8203df9e67..89205e5c92 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenActionWhenSubAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenActionWhenSubAll.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "RootFormTopicTokenActionWhenSubAll.TD.json", - "line": 11, + "line": 10, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenConsumerIdWhenSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenConsumerIdWhenSubAll.json index 42fd433a1e..100d6c3a5f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenConsumerIdWhenSubAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenConsumerIdWhenSubAll.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "RootFormTopicTokenConsumerIdWhenSubAll.TD.json", - "line": 11, + "line": 10, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomEmpty.json index 04d484b06f..561237177e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "RootFormTopicTokenCustomEmpty.TD.json", - "line": 11, + "line": 10, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomInvalid.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomInvalid.json index a0d335a1b7..fcfb56d9c5 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomInvalid.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomInvalid.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "RootFormTopicTokenCustomInvalid.TD.json", - "line": 11, + "line": 10, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenEmpty.json index cbf3bc12e0..8923038cd7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenEmpty.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "RootFormTopicTokenEmpty.TD.json", - "line": 11, + "line": 10, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenExecutorId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenExecutorId.json index 2f72d81b6a..819ca4fa1b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenExecutorId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenExecutorId.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "RootFormTopicTokenExecutorId.TD.json", - "line": 11, + "line": 10, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenInvokerId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenInvokerId.json index 81d0f0c2d0..c2569cf136 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenInvokerId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenInvokerId.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "RootFormTopicTokenInvokerId.TD.json", - "line": 11, + "line": 10, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenMaintainerIdWhenSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenMaintainerIdWhenSubAll.json index f7857b23d2..ebef70b40c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenMaintainerIdWhenSubAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenMaintainerIdWhenSubAll.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "RootFormTopicTokenMaintainerIdWhenSubAll.TD.json", - "line": 11, + "line": 10, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.json index 5a1ae73895..d083fbf0cf 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.json @@ -8,7 +8,7 @@ { "condition": "ValuesInconsistent", "filename": "RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TD.json", - "line": 11, + "line": 10, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenReadAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenReadAll.json index 48514b89c4..4e4ddb0f12 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenReadAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenReadAll.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "RootFormTopicTokenSenderIdWhenReadAll.TD.json", - "line": 11, + "line": 10, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenWriteMulti.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenWriteMulti.json index a9cc7925c0..744ec9d53a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenWriteMulti.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenWriteMulti.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "RootFormTopicTokenSenderIdWhenWriteMulti.TD.json", - "line": 11, + "line": 10, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenUnrecognized.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenUnrecognized.json index b9e259ea5f..b5114b6938 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenUnrecognized.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenUnrecognized.json @@ -8,7 +8,7 @@ { "condition": "PropertyInvalid", "filename": "RootFormTopicTokenUnrecognized.TD.json", - "line": 11, + "line": 10, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormWriteMultiButNoWritableProperties.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormWriteMultiButNoWritableProperties.json index 6f7a3778b1..4a1a328187 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormWriteMultiButNoWritableProperties.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormWriteMultiButNoWritableProperties.json @@ -8,8 +8,8 @@ { "condition": "Unusable", "filename": "RootFormWriteMultiButNoWritableProperties.TD.json", - "line": 19, - "cfLine": 24, + "line": 17, + "cfLine": 22, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpReadAllDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpReadAllDuplicate.json index 01e69e2a24..4d9b6277a8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpReadAllDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpReadAllDuplicate.json @@ -8,8 +8,8 @@ { "condition": "Duplication", "filename": "RootFormsOpReadAllDuplicate.TD.json", - "line": 13, - "cfLine": 19, + "line": 12, + "cfLine": 17, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpSubAllDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpSubAllDuplicate.json index 4ed0173fa9..42ed347449 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpSubAllDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpSubAllDuplicate.json @@ -8,8 +8,8 @@ { "condition": "Duplication", "filename": "RootFormsOpSubAllDuplicate.TD.json", - "line": 13, - "cfLine": 19, + "line": 12, + "cfLine": 17, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiDuplicate.json index 735dbadd17..e9760dbb80 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiDuplicate.json @@ -8,8 +8,8 @@ { "condition": "Duplication", "filename": "RootFormsOpWriteMultiDuplicate.TD.json", - "line": 13, - "cfLine": 19, + "line": 12, + "cfLine": 17, "crossRef": "" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiNoReadAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiNoReadAll.json index 2611b4b0dd..5533844873 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiNoReadAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiNoReadAll.json @@ -8,7 +8,7 @@ { "condition": "ValuesInconsistent", "filename": "RootFormsOpWriteMultiNoReadAll.TD.json", - "line": 13, + "line": 12, "cfLine": 8, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TrailingComma.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TrailingComma.json index ec43d49fef..fc9afd30c4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TrailingComma.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TrailingComma.json @@ -15,7 +15,7 @@ { "condition": "JsonInvalid", "filename": "TrailingComma.TD.json", - "line": 16, + "line": 15, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedArray.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedArray.json index 5426462178..4a0ff7bd73 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedArray.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedArray.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "UnclosedArray.TD.json", - "line": 17, + "line": 16, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedObject.json index 30991134b1..9253aacebb 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedObject.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedObject.json @@ -8,7 +8,7 @@ { "condition": "JsonInvalid", "filename": "UnclosedObject.TD.json", - "line": 16, + "line": 15, "cfLine": 0, "crossRef": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/IdInvalidReplacementButNotInTopic.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/IdInvalidReplacementButNotInTopic.json deleted file mode 100644 index 55a0504732..0000000000 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/IdInvalidReplacementButNotInTopic.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "success": true, - "commandLine": { - "thingFiles": [ "valid/IdInvalidReplacementButNotInTopic.TD.json" ], - "lang": "none" - } -} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeEmpty.TD.json index cb219bed99..85f1d6db7d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeEmpty.TD.json @@ -26,7 +26,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeText.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeText.TD.json index b8e721971b..5591f9bc35 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeText.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeText.TD.json @@ -26,7 +26,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoMatchingSchemaDefinition.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoMatchingSchemaDefinition.TD.json index 6ad18ec758..3259368155 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoMatchingSchemaDefinition.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoMatchingSchemaDefinition.TD.json @@ -19,7 +19,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchema.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchema.TD.json index 3c9398a049..d8857d6f85 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchema.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchema.TD.json @@ -27,7 +27,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchemaDefinitions.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchemaDefinitions.TD.json index 1cb7f45a9c..5d2550ce83 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchemaDefinitions.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchemaDefinitions.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSuccess.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSuccess.TD.json index 7b55b9d85d..fcba5bba27 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSuccess.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSuccess.TD.json @@ -26,7 +26,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionMap.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionMap.TD.json index 68471191c0..24e38ca04b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionMap.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionMap.TD.json @@ -24,7 +24,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionNotObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionNotObject.TD.json index 10b225792b..114e628534 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionNotObject.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionNotObject.TD.json @@ -26,7 +26,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaEmpty.TD.json index f923f64eb2..c4acb57611 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaEmpty.TD.json @@ -27,7 +27,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSuccessTrue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSuccessTrue.TD.json index 76669748d1..cfa1d96451 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSuccessTrue.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSuccessTrue.TD.json @@ -26,7 +26,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseUnsupportedProperty.TD.json index 2b1a5cb2e8..16f6667928 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseUnsupportedProperty.TD.json @@ -26,7 +26,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponsesMultiple.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponsesMultiple.TD.json index c4f0693f5c..d9678a67ff 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponsesMultiple.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponsesMultiple.TD.json @@ -27,7 +27,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormContentTypeText.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormContentTypeText.TD.json index bfbdb998ec..ea9b5939da 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormContentTypeText.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormContentTypeText.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/text", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeEmpty.TD.json index cfb9dad017..0819e24270 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeEmpty.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoMatchingSchemaDefinition.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoMatchingSchemaDefinition.TD.json index a2b5567ad1..e1c9a9a7f7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoMatchingSchemaDefinition.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoMatchingSchemaDefinition.TD.json @@ -14,7 +14,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoSchemaDefinitions.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoSchemaDefinitions.TD.json index 0a2bc23e84..957fddde8b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoSchemaDefinitions.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoSchemaDefinitions.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeSchemaDefinitionNotEnum.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeSchemaDefinitionNotEnum.TD.json index 6345ebac1b..70f7e5ea4c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeSchemaDefinitionNotEnum.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeSchemaDefinitionNotEnum.TD.json @@ -14,7 +14,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeEmpty.TD.json index 7a154928f9..bb6afabc6d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeEmpty.TD.json @@ -26,7 +26,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeNotJson.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeNotJson.TD.json index e81841b56d..5e0ad88f55 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeNotJson.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeNotJson.TD.json @@ -26,7 +26,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoContentType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoContentType.TD.json index ed1391a43f..328147629d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoContentType.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoContentType.TD.json @@ -26,7 +26,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoMatchingSchemaDefinition.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoMatchingSchemaDefinition.TD.json index 1b4317b7c4..ceefc80ee6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoMatchingSchemaDefinition.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoMatchingSchemaDefinition.TD.json @@ -19,7 +19,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchema.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchema.TD.json index 666c9ca118..f317946b83 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchema.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchema.TD.json @@ -27,7 +27,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchemaDefinitions.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchemaDefinitions.TD.json index 03b88691cd..cad11dba6e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchemaDefinitions.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchemaDefinitions.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionMap.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionMap.TD.json index d61e689fc0..71404f22b9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionMap.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionMap.TD.json @@ -24,7 +24,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionNotObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionNotObject.TD.json index 0ac195964c..61de012243 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionNotObject.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionNotObject.TD.json @@ -26,7 +26,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaEmpty.TD.json index 4d13b180fe..54c435b383 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaEmpty.TD.json @@ -27,7 +27,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSuccessTrue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSuccessTrue.TD.json index 478337fb63..5914be676e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSuccessTrue.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSuccessTrue.TD.json @@ -26,7 +26,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoUnsupportedProperty.TD.json index 75f81ee902..5f2c114535 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoUnsupportedProperty.TD.json @@ -26,7 +26,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfosMultiple.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfosMultiple.TD.json index 060979c404..c3a5cb6ef9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfosMultiple.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfosMultiple.TD.json @@ -27,7 +27,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormOpInvokeDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormOpInvokeDuplicate.TD.json index ceceee832c..9ba6a62d9b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormOpInvokeDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormOpInvokeDuplicate.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": [ "invokeaction", "invokeaction" ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormServiceGroupEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormServiceGroupEmpty.TD.json index ee1b62e344..6d71ca1a90 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormServiceGroupEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormServiceGroupEmpty.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicNoContentType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicNoContentType.TD.json index 073c62859a..fdcbc43e96 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicNoContentType.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicNoContentType.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenAction.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenAction.TD.json index 9f2f5875e6..b5a2934f49 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenAction.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenAction.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{action}", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenConsumerId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenConsumerId.TD.json index 0f7caa02c4..39b59a6aa8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenConsumerId.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenConsumerId.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{consumerClientId}", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenMaintainerId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenMaintainerId.TD.json index 2c684a8744..6dad7f6631 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenMaintainerId.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenMaintainerId.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{maintainerId}", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenSenderId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenSenderId.TD.json index 73dfb29260..f096f68277 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenSenderId.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenSenderId.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{senderId}", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormUnsupportedProperty.TD.json index 2b20404e08..3d81838500 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormUnsupportedProperty.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsMultipleContentTypes.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsMultipleContentTypes.TD.json index e6863fbf49..734f7e0071 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsMultipleContentTypes.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsMultipleContentTypes.TD.json @@ -9,13 +9,11 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction" }, { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/octet-stream", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOpInvokeDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOpInvokeDuplicate.TD.json index e4c789db2e..e9edde03ee 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOpInvokeDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOpInvokeDuplicate.TD.json @@ -9,13 +9,11 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction" }, { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessAndInvoke.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessAndInvoke.TD.json index b95804542e..fed7bfafdf 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessAndInvoke.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessAndInvoke.TD.json @@ -9,13 +9,11 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction" }, { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessDuplicate.TD.json index b41196475b..44c4c3012b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessDuplicate.TD.json @@ -9,12 +9,10 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}" }, { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputMap.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputMap.TD.json index 49303f0743..a1a95656ca 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputMap.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputMap.TD.json @@ -15,7 +15,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:poke;1", "contentType": "application/json", "dtv:topic": "sample/poke/{executorId}", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNullAndContentTypeJson.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNullAndContentTypeJson.TD.json index e683f7b272..334c5510b2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNullAndContentTypeJson.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNullAndContentTypeJson.TD.json @@ -12,7 +12,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:poke;1", "contentType": "application/json", "dtv:topic": "sample/poke/{executorId}", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNumber.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNumber.TD.json index 133334e184..b5a3dee1db 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNumber.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNumber.TD.json @@ -12,7 +12,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:poke;1", "contentType": "application/json", "dtv:topic": "sample/poke/{executorId}", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeCustom.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeCustom.TD.json index aed70a6ee6..51bf656642 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeCustom.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeCustom.TD.json @@ -17,7 +17,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:poke;1", "contentType": "", "dtv:topic": "sample/poke/{executorId}", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeRaw.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeRaw.TD.json index c2035f3828..b8bc6f3d50 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeRaw.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeRaw.TD.json @@ -17,7 +17,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:poke;1", "contentType": "application/octet-stream", "dtv:topic": "sample/poke/{executorId}", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectConst.TD.json index 791a4b0e3a..755bc30627 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectConst.TD.json @@ -20,7 +20,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:poke;1", "contentType": "application/json", "dtv:topic": "sample/poke/{executorId}", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectErrorMessage.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectErrorMessage.TD.json index 6bd1deb7d2..23acb316d6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectErrorMessage.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectErrorMessage.TD.json @@ -18,7 +18,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:poke;1", "contentType": "application/json", "dtv:topic": "sample/poke/{executorId}", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputString.TD.json index b917f3f34b..6f33359261 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputString.TD.json @@ -12,7 +12,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:poke;1", "contentType": "application/json", "dtv:topic": "sample/poke/{executorId}", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionNoFormsWithTopic.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionNoFormsWithTopic.TD.json index eaa09d9d1e..c092e27afd 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionNoFormsWithTopic.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionNoFormsWithTopic.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "op": "invokeaction" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputMap.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputMap.TD.json index b659f89510..b5e60a43a1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputMap.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputMap.TD.json @@ -15,7 +15,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:peek;1", "contentType": "application/json", "dtv:topic": "sample/peek/{executorId}", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNullAndContentTypeJson.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNullAndContentTypeJson.TD.json index 2e34722044..1689f35ff6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNullAndContentTypeJson.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNullAndContentTypeJson.TD.json @@ -12,7 +12,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:peek;1", "contentType": "application/json", "dtv:topic": "sample/peek/{executorId}", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNumber.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNumber.TD.json index f4a604691f..76000e4594 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNumber.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNumber.TD.json @@ -12,7 +12,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:peek;1", "contentType": "application/json", "dtv:topic": "sample/peek/{executorId}", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeCustom.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeCustom.TD.json index 40ae554d12..4bf4e305cd 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeCustom.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeCustom.TD.json @@ -17,7 +17,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:peek;1", "contentType": "", "dtv:topic": "sample/peek/{executorId}", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeRaw.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeRaw.TD.json index 93fd4dac66..8abbbb8b42 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeRaw.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeRaw.TD.json @@ -17,7 +17,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:peek;1", "contentType": "application/octet-stream", "dtv:topic": "sample/peek/{executorId}", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectConst.TD.json index ad2d5996b4..b042adf03f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectConst.TD.json @@ -20,7 +20,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:peek;1", "contentType": "application/json", "dtv:topic": "sample/peek/{executorId}", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectErrorMessage.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectErrorMessage.TD.json index 1a3d13aa6e..0d45389635 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectErrorMessage.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectErrorMessage.TD.json @@ -18,7 +18,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:peek;1", "contentType": "application/json", "dtv:topic": "sample/peek/{executorId}", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputString.TD.json index 9444a3fb70..e2dd501d03 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputString.TD.json @@ -12,7 +12,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:peek;1", "contentType": "application/json", "dtv:topic": "sample/peek/{executorId}", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionUnsupportedProperty.TD.json index 1203b7f633..5ab8a9bcb1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionUnsupportedProperty.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongPrefix.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongPrefix.TD.json index 8db2bdac1b..fe86457f29 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongPrefix.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongPrefix.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongUri.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongUri.TD.json index f5e64b29d0..6e09c3ea63 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongUri.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongUri.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextMissingDtv.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextMissingDtv.TD.json index 31906adc44..2d4c82cd34 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextMissingDtv.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextMissingDtv.TD.json @@ -6,7 +6,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventBooleanConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventBooleanConst.TD.json index 7623c33f7f..1902d97273 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventBooleanConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventBooleanConst.TD.json @@ -17,7 +17,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormAdditionalResponses.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormAdditionalResponses.TD.json index 914d776580..d9f102cc2b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormAdditionalResponses.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormAdditionalResponses.TD.json @@ -26,7 +26,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormContentTypeText.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormContentTypeText.TD.json index da43620f0b..f690660b3d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormContentTypeText.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormContentTypeText.TD.json @@ -16,7 +16,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/text", "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderCode.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderCode.TD.json index f14d2da003..c9f17b9091 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderCode.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderCode.TD.json @@ -25,7 +25,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderInfo.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderInfo.TD.json index af5003c3e5..027c271acd 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderInfo.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderInfo.TD.json @@ -26,7 +26,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormOpSubDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormOpSubDuplicate.TD.json index 91ceb78354..d49a22af55 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormOpSubDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormOpSubDuplicate.TD.json @@ -16,7 +16,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", "dtv:topic": "sample/alert/TestThing", "op": [ "subscribeevent", "subscribeevent" ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormServiceGroupEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormServiceGroupEmpty.TD.json index bde4fdf125..2dec919aa3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormServiceGroupEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormServiceGroupEmpty.TD.json @@ -16,7 +16,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicNoContentType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicNoContentType.TD.json index 7f67694745..a2baf7f9b4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicNoContentType.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicNoContentType.TD.json @@ -16,7 +16,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenAction.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenAction.TD.json index 1c6b8e7c64..e5aea7d66a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenAction.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenAction.TD.json @@ -16,7 +16,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", "dtv:topic": "sample/alert/{action}", "op": "subscribeevent" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenConsumerId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenConsumerId.TD.json index 33602b080e..7abd4d0f93 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenConsumerId.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenConsumerId.TD.json @@ -16,7 +16,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", "dtv:topic": "sample/alert/{consumerClientId}", "op": "subscribeevent" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenExecutorId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenExecutorId.TD.json index a10f10e5c8..01d1fc07dd 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenExecutorId.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenExecutorId.TD.json @@ -16,7 +16,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", "dtv:topic": "sample/alert/{executorId}", "op": "subscribeevent" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenInvokerId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenInvokerId.TD.json index 69ff121c30..06db7612ff 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenInvokerId.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenInvokerId.TD.json @@ -16,7 +16,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", "dtv:topic": "sample/alert/{invokerClientId}", "op": "subscribeevent" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenMaintainerId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenMaintainerId.TD.json index 7921153124..3bad12286c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenMaintainerId.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenMaintainerId.TD.json @@ -16,7 +16,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", "dtv:topic": "sample/alert/{maintainerId}", "op": "subscribeevent" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormUnsupportedProperty.TD.json index 811461a8b7..b889b791f7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormUnsupportedProperty.TD.json @@ -16,7 +16,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOpSubDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOpSubDuplicate.TD.json index 5d780a22bd..19f323032b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOpSubDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOpSubDuplicate.TD.json @@ -16,13 +16,11 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" }, { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessAndSub.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessAndSub.TD.json index 48e8c9fe8b..c580427efe 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessAndSub.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessAndSub.TD.json @@ -16,13 +16,11 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" }, { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", "dtv:topic": "sample/alert/TestThing" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessDuplicate.TD.json index 053e407fb3..a076a0cfb8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessDuplicate.TD.json @@ -16,12 +16,10 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", "dtv:topic": "sample/alert/TestThing" }, { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", "dtv:topic": "sample/alert/TestThing" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventIntegerConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventIntegerConst.TD.json index 042efeea59..527b720ccd 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventIntegerConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventIntegerConst.TD.json @@ -17,7 +17,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNoFormsWithTopicAndNoRootFormSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNoFormsWithTopicAndNoRootFormSubAll.TD.json index 6ba13db952..4c2059b0f5 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNoFormsWithTopicAndNoRootFormSubAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNoFormsWithTopicAndNoRootFormSubAll.TD.json @@ -16,7 +16,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNullAndContentTypeJson.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNullAndContentTypeJson.TD.json index 98af18d1c0..ad81096bf2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNullAndContentTypeJson.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNullAndContentTypeJson.TD.json @@ -16,7 +16,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNumberConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNumberConst.TD.json index 6d0406e829..b87cdf8385 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNumberConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNumberConst.TD.json @@ -17,7 +17,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeCustom.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeCustom.TD.json index 596e7e0fa5..b93e9f7244 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeCustom.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeCustom.TD.json @@ -21,7 +21,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "", "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeRaw.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeRaw.TD.json index 37d92542a3..c399aee72c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeRaw.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeRaw.TD.json @@ -21,7 +21,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/octet-stream", "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectConst.TD.json index c59d634dcd..e0767b5ea5 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectConst.TD.json @@ -24,7 +24,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectErrorMessage.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectErrorMessage.TD.json index 80ce993144..4a6a19a0d3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectErrorMessage.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectErrorMessage.TD.json @@ -22,7 +22,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventStringConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventStringConst.TD.json index 3752f7304c..5cd7d78e89 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventStringConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventStringConst.TD.json @@ -17,7 +17,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventUnsupportedProperty.TD.json index afe589f788..a3085c1c4b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventUnsupportedProperty.TD.json @@ -16,7 +16,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", "dtv:topic": "sample/alert/TestThing", "op": "subscribeevent" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyHref.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyHref.TD.json index c320494842..016524fbd7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyHref.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyHref.TD.json @@ -16,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyType.TD.json index eeb063c121..82dd7cb5ca 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyType.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyType.TD.json @@ -16,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoHref.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoHref.TD.json index 9979547574..ae3ba8a279 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoHref.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoHref.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoType.TD.json index d864a82b30..b72e7b2774 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoType.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoType.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonJsonFile.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonJsonFile.TD.json index afed878392..6fd1f48c01 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonJsonFile.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonJsonFile.TD.json @@ -16,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonexistentFile.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonexistentFile.TD.json index ee8bf18dc0..4e62987f1b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonexistentFile.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonexistentFile.TD.json @@ -16,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkTypeNotJson.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkTypeNotJson.TD.json index 9ed73b4aab..67d323f622 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkTypeNotJson.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkTypeNotJson.TD.json @@ -16,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkUnsupportedProperty.TD.json index 8ff4d466b4..75b79ac2cd 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkUnsupportedProperty.TD.json @@ -17,7 +17,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/MultipleLinks.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/MultipleLinks.TD.json index 810728bcd3..e78bc88218 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/MultipleLinks.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/MultipleLinks.TD.json @@ -21,7 +21,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/NoTitle.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/NoTitle.TD.json index f1165c6aee..9ab4f8a9b4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/NoTitle.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/NoTitle.TD.json @@ -8,7 +8,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyBooleanConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyBooleanConst.TD.json index d9fb4308c0..56211fdcc8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyBooleanConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyBooleanConst.TD.json @@ -13,7 +13,6 @@ "const": true, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}", "op": "readproperty" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeEmpty.TD.json index 633f205df2..e08570a60b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeEmpty.TD.json @@ -29,7 +29,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}", "op": "readproperty", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeText.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeText.TD.json index 061df0294f..56e1e4d08f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeText.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeText.TD.json @@ -29,7 +29,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/text", "dtv:topic": "sample/alpha/{maintainerId}/{action}", "op": "readproperty" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TD.json index 4d2692e9a6..90604a5460 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TD.json @@ -22,7 +22,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}", "op": "readproperty", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchema.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchema.TD.json index 0b6123c3b6..4abe79148c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchema.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchema.TD.json @@ -30,7 +30,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}", "op": "readproperty", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchemaDefinitions.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchemaDefinitions.TD.json index bb6cee48ec..e8f2dd98bd 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchemaDefinitions.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchemaDefinitions.TD.json @@ -12,7 +12,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}", "op": "readproperty", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSuccess.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSuccess.TD.json index faf9b9ad6b..d9a4829ac4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSuccess.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSuccess.TD.json @@ -29,7 +29,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}", "op": "readproperty", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionMap.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionMap.TD.json index 8e501630d6..e3f30eb514 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionMap.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionMap.TD.json @@ -27,7 +27,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}", "op": "readproperty", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionNotObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionNotObject.TD.json index 72d2c94ffc..ddd91ff94b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionNotObject.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionNotObject.TD.json @@ -29,7 +29,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}", "op": "readproperty", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaEmpty.TD.json index cac49e2667..4a1442d8c0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaEmpty.TD.json @@ -30,7 +30,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}", "op": "readproperty", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSuccessTrue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSuccessTrue.TD.json index 7bcafec5bf..089464f610 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSuccessTrue.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSuccessTrue.TD.json @@ -29,7 +29,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}", "op": "readproperty", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseUnsupportedProperty.TD.json index a52e15647a..1be2e2de47 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseUnsupportedProperty.TD.json @@ -29,7 +29,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}", "op": "readproperty", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponsesMultiple.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponsesMultiple.TD.json index 1745cf2cc3..e0b1f73072 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponsesMultiple.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponsesMultiple.TD.json @@ -30,7 +30,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}", "op": "readproperty", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormContentTypeText.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormContentTypeText.TD.json index 8258bcc8ea..3c6d81ceca 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormContentTypeText.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormContentTypeText.TD.json @@ -12,7 +12,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/text", "dtv:topic": "sample/alpha/{maintainerId}/{action}", "op": "readproperty" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderCode.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderCode.TD.json index 85d34bf5a3..1cc3f99dc6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderCode.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderCode.TD.json @@ -21,7 +21,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}", "op": "readproperty", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderInfo.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderInfo.TD.json index eb1b5ca3c5..428fea2de4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderInfo.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderInfo.TD.json @@ -22,7 +22,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}", "op": "readproperty", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpReadDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpReadDuplicate.TD.json index 1f22137fd0..36c47d8d16 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpReadDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpReadDuplicate.TD.json @@ -12,7 +12,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}", "op": [ "readproperty", "readproperty" ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpWriteDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpWriteDuplicate.TD.json index 5374ec68ed..62bf967b68 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpWriteDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpWriteDuplicate.TD.json @@ -12,7 +12,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}", "op": [ "readproperty", "writeproperty", "readproperty" ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json index a7e4377cb3..d200ebf7ac 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json @@ -17,7 +17,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/all/events", "contentType": "application/json", "op": "readallproperties" @@ -30,7 +29,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "additionalResponses": [ { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TD.json index 36808520ae..3aa9597242 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TD.json @@ -12,7 +12,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json" } ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json index 498effcc8f..3a0a2242bf 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json @@ -17,7 +17,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/all/events", "contentType": "application/json", "op": "readallproperties" @@ -30,7 +29,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "op": "readproperty", "additionalResponses": [ diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicAndNoRootFormReadAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicAndNoRootFormReadAll.TD.json index 597e0fed5a..c0e2dda341 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicAndNoRootFormReadAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicAndNoRootFormReadAll.TD.json @@ -12,7 +12,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "op": "readproperty" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TD.json index a4848b8a40..f127127b1c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/all/events", "contentType": "application/json", "op": "readallproperties" @@ -20,12 +19,10 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "op": "readproperty" }, { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/write", "op": "writeproperty" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormServiceGroup.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormServiceGroup.TD.json index b6eaf29550..fb37abebc9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormServiceGroup.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormServiceGroup.TD.json @@ -12,7 +12,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}", "op": "readproperty", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicNoContentType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicNoContentType.TD.json index 42af0c115e..0cb5283c68 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicNoContentType.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicNoContentType.TD.json @@ -12,7 +12,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "dtv:topic": "sample/alpha/{maintainerId}/{action}", "op": "readproperty" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenExecutorId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenExecutorId.TD.json index 0519e4b056..20a26b5b2e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenExecutorId.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenExecutorId.TD.json @@ -12,7 +12,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{executorId}", "op": "readproperty" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenInvokerId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenInvokerId.TD.json index bc70bdde1b..e536826b43 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenInvokerId.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenInvokerId.TD.json @@ -12,7 +12,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{invokerClientId}", "op": "readproperty" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TD.json index 872874233c..c932572622 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TD.json @@ -12,7 +12,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TD.json index 729d2a3d35..7f52b6079f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TD.json @@ -13,7 +13,6 @@ "readOnly": false, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenReadAndWrite.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenReadAndWrite.TD.json index 25f35dd2a4..1b4f594a0b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenReadAndWrite.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenReadAndWrite.TD.json @@ -12,7 +12,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha", "op": [ "readproperty", "writeproperty" ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenSenderId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenSenderId.TD.json index ee34c3a325..11228f9d81 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenSenderId.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenSenderId.TD.json @@ -12,7 +12,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{senderId}", "op": "readproperty" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormUnsupportedProperty.TD.json index bcc2b620aa..9843d16484 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormUnsupportedProperty.TD.json @@ -12,7 +12,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/read", "op": "readproperty", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TD.json index 1f67dd49b6..6dd743fe97 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TD.json @@ -17,7 +17,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/all/events/read", "contentType": "application/json", "op": "readallproperties", @@ -28,7 +27,6 @@ ] }, { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/all/events/write", "contentType": "application/json", "op": "writemultipleproperties" @@ -41,7 +39,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "op": "readproperty", "additionalResponses": [ @@ -52,7 +49,6 @@ ] }, { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "op": "writeproperty", "additionalResponses": [ diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TD.json index 1b88a24811..94c0061a1f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TD.json @@ -12,13 +12,11 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/read", "op": "readproperty" }, { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "op": "writeproperty" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpReadDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpReadDuplicate.TD.json index 5cddc2a5e8..9df2479ece 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpReadDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpReadDuplicate.TD.json @@ -12,13 +12,11 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}", "op": "readproperty" }, { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}", "op": [ "readproperty", "writeproperty" ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteDuplicate.TD.json index 49ffb83b10..b88a907ee6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteDuplicate.TD.json @@ -12,13 +12,11 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}", "op": "writeproperty" }, { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}", "op": [ "readproperty", "writeproperty" ] diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteNoRead.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteNoRead.TD.json index b485fe99b7..e699dcdf2d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteNoRead.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteNoRead.TD.json @@ -12,7 +12,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/write", "op": "writeproperty" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessAndRead.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessAndRead.TD.json index 69219a84a5..8e4553c268 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessAndRead.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessAndRead.TD.json @@ -12,13 +12,11 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}", "op": "readproperty" }, { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessDuplicate.TD.json index 81fa5f4ed1..85ba571b36 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessDuplicate.TD.json @@ -12,12 +12,10 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}" }, { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyIntegerConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyIntegerConst.TD.json index 03c64a8cac..6f1d550769 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyIntegerConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyIntegerConst.TD.json @@ -13,7 +13,6 @@ "const": 78, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}", "op": "readproperty" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyNumberConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyNumberConst.TD.json index 47ac2b9d2f..e58f6a2966 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyNumberConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyNumberConst.TD.json @@ -13,7 +13,6 @@ "const": 3.14, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}", "op": "readproperty" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectConst.TD.json index 9ea45307d7..668e6521f5 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectConst.TD.json @@ -20,7 +20,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}", "op": "readproperty" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectErrorMessage.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectErrorMessage.TD.json index 46fc513a33..f61da2b488 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectErrorMessage.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectErrorMessage.TD.json @@ -18,7 +18,6 @@ "dtv:errorMessage": "val", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}", "op": "readproperty" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyStringConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyStringConst.TD.json index 29dfe7cf52..23adbaac25 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyStringConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyStringConst.TD.json @@ -13,7 +13,6 @@ "const": "hello", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}", "op": "readproperty" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyTypeNull.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyTypeNull.TD.json index 9bf32d60b7..f20ff73568 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyTypeNull.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyTypeNull.TD.json @@ -12,7 +12,6 @@ "type": "null", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}", "op": "readproperty" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyUnsupportedProperty.TD.json index 8640d41f88..7c309ef08d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyUnsupportedProperty.TD.json @@ -12,7 +12,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/read", "op": "readproperty" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeEmpty.TD.json index af71b8f5eb..e8827ae0c4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeEmpty.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:read;1", "dtv:topic": "sample/TestThing/read", "contentType": "application/json", "additionalResponses": [ @@ -23,7 +22,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -36,7 +34,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -48,7 +45,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeText.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeText.TD.json index a726856b0d..0be2614790 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeText.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeText.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:read;1", "dtv:topic": "sample/TestThing/read", "contentType": "application/json", "additionalResponses": [ @@ -23,7 +22,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -36,7 +34,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -48,7 +45,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseNoSuccess.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseNoSuccess.TD.json index 802c118d7d..004b5d3daf 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseNoSuccess.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseNoSuccess.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:read;1", "dtv:topic": "sample/TestThing/read", "contentType": "application/json", "additionalResponses": [ @@ -22,7 +21,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -35,7 +33,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -47,7 +44,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSchema.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSchema.TD.json index 43534824a3..9166837f77 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSchema.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSchema.TD.json @@ -12,7 +12,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:read;1", "dtv:topic": "sample/TestThing/read", "contentType": "application/json", "additionalResponses": [ @@ -29,7 +28,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -42,7 +40,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -54,7 +51,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSuccessTrue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSuccessTrue.TD.json index 2b4d1a7fce..c41e006d4a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSuccessTrue.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSuccessTrue.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:read;1", "dtv:topic": "sample/TestThing/read", "contentType": "application/json", "additionalResponses": [ @@ -23,7 +22,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -36,7 +34,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -48,7 +45,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseUnsupportedProperty.TD.json index e56f291b9a..e550294e7c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseUnsupportedProperty.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:read;1", "dtv:topic": "sample/TestThing/read", "contentType": "application/json", "additionalResponses": [ @@ -24,7 +23,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -37,7 +35,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -49,7 +46,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesAndSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesAndSubAll.TD.json index ca417be4df..9920a18b9a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesAndSubAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesAndSubAll.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/TestThing/events", "contentType": "application/json", "additionalResponses": [ @@ -22,7 +21,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -35,7 +33,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -47,7 +44,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesMultiple.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesMultiple.TD.json index 146f1db6d2..75ae9a1ff1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesMultiple.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesMultiple.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:read;1", "dtv:topic": "sample/TestThing/read", "contentType": "application/json", "additionalResponses": [ @@ -27,7 +26,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -40,7 +38,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -52,7 +49,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeCustom.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeCustom.TD.json index a52b68822f..a74e145271 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeCustom.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeCustom.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/TestThing/events", "contentType": "", "op": [ "subscribeallevents" ] @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeRaw.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeRaw.TD.json index b4cc7a73a8..deb158a273 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeRaw.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeRaw.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/TestThing/events", "contentType": "application/octet-stream", "op": [ "subscribeallevents" ] @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeText.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeText.TD.json index 6462eee0d8..46acdb59f3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeText.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeText.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/TestThing/events", "contentType": "application/text", "op": [ "subscribeallevents" ] @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderCode.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderCode.TD.json index 40fa6dc8ec..4bf5a9982b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderCode.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderCode.TD.json @@ -16,7 +16,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/TestThing/events", "contentType": "application/json", "dtv:headerCode": "myHeader", @@ -27,7 +26,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -40,7 +38,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -52,7 +49,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderInfo.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderInfo.TD.json index 9a3fc9267d..54e67e4a41 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderInfo.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderInfo.TD.json @@ -16,7 +16,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/TestThing/events", "contentType": "application/json", "dtv:headerInfo": [ @@ -32,7 +31,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -45,7 +43,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -57,7 +54,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoContentType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoContentType.TD.json index 887cd4e157..3640b0a4d1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoContentType.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoContentType.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/TestThing/events", "op": [ "subscribeallevents" ] } @@ -16,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -29,7 +27,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -41,7 +38,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoTopic.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoTopic.TD.json index c98d324085..86f5d2de67 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoTopic.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoTopic.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "contentType": "application/json", "op": [ "subscribeallevents" ] } @@ -16,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -29,7 +27,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -41,7 +38,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllAndSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllAndSubAll.TD.json index 26c9a30bbf..ff7334104c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllAndSubAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllAndSubAll.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/TestThing/events", "contentType": "application/json", "op": [ "readallproperties", "subscribeallevents" ] @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllDuplicate.TD.json index d233cb0a5b..8fd2cdc353 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllDuplicate.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/TestThing/events", "contentType": "application/json", "op": [ "readallproperties", "readallproperties" ] @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpSubAllDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpSubAllDuplicate.TD.json index 3f7f2a021e..9d53ba76d4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpSubAllDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpSubAllDuplicate.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/TestThing/events", "contentType": "application/json", "op": [ "subscribeallevents", "subscribeallevents" ] @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWiteMultiAndSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWiteMultiAndSubAll.TD.json index 9511f2785d..19de8a9f4a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWiteMultiAndSubAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWiteMultiAndSubAll.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/TestThing/events", "contentType": "application/json", "op": [ "writemultipleproperties", "subscribeallevents" ] @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWriteMultiDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWriteMultiDuplicate.TD.json index 4a864ada46..25bf971c72 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWriteMultiDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWriteMultiDuplicate.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/TestThing/events", "contentType": "application/json", "op": [ "writemultipleproperties", "writemultipleproperties" ] @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormReadAllButNoProperties.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormReadAllButNoProperties.TD.json index 38f1fb9e8c..29f1848a42 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormReadAllButNoProperties.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormReadAllButNoProperties.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/all/events", "contentType": "application/json", "op": "readallproperties" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupEmpty.TD.json index 4c8080255e..1b8e0eaefb 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupEmpty.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:event;1", "dtv:topic": "sample/TestThing/events", "contentType": "application/json", "dtv:serviceGroupId": "", @@ -18,7 +17,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -31,7 +29,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -43,7 +40,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupNoSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupNoSubAll.TD.json index b4c0ba2425..9b46425990 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupNoSubAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupNoSubAll.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:read;1", "dtv:topic": "sample/TestThing/read", "contentType": "application/json", "dtv:serviceGroupId": "MyGroup", @@ -18,7 +17,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -31,7 +29,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -43,7 +40,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormSubAllButNoEvents.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormSubAllButNoEvents.TD.json index 62b3f96b22..68de693517 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormSubAllButNoEvents.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormSubAllButNoEvents.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/all/events", "contentType": "application/json", "op": "subscribeallevents" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicEmpty.TD.json index cabaaf514b..e390d98362 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicEmpty.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "", "contentType": "application/json", "op": [ "subscribeallevents" ] @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelEmpty.TD.json index a1302589c7..baca2d67c6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelEmpty.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample//events", "contentType": "application/json", "op": [ "subscribeallevents" ] @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelInvalid.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelInvalid.TD.json index ffd60b1d5f..47dc5c000e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelInvalid.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelInvalid.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/foo+bar/events", "contentType": "application/json", "op": [ "subscribeallevents" ] @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicReservedStart.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicReservedStart.TD.json index 9ab9929c51..b62bafcb9a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicReservedStart.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicReservedStart.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "$sample/TestThing/events", "contentType": "application/json", "op": [ "subscribeallevents" ] @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenActionWhenSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenActionWhenSubAll.TD.json index e41dfcb65b..2d28981624 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenActionWhenSubAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenActionWhenSubAll.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/{action}/events", "contentType": "application/json", "op": [ "subscribeallevents" ] @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenConsumerIdWhenSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenConsumerIdWhenSubAll.TD.json index 5f77fac807..1f2d95ddae 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenConsumerIdWhenSubAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenConsumerIdWhenSubAll.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/{consumerClientId}/events", "contentType": "application/json", "op": [ "subscribeallevents" ] @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomEmpty.TD.json index 3b6d92b80b..a4ab3da93e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomEmpty.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/{ex:}/events", "contentType": "application/json", "op": [ "subscribeallevents" ] @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomInvalid.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomInvalid.TD.json index 55843ea893..82b7cba714 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomInvalid.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomInvalid.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/{ex:foo1}/events", "contentType": "application/json", "op": [ "subscribeallevents" ] @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenEmpty.TD.json index 2a0fe53920..a8b2b80e0a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenEmpty.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/{}/events", "contentType": "application/json", "op": [ "subscribeallevents" ] @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenExecutorId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenExecutorId.TD.json index 5d1f7ed98d..6ce40f674f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenExecutorId.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenExecutorId.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/{executorId}/events", "contentType": "application/json", "op": [ "subscribeallevents" ] @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenInvokerId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenInvokerId.TD.json index a8ec4f81de..9d20dfa7c4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenInvokerId.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenInvokerId.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/{invokerClientId}/events", "contentType": "application/json", "op": [ "subscribeallevents" ] @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenMaintainerIdWhenSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenMaintainerIdWhenSubAll.TD.json index 4d6cd43ca1..fbfad76277 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenMaintainerIdWhenSubAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenMaintainerIdWhenSubAll.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/{maintainerId}/events", "contentType": "application/json", "op": [ "subscribeallevents" ] @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TD.json index 264cccd41d..376c6b3d87 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/TestThing/events", "contentType": "application/json", "op": [ "readallproperties", "writemultipleproperties" ] @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenReadAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenReadAll.TD.json index bef5484391..150b475548 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenReadAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenReadAll.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/{senderId}/events", "contentType": "application/json", "op": [ "readallproperties" ] @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenWriteMulti.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenWriteMulti.TD.json index 54dc4b3fb9..22ecd416f1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenWriteMulti.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenWriteMulti.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/{senderId}/events", "contentType": "application/json", "op": [ "writemultipleproperties" ] @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenUnrecognized.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenUnrecognized.TD.json index 814acff0db..20ae24b0de 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenUnrecognized.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenUnrecognized.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/{foobar}/events", "contentType": "application/json", "op": [ "subscribeallevents" ] @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormWriteMultiButNoWritableProperties.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormWriteMultiButNoWritableProperties.TD.json index 0aa0216845..d6e83e124c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormWriteMultiButNoWritableProperties.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormWriteMultiButNoWritableProperties.TD.json @@ -7,13 +7,11 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/all/events/read", "contentType": "application/json", "op": "readallproperties" }, { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/all/events/write", "contentType": "application/json", "op": "writemultipleproperties" @@ -27,7 +25,6 @@ "readOnly": true, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}" } @@ -37,7 +34,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}", "op": "readproperty" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpReadAllDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpReadAllDuplicate.TD.json index 63bc36caa5..9e05591149 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpReadAllDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpReadAllDuplicate.TD.json @@ -7,13 +7,11 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/TestThing/read", "contentType": "application/json", "op": "readallproperties" }, { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/{action}/props", "contentType": "application/json", "op": [ "readallproperties", "writemultipleproperties" ] @@ -23,7 +21,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -36,7 +33,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -48,7 +44,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpSubAllDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpSubAllDuplicate.TD.json index e16167591c..7a4bd31941 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpSubAllDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpSubAllDuplicate.TD.json @@ -7,13 +7,11 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/TestThing/events", "contentType": "application/json", "op": "subscribeallevents" }, { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/all/events", "contentType": "application/json", "op": "subscribeallevents" @@ -23,7 +21,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -36,7 +33,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -48,7 +44,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiDuplicate.TD.json index b6475ba3e5..42939701af 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiDuplicate.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiDuplicate.TD.json @@ -7,13 +7,11 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/TestThing/write", "contentType": "application/json", "op": "writemultipleproperties" }, { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/{action}/props", "contentType": "application/json", "op": [ "readallproperties", "writemultipleproperties" ] @@ -23,7 +21,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -36,7 +33,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -48,7 +44,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiNoReadAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiNoReadAll.TD.json index f362e239e0..bd0fa682af 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiNoReadAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiNoReadAll.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/TestThing/write", "contentType": "application/json", "op": "writemultipleproperties" @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayConst.TD.json index cebc2e86d8..03a0d3649a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayConst.TD.json @@ -18,7 +18,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsNoType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsNoType.TD.json index 48a3ddae17..7495a821e3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsNoType.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsNoType.TD.json @@ -16,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsObjectConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsObjectConst.TD.json index cb39c784f2..2a58f4fd03 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsObjectConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsObjectConst.TD.json @@ -25,7 +25,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsRef.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsRef.TD.json index cd3546c42e..f7f3025648 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsRef.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsRef.TD.json @@ -17,7 +17,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsStringConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsStringConst.TD.json index e5367e5eb0..980967f710 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsStringConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsStringConst.TD.json @@ -18,7 +18,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsTypeNull.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsTypeNull.TD.json index 5127b23cc9..dd827a6ad0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsTypeNull.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsTypeNull.TD.json @@ -17,7 +17,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayNoItems.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayNoItems.TD.json index 964d27fdd9..496d934d25 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayNoItems.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayNoItems.TD.json @@ -14,7 +14,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanConstValueNotBoolean.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanConstValueNotBoolean.TD.json index da527fc643..6f66703b55 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanConstValueNotBoolean.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanConstValueNotBoolean.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanReadOnly.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanReadOnly.TD.json index 23cbcd81c6..ed3665f37f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanReadOnly.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanReadOnly.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanUnsupportedProperty.TD.json index f43063cda8..57158305cf 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanUnsupportedProperty.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueAboveMax.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueAboveMax.TD.json index f349526c93..10f95f3e45 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueAboveMax.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueAboveMax.TD.json @@ -16,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueBelowMin.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueBelowMin.TD.json index b148dcccbe..3a4a63e118 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueBelowMin.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueBelowMin.TD.json @@ -16,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotInteger.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotInteger.TD.json index 691e3119ad..b797bc69ff 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotInteger.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotInteger.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotNumeric.TD.json index 2d3ebde2fa..5f5faff42e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotNumeric.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotNumeric.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMaxNotInteger.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMaxNotInteger.TD.json index 4b75fd3fca..fa315fcb49 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMaxNotInteger.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMaxNotInteger.TD.json @@ -16,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinAboveMax.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinAboveMax.TD.json index 7c67de901c..805352f8d7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinAboveMax.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinAboveMax.TD.json @@ -16,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinNotInteger.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinNotInteger.TD.json index a8eaae5c76..6a97347528 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinNotInteger.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinNotInteger.TD.json @@ -16,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerReadOnly.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerReadOnly.TD.json index dac3c47f49..c34baf48f3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerReadOnly.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerReadOnly.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerUnsupportedProperty.TD.json index 976eee564b..484a62c67f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerUnsupportedProperty.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesNoType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesNoType.TD.json index 02552940ed..7f976d0d21 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesNoType.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesNoType.TD.json @@ -16,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesObjectConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesObjectConst.TD.json index d632071d7e..98568086a4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesObjectConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesObjectConst.TD.json @@ -25,7 +25,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TD.json index 6429f0603d..4597a7173e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TD.json @@ -17,7 +17,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesStringConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesStringConst.TD.json index fc43f4678a..8cfa4281cc 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesStringConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesStringConst.TD.json @@ -18,7 +18,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesTypeNull.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesTypeNull.TD.json index 13870c5031..da8b97572b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesTypeNull.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesTypeNull.TD.json @@ -17,7 +17,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapConst.TD.json index 501bebc620..1eb454045c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapConst.TD.json @@ -20,7 +20,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNoType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNoType.TD.json index f702667045..8219246baa 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNoType.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNoType.TD.json @@ -13,7 +13,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueAboveMax.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueAboveMax.TD.json index 1105eba76e..a900cda691 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueAboveMax.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueAboveMax.TD.json @@ -16,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueBelowMin.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueBelowMin.TD.json index 3d46dc7af7..e87f67bead 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueBelowMin.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueBelowMin.TD.json @@ -16,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueNotNumeric.TD.json index ba3b8d4060..a743c33985 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueNotNumeric.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueNotNumeric.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberMinAboveMax.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberMinAboveMax.TD.json index 88b4f60ea7..bd6fefd63e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberMinAboveMax.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberMinAboveMax.TD.json @@ -16,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberReadOnly.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberReadOnly.TD.json index c0e0e7f4c7..29456cf262 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberReadOnly.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberReadOnly.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberUnsupportedProperty.TD.json index efac35c02d..5263a274a8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberUnsupportedProperty.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectBothDeterminants.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectBothDeterminants.TD.json index b146dd5844..6abb404ff3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectBothDeterminants.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectBothDeterminants.TD.json @@ -22,7 +22,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstNotObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstNotObject.TD.json index 422774891e..d94a7b4e18 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstNotObject.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstNotObject.TD.json @@ -20,7 +20,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanConst.TD.json index c329c3f6bc..4b7acdac74 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanConst.TD.json @@ -23,7 +23,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TD.json index 8ef92c53a9..e8eccd5a37 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TD.json @@ -22,7 +22,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TD.json index 7260500528..9327d4b25f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TD.json @@ -23,7 +23,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerAboveMax.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerAboveMax.TD.json index 76cd2a3bea..3047e01aa5 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerAboveMax.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerAboveMax.TD.json @@ -23,7 +23,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerBelowMin.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerBelowMin.TD.json index a9969d24d1..b272abe421 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerBelowMin.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerBelowMin.TD.json @@ -23,7 +23,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerConst.TD.json index 773969c3de..cc260dab1f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerConst.TD.json @@ -23,7 +23,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotInteger.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotInteger.TD.json index b5bc8fa105..1823eddead 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotInteger.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotInteger.TD.json @@ -22,7 +22,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TD.json index f1b0c4cc69..875e8aa29e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TD.json @@ -22,7 +22,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TD.json index f29be9e4ec..321a6bab2a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TD.json @@ -23,7 +23,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoType.TD.json index 316cc87185..cbdecaed3c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoType.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoType.TD.json @@ -21,7 +21,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoValue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoValue.TD.json index d4ce71c92e..15c4708b2d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoValue.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoValue.TD.json @@ -21,7 +21,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberAboveMax.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberAboveMax.TD.json index 3146e61f38..a4a8bdd7fe 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberAboveMax.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberAboveMax.TD.json @@ -23,7 +23,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberBelowMin.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberBelowMin.TD.json index 419992037a..8a3cf70273 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberBelowMin.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberBelowMin.TD.json @@ -23,7 +23,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberConst.TD.json index 684df9ae88..296a71394b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberConst.TD.json @@ -23,7 +23,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberNotNumeric.TD.json index 2486a097b4..a1ab42ecbf 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberNotNumeric.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberNotNumeric.TD.json @@ -22,7 +22,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TD.json index 0e4ad776a7..2477907c91 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TD.json @@ -23,7 +23,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringConst.TD.json index 7aa3ec9839..38540434f9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringConst.TD.json @@ -23,7 +23,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TD.json index d63fd93ed6..e94d5aaa4b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TD.json @@ -23,7 +23,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringValueNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringValueNotString.TD.json index 17c25fd76f..480d7df36c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringValueNotString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringValueNotString.TD.json @@ -22,7 +22,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeArray.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeArray.TD.json index 9dd6fe349e..eb99bb0dc9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeArray.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeArray.TD.json @@ -25,7 +25,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeNull.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeNull.TD.json index a8b05937db..946af0be90 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeNull.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeNull.TD.json @@ -22,7 +22,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeObject.TD.json index e0dfaa415a..b30e17e190 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeObject.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeObject.TD.json @@ -29,7 +29,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstUnsupportedProperty.TD.json index 6486674b33..b1f32f7a99 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstUnsupportedProperty.TD.json @@ -23,7 +23,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstValueNoSchema.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstValueNoSchema.TD.json index f3d47a5ec8..6d4d077a5f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstValueNoSchema.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstValueNoSchema.TD.json @@ -19,7 +19,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNoProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNoProperty.TD.json index 304709b7ee..88f174b1ed 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNoProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNoProperty.TD.json @@ -17,7 +17,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNotString.TD.json index df8624d07b..13bc2bd3ee 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNotString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNotString.TD.json @@ -20,7 +20,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessagePropertyNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessagePropertyNotString.TD.json index b2a7378543..20313acdf9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessagePropertyNotString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessagePropertyNotString.TD.json @@ -20,7 +20,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectNoDeterminant.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectNoDeterminant.TD.json index 3626d30b6e..e9404c21e8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectNoDeterminant.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectNoDeterminant.TD.json @@ -14,7 +14,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertiesNotObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertiesNotObject.TD.json index 553801daa5..4649cb4c4d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertiesNotObject.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertiesNotObject.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyNoType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyNoType.TD.json index b5f6c024ec..ea4f12e60b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyNoType.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyNoType.TD.json @@ -18,7 +18,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyObjectConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyObjectConst.TD.json index 4998533418..6494aef209 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyObjectConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyObjectConst.TD.json @@ -27,7 +27,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyRef.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyRef.TD.json index 6c0ac4397f..1f81951e42 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyRef.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyRef.TD.json @@ -19,7 +19,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyStringConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyStringConst.TD.json index f7598eb717..e16c9ff967 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyStringConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyStringConst.TD.json @@ -20,7 +20,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyTypeNull.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyTypeNull.TD.json index 26a4eaa364..6c876edd40 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyTypeNull.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyTypeNull.TD.json @@ -19,7 +19,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectRequiredNoProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectRequiredNoProperty.TD.json index 3ce417077e..ecd9c3e467 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectRequiredNoProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectRequiredNoProperty.TD.json @@ -17,7 +17,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionRef.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionRef.TD.json index 339c878841..4d603d71f8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionRef.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionRef.TD.json @@ -14,7 +14,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstContentEncoding.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstContentEncoding.TD.json index 417d889639..a597f96775 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstContentEncoding.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstContentEncoding.TD.json @@ -16,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstFormat.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstFormat.TD.json index 4aace95fb3..25b16185c9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstFormat.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstFormat.TD.json @@ -16,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstPattern.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstPattern.TD.json index 73f62b6bd2..18ec3a4d62 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstPattern.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstPattern.TD.json @@ -16,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstUnsupportedProperty.TD.json index 8d75343d03..7e3724ac01 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstUnsupportedProperty.TD.json @@ -16,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstValueNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstValueNotString.TD.json index b45a425a83..3b05555ddc 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstValueNotString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstValueNotString.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringContentEncodingUnsupportedValue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringContentEncodingUnsupportedValue.TD.json index 2b041af76d..ea265ef90e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringContentEncodingUnsupportedValue.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringContentEncodingUnsupportedValue.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumConst.TD.json index 9dd8ac86ef..bd40859e50 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumConst.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumConst.TD.json @@ -16,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumContentEncoding.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumContentEncoding.TD.json index faffaa7439..44c2431798 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumContentEncoding.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumContentEncoding.TD.json @@ -16,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumElementInvalid.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumElementInvalid.TD.json index b1e29dd961..f766b2f0cc 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumElementInvalid.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumElementInvalid.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumFormat.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumFormat.TD.json index 33fda6badd..55711e46a0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumFormat.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumFormat.TD.json @@ -16,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumPattern.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumPattern.TD.json index cb5c2bf636..a8c8bf3136 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumPattern.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumPattern.TD.json @@ -16,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumReadOnly.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumReadOnly.TD.json index 088e742895..d19ec362d4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumReadOnly.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumReadOnly.TD.json @@ -16,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumUnsupportedProperty.TD.json index 3d7f531012..5565edec24 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumUnsupportedProperty.TD.json @@ -16,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndContentEncoding.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndContentEncoding.TD.json index 28bf6e04bb..923b965bbf 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndContentEncoding.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndContentEncoding.TD.json @@ -16,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndPattern.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndPattern.TD.json index 41d8928f23..ac97ff24af 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndPattern.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndPattern.TD.json @@ -16,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatUnsupportedValue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatUnsupportedValue.TD.json index e30758ce5e..bee67fe6df 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatUnsupportedValue.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatUnsupportedValue.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternAndContentEncoding.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternAndContentEncoding.TD.json index 79ae7cece6..3ddea039e4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternAndContentEncoding.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternAndContentEncoding.TD.json @@ -16,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternNotDurationOrDecimal.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternNotDurationOrDecimal.TD.json index a9b43dae43..d752c93ec4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternNotDurationOrDecimal.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternNotDurationOrDecimal.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternRegexInvalid.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternRegexInvalid.TD.json index 015e55f9d6..dd49659682 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternRegexInvalid.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternRegexInvalid.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringReadOnly.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringReadOnly.TD.json index b2a5034711..4c3d56c4fd 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringReadOnly.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringReadOnly.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringUnsupportedProperty.TD.json index c0fb44005a..71e176f0d1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringUnsupportedProperty.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionTypeNull.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionTypeNull.TD.json index bac652109c..9a5bdb88fc 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionTypeNull.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionTypeNull.TD.json @@ -14,7 +14,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleEmpty.TD.json index a4d5d2aa44..0d75c0e177 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleEmpty.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleInvalid.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleInvalid.TD.json index b91f63fe93..253399d824 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleInvalid.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleInvalid.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ArrayKey.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ArrayKey.TD.json index 13bf7db300..d46866781a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ArrayKey.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ArrayKey.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", [ "contentType" ]: "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/BooleanKey.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/BooleanKey.TD.json index d32226394d..3d238780ad 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/BooleanKey.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/BooleanKey.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", true: "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/DuplicateKey.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/DuplicateKey.TD.json index 404606c1ef..29239df868 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/DuplicateKey.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/DuplicateKey.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "contentType": "application/text", "dtv:topic": "sample/TestThing/command/noop", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingColon.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingColon.TD.json index 066ca01488..814da81651 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingColon.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingColon.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType" "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingComma.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingComma.TD.json index be43b57a8d..30756fdeba 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingComma.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingComma.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json" "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingElement.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingElement.TD.json index 3a6bbb4566..17e690bc6c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingElement.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingElement.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingKey.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingKey.TD.json index 298d98a91a..d3d6943553 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingKey.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingKey.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", : "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingValue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingValue.TD.json index 985966edcc..316e419c2a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingValue.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingValue.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": , "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/NumericKey.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/NumericKey.TD.json index 1bad690406..42641bd6a5 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/NumericKey.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/NumericKey.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", 626: "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ObjectKey.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ObjectKey.TD.json index 2973853808..414478f81c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ObjectKey.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ObjectKey.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", { "contentType": true }: "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/TrailingComma.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/TrailingComma.TD.json index 2a97bdc327..799834361e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/TrailingComma.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/TrailingComma.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedArray.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedArray.TD.json index 29c0583797..c55cc55fa3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedArray.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedArray.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedObject.TD.json index 6ae918613b..7aa17db02c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedObject.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedObject.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpRead.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpRead.TD.json index f89956032b..bf811bf3de 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpRead.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpRead.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "readproperty" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpSub.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpSub.TD.json index 57a5454ad1..d0e8141de1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpSub.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpSub.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "subscribeevent" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpWrite.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpWrite.TD.json index 84c179196a..da9982d7fa 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpWrite.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpWrite.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:noop;1", "contentType": "application/json", "dtv:topic": "sample/noop/{executorId}", "op": "writeproperty" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextMissingWot.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextMissingWot.TD.json index 72141f0a39..80124e3b98 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextMissingWot.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextMissingWot.TD.json @@ -8,7 +8,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextWrongType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextWrongType.TD.json index 127618028d..ddf652eeef 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextWrongType.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextWrongType.TD.json @@ -6,7 +6,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpInvoke.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpInvoke.TD.json index 25505e7ab6..132d98d03a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpInvoke.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpInvoke.TD.json @@ -16,7 +16,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", "dtv:topic": "sample/alert/TestThing", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpRead.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpRead.TD.json index fc511fde1e..78e998834e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpRead.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpRead.TD.json @@ -16,7 +16,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", "dtv:topic": "sample/alert/TestThing", "op": "readproperty" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpSubAll.TD.json index e73a000920..39eabe2cb8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpSubAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpSubAll.TD.json @@ -16,7 +16,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", "dtv:topic": "sample/alert/TestThing", "op": "subscribeallevents" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpWrite.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpWrite.TD.json index caf5bd6165..e2cc6c03aa 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpWrite.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpWrite.TD.json @@ -16,7 +16,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:alert;1", "contentType": "application/json", "dtv:topic": "sample/alert/TestThing", "op": "writeproperty" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoContext.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoContext.TD.json index b428dae6d9..9bad55b494 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoContext.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoContext.TD.json @@ -5,7 +5,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoType.TD.json index 801086ad8e..cc8f0372e9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoType.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoType.TD.json @@ -8,7 +8,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpInvoke.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpInvoke.TD.json index f49b16af8f..90529f1eb3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpInvoke.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpInvoke.TD.json @@ -12,7 +12,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpReadAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpReadAll.TD.json index 385e33d33a..0ef06523fc 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpReadAll.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpReadAll.TD.json @@ -12,7 +12,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}", "op": "readallproperties" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpSub.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpSub.TD.json index 9ef36f4ff1..c0487197fa 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpSub.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpSub.TD.json @@ -12,7 +12,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}", "op": "subscribeevent" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpWriteMulti.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpWriteMulti.TD.json index 03ed8e6c24..a514f4eb2d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpWriteMulti.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpWriteMulti.TD.json @@ -12,7 +12,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}", "op": "writemultipleproperties" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormNoOp.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormNoOp.TD.json index 3e97477c81..50b6746311 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormNoOp.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormNoOp.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:read;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/read" } @@ -16,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -29,7 +27,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -41,7 +38,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpArrayEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpArrayEmpty.TD.json index 0ab6a8f2dc..3458569c63 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpArrayEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpArrayEmpty.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:read;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/read", "op": [ ] @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpElementEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpElementEmpty.TD.json index 3abbfd863f..8079a08a9f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpElementEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpElementEmpty.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:read;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/read", "op": [ "" ] @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpEmpty.TD.json index 45991bcb10..89efa3a387 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpEmpty.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:read;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/read", "op": "" @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpReadOne.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpReadOne.TD.json index ce3bf533e5..244f8b047f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpReadOne.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpReadOne.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:read;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/read", "op": [ "readproperty" ] @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpSubOne.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpSubOne.TD.json index cd18920202..303fe1b440 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpSubOne.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpSubOne.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/evens", "op": [ "subscribeevent" ] @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpWriteOne.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpWriteOne.TD.json index 3c5865630b..ce413d37a0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpWriteOne.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpWriteOne.TD.json @@ -7,7 +7,6 @@ "title": "Noop", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:write;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/write", "op": [ "writeproperty" ] @@ -17,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -30,7 +28,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -42,7 +39,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormsEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormsEmpty.TD.json index d0141fc058..b5f1c09593 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormsEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormsEmpty.TD.json @@ -11,7 +11,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" @@ -24,7 +23,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1" } ] } @@ -36,7 +34,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alert;1" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsNotObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsNotObject.TD.json index 883048a3e6..08d040b0b7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsNotObject.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsNotObject.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeNotString.TD.json index 0b776254fc..d1890a1166 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeNotString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeNotString.TD.json @@ -17,7 +17,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeUnsupported.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeUnsupported.TD.json index 289fa3e692..ca6ba69505 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeUnsupported.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeUnsupported.TD.json @@ -17,7 +17,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMaxNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMaxNotNumeric.TD.json index 99a2d4602c..18b9a9fc7a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMaxNotNumeric.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMaxNotNumeric.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMinNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMinNotNumeric.TD.json index f752aa1182..cde5b1973b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMinNotNumeric.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMinNotNumeric.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesNotObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesNotObject.TD.json index 7589d4ab67..2d7d650a4f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesNotObject.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesNotObject.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeNotString.TD.json index e1afe04f9d..e3f057d71e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeNotString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeNotString.TD.json @@ -17,7 +17,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TD.json index a1c19d896c..4a0245046d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TD.json @@ -17,7 +17,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMaxNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMaxNotNumeric.TD.json index 3b04aa5c72..8dbcc10e76 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMaxNotNumeric.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMaxNotNumeric.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMinNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMinNotNumeric.TD.json index 57a8fa2dc2..93cea13775 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMinNotNumeric.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMinNotNumeric.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectConstPropertyTypeUnsupported.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectConstPropertyTypeUnsupported.TD.json index 3b0b0494e4..2d3181130b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectConstPropertyTypeUnsupported.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectConstPropertyTypeUnsupported.TD.json @@ -22,7 +22,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeNotString.TD.json index 797b5d1656..46ca98158f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeNotString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeNotString.TD.json @@ -19,7 +19,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeUnsupported.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeUnsupported.TD.json index 29d4b63dfe..7361b79103 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeUnsupported.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeUnsupported.TD.json @@ -19,7 +19,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectRequiredNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectRequiredNotString.TD.json index 8094b37f5e..f73bb2213c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectRequiredNotString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectRequiredNotString.TD.json @@ -20,7 +20,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringContentEncodingNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringContentEncodingNotString.TD.json index 0f5337475e..9c64279ac9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringContentEncodingNotString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringContentEncodingNotString.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringFormatNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringFormatNotString.TD.json index 4a1ee93500..7ca9d2cc5a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringFormatNotString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringFormatNotString.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringPatternNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringPatternNotString.TD.json index 73c5c88df2..7962ab7c16 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringPatternNotString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringPatternNotString.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeNotString.TD.json index 5972e95439..091252e6f6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeNotString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeNotString.TD.json @@ -14,7 +14,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeUnsupported.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeUnsupported.TD.json index db448f1664..ed3df528eb 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeUnsupported.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeUnsupported.TD.json @@ -14,7 +14,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TitleNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TitleNotString.TD.json index d31fafa20a..7ec7cfba57 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TitleNotString.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TitleNotString.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TypeEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TypeEmpty.TD.json index 44278d9c3b..5d681bcb69 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TypeEmpty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TypeEmpty.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TypeNotThingModel.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TypeNotThingModel.TD.json index f50a377359..e8f48267cc 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TypeNotThingModel.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TypeNotThingModel.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/IdInvalidReplacementButNotInTopic.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/IdInvalidReplacementButNotInTopic.TD.json deleted file mode 100644 index c8710c18ec..0000000000 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/IdInvalidReplacementButNotInTopic.TD.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "@context": [ - "https://www.w3.org/2022/wot/td/v1.1", - { "dtv": "http://azure.com/DigitalTwins/dtmi#" } - ], - "@type": "tm:ThingModel", - "title": "Noop", - "actions": { - "noop": { - "forms": [ - { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", - "contentType": "application/json", - "dtv:topic": "sample/fixed/command/noop", - "op": "invokeaction" - } - ] - } - }, - "properties": { - }, - "events": { - } -} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkNoRel.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkNoRel.TD.json index d042666482..d3384c7adf 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkNoRel.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkNoRel.TD.json @@ -15,7 +15,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkOtherRel.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkOtherRel.TD.json index 0002248126..a5e5a6bf4c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkOtherRel.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkOtherRel.TD.json @@ -16,7 +16,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/Noop.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/Noop.TD.json index e9106d87de..02be4cdb81 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/Noop.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/Noop.TD.json @@ -9,7 +9,6 @@ "noop": { "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "sample/TestThing/command/noop", "op": "invokeaction" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TD.json index 1c249c143b..575a3eedef 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TD.json @@ -17,7 +17,6 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/all/events", "contentType": "application/json", "op": "readallproperties", @@ -35,13 +34,11 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}", "op": "readproperty" }, { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}", "op": "writeproperty", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TD.json index 790fdcc231..39869628e1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TD.json @@ -17,13 +17,11 @@ }, "forms": [ { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/all/events/read", "contentType": "application/json", "op": "readallproperties" }, { - "href": "dtmi:test:ProtocolCompiler:events;1", "dtv:topic": "sample/all/events/write", "contentType": "application/json", "op": "writemultipleproperties", @@ -41,7 +39,6 @@ "type": "string", "forms": [ { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}", "op": "readproperty", @@ -53,7 +50,6 @@ ] }, { - "href": "dtmi:test:ProtocolCompiler:_contents:__alpha;1", "contentType": "application/json", "dtv:topic": "sample/alpha/{maintainerId}/{action}", "op": "writeproperty" From 46e10c6df5abce5acb2555fbca16f08c01fa0397 Mon Sep 17 00:00:00 2001 From: "John (JD) Douceur" Date: Wed, 7 Jan 2026 14:56:56 -0800 Subject: [PATCH 35/52] further TM updates --- codegen2/eval/wot/.vscode/settings.json | 2 +- ...on-schema.json => aio-tm-json-schema.json} | 2 +- .../TDValues.cs | 2 +- .../ThingValidator.cs | 77 ++++++++++++------- .../Model/TDThing.cs | 30 +++++++- .../Dtdl2Wot/Interface/t4/InterfaceThing.tt | 2 +- .../failure/ThingUnsupportedProperty.json | 16 ++++ .../invalidAioBinding/LinkEmptyHref.TD.json | 2 +- .../invalidAioBinding/LinkEmptyType.TD.json | 2 +- .../invalidAioBinding/LinkNoHref.TD.json | 2 +- .../invalidAioBinding/LinkNoType.TD.json | 2 +- .../invalidAioBinding/LinkNonJsonFile.TD.json | 2 +- .../LinkNonexistentFile.TD.json | 2 +- .../invalidAioBinding/LinkTypeNotJson.TD.json | 2 +- .../LinkUnsupportedProperty.TD.json | 2 +- .../invalidAioBinding/MultipleLinks.TD.json | 4 +- .../ThingUnsupportedProperty.TD.json | 24 ++++++ 17 files changed, 131 insertions(+), 44 deletions(-) rename codegen2/schema/{aio-td-json-schema.json => aio-tm-json-schema.json} (99%) create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ThingUnsupportedProperty.json create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ThingUnsupportedProperty.TD.json diff --git a/codegen2/eval/wot/.vscode/settings.json b/codegen2/eval/wot/.vscode/settings.json index f6b9a56011..0c40ec4af1 100644 --- a/codegen2/eval/wot/.vscode/settings.json +++ b/codegen2/eval/wot/.vscode/settings.json @@ -3,7 +3,7 @@ "json.schemas": [ { "fileMatch": [ "**/*.TD.json" ], - "url": "../../schema/aio-td-json-schema.json" + "url": "../../schema/aio-tm-json-schema.json" } ] } diff --git a/codegen2/schema/aio-td-json-schema.json b/codegen2/schema/aio-tm-json-schema.json similarity index 99% rename from codegen2/schema/aio-td-json-schema.json rename to codegen2/schema/aio-tm-json-schema.json index beaa80dfcd..2a10fa0a9d 100644 --- a/codegen2/schema/aio-td-json-schema.json +++ b/codegen2/schema/aio-tm-json-schema.json @@ -781,7 +781,7 @@ }, "allOf": [ { - "$ref": "./td-json-schema-validation.json" + "$ref": "./tm-json-schema-validation.json" }, { "properties": { diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/TDValues.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/TDValues.cs index 7d19760cb4..fac4cc3414 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/TDValues.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/TDValues.cs @@ -4,7 +4,7 @@ public static class TDValues { - public const string RelationSchemaNaming = "service-desc"; + public const string RelationSchemaNaming = "dtv:naming"; public const string ContentTypeJson = "application/json"; public const string ContentTypeRaw = "application/octet-stream"; diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs index 1a5bb5218e..63420e9aed 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs @@ -13,8 +13,6 @@ public class ThingValidator private const string AioContextUriBase = "http://azure.com/DigitalTwins/dtmi#"; private const string AioContextPrefix = "dtv"; - private const string LinkRelSchemaNamer = "service-desc"; - private const string Iso8601DurationExample = "P3Y6M4DT12H30M5S"; private const string DecimalExample = "1234567890.0987654321"; private const string AnArbitraryString = "Pretty12345Tricky67890"; @@ -99,19 +97,7 @@ public bool TryValidateThng(TDThing thing, HashSet serializ hasError = true; } - HashSet supportedProperties = new() - { - TDThing.ContextName, - TDThing.TypeName, - TDThing.TitleName, - TDThing.LinksName, - TDThing.SchemaDefinitionsName, - TDThing.FormsName, - TDThing.ActionsName, - TDThing.PropertiesName, - TDThing.EventsName, - }; - if (!TryValidateResidualProperties(thing.PropertyNames, supportedProperties, null, "an AIO Thing Model")) + if (!TryValidateThingPropertyNames(thing.PropertyNames)) { hasError = true; } @@ -126,6 +112,39 @@ public bool TryValidateThng(TDThing thing, HashSet serializ return !hasError; } + private bool TryValidateThingPropertyNames(Dictionary propertyNames) + { + bool hasError = false; + + foreach (KeyValuePair propertyName in propertyNames) + { + if (propertyName.Key != TDThing.ContextName && + propertyName.Key != TDThing.TypeName && + propertyName.Key != TDThing.TitleName && + propertyName.Key != TDThing.DescriptionName && + propertyName.Key != TDThing.LinksName && + propertyName.Key != TDThing.SchemaDefinitionsName && + propertyName.Key != TDThing.FormsName && + propertyName.Key != TDThing.OptionalName && + propertyName.Key != TDThing.ActionsName && + propertyName.Key != TDThing.PropertiesName && + propertyName.Key != TDThing.EventsName) + { + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) + { + errorReporter.ReportWarning($"Thing has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); + } + else + { + errorReporter.ReportError(ErrorCondition.PropertyUnsupported, $"Thing has '{propertyName.Key}' property, which is not supported.", propertyName.Value); + hasError = true; + } + } + } + + return !hasError; + } + private void CheckSchemaDefinitionsCoverage(MapTracker? schemaDefinitions, MapTracker? actions, MapTracker? properties) { if (schemaDefinitions?.Entries == null) @@ -519,7 +538,7 @@ private bool TryValidateLinks(ArrayTracker? links) errorReporter.ReportWarning($"Link element is missing '{TDLink.RelName}' property; element will be ignored.", link.TokenIndex); continue; } - if (link.Value.Rel.Value.Value != LinkRelSchemaNamer) + if (link.Value.Rel.Value.Value != TDValues.RelationSchemaNaming) { errorReporter.ReportWarning($"Link element {TDLink.RelName} property has unrecognized value '{link.Value.Rel.Value.Value}'; element will be ignored.", link.Value.Rel.TokenIndex); continue; @@ -529,28 +548,28 @@ private bool TryValidateLinks(ArrayTracker? links) if (link.Value.Href == null) { - errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Link element with {TDLink.RelName}='{LinkRelSchemaNamer}' is missing required '{TDLink.HrefName}' property.", link.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Link element with {TDLink.RelName}='{TDValues.RelationSchemaNaming}' is missing required '{TDLink.HrefName}' property.", link.TokenIndex); hasError = true; } else if (string.IsNullOrWhiteSpace(link.Value.Href.Value.Value)) { - errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Link element with {TDLink.RelName}='{LinkRelSchemaNamer}' has empty '{TDLink.HrefName}' property value.", link.Value.Href.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Link element with {TDLink.RelName}='{TDValues.RelationSchemaNaming}' has empty '{TDLink.HrefName}' property value.", link.Value.Href.TokenIndex); hasError = true; } if (link.Value.Type == null) { - errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Link element with {TDLink.RelName}='{LinkRelSchemaNamer}' is missing required '{TDLink.TypeName}' property.", link.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Link element with {TDLink.RelName}='{TDValues.RelationSchemaNaming}' is missing required '{TDLink.TypeName}' property.", link.TokenIndex); hasError = true; } else if (string.IsNullOrWhiteSpace(link.Value.Type.Value.Value)) { - errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Link element with {TDLink.RelName}='{LinkRelSchemaNamer}' has empty '{TDLink.TypeName}' property value.", link.Value.Type.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Link element with {TDLink.RelName}='{TDValues.RelationSchemaNaming}' has empty '{TDLink.TypeName}' property value.", link.Value.Type.TokenIndex); hasError = true; } else if (link.Value.Type.Value.Value != TDValues.ContentTypeJson) { - errorReporter.ReportError(ErrorCondition.PropertyUnsupportedValue, $"Link element with {TDLink.RelName}='{LinkRelSchemaNamer}' has '{TDLink.TypeName}' property with unsupported value '{link.Value.Type.Value.Value}'.", link.Value.Type.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupportedValue, $"Link element with {TDLink.RelName}='{TDValues.RelationSchemaNaming}' has '{TDLink.TypeName}' property with unsupported value '{link.Value.Type.Value.Value}'.", link.Value.Type.TokenIndex); hasError = true; } @@ -573,7 +592,7 @@ private bool TryValidateLinks(ArrayTracker? links) if (relSchemaNamerCount > 1) { - errorReporter.ReportError(ErrorCondition.Duplication, $"Thing Description has multiple links with '{TDLink.RelName}' property value '{LinkRelSchemaNamer}'; only one is allowed.", links.TokenIndex); + errorReporter.ReportError(ErrorCondition.Duplication, $"Thing Description has multiple links with '{TDLink.RelName}' property value '{TDValues.RelationSchemaNaming}'; only one is allowed.", links.TokenIndex); hasError = true; } @@ -1509,7 +1528,7 @@ private bool TryValidateStringConst(ValueTracker dataSchema, ValueTracker< { if (dataSchema.Value.Title != null && !TitleRegex.IsMatch(dataSchema.Value.Title.Value.Value)) { - errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a 'service-desc' linked schema naming file", dataSchema.Value.Title.TokenIndex); + errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a '{TDValues.RelationSchemaNaming}' linked schema naming file", dataSchema.Value.Title.TokenIndex); } bool hasError = false; @@ -1542,7 +1561,7 @@ private bool TryValidateNumberConst(ValueTracker dataSchema, ValueTracker< if (dataSchema.Value.Title != null && !TitleRegex.IsMatch(dataSchema.Value.Title.Value.Value)) { - errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a 'service-desc' linked schema naming file", dataSchema.Value.Title.TokenIndex); + errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a '{TDValues.RelationSchemaNaming}' linked schema naming file", dataSchema.Value.Title.TokenIndex); } if (constValue.Value.Value is double numValue) @@ -1588,7 +1607,7 @@ private bool TryValidateIntegerConst(ValueTracker dataSchema, ValueTracker if (dataSchema.Value.Title != null && !TitleRegex.IsMatch(dataSchema.Value.Title.Value.Value)) { - errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a 'service-desc' linked schema naming file", dataSchema.Value.Title.TokenIndex); + errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a '{TDValues.RelationSchemaNaming}' linked schema naming file", dataSchema.Value.Title.TokenIndex); } if (constValue.Value.Value is double numValue && double.IsInteger(numValue)) @@ -1634,7 +1653,7 @@ private bool TryValidateBooleanConst(ValueTracker dataSchema, ValueTracker if (dataSchema.Value.Title != null && !TitleRegex.IsMatch(dataSchema.Value.Title.Value.Value)) { - errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a 'service-desc' linked schema naming file", dataSchema.Value.Title.TokenIndex); + errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a '{TDValues.RelationSchemaNaming}' linked schema naming file", dataSchema.Value.Title.TokenIndex); } if (constValue.Value.Value is not bool) @@ -1778,7 +1797,7 @@ private bool TryValidateObjectDataSchema(ValueTracker dataSchema, DataSche if (dataSchema.Value.Title != null && !TitleRegex.IsMatch(dataSchema.Value.Title.Value.Value)) { - errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a 'service-desc' linked schema naming file", dataSchema.Value.Title.TokenIndex); + errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a '{TDValues.RelationSchemaNaming}' linked schema naming file", dataSchema.Value.Title.TokenIndex); } HashSet supportedProperties = new() @@ -1852,7 +1871,7 @@ private bool TryValidateObjectDataSchema(ValueTracker dataSchema, DataSche if (dataSchema.Value.Title != null && !TitleRegex.IsMatch(dataSchema.Value.Title.Value.Value)) { - errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a 'service-desc' linked schema naming file", dataSchema.Value.Title.TokenIndex); + errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a '{TDValues.RelationSchemaNaming}' linked schema naming file", dataSchema.Value.Title.TokenIndex); } } else @@ -1918,7 +1937,7 @@ private bool TryValidateStringDataSchema(ValueTracker dataSchema, DataSche { if (dataSchema.Value.Title != null && !TitleRegex.IsMatch(dataSchema.Value.Title.Value.Value)) { - errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a 'service-desc' linked schema naming file", dataSchema.Value.Title.TokenIndex); + errorReporter.ReportWarning($"Data schema '{TDDataSchema.TitleName}' property value \"{dataSchema.Value.Title.Value.Value}\" does not conform to codegen type naming rules (only alphanumerics, starting with uppercase), which will be problematic unless titles are suppressed via a '{TDValues.RelationSchemaNaming}' linked schema naming file", dataSchema.Value.Title.TokenIndex); } foreach (ValueTracker enumValue in dataSchema.Value.Enum.Elements) diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDThing.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDThing.cs index a080b3cbe3..df9753d25c 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDThing.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDThing.cs @@ -9,9 +9,11 @@ public class TDThing : IEquatable, IDeserializable public const string ContextName = "@context"; public const string TypeName = "@type"; public const string TitleName = "title"; + public const string DescriptionName = "description"; public const string LinksName = "links"; public const string SchemaDefinitionsName = "schemaDefinitions"; public const string FormsName = "forms"; + public const string OptionalName = "tm:optional"; public const string ActionsName = "actions"; public const string PropertiesName = "properties"; public const string EventsName = "events"; @@ -22,12 +24,16 @@ public class TDThing : IEquatable, IDeserializable public ValueTracker? Title { get; set; } + public ValueTracker? Description { get; set; } + public ArrayTracker? Links { get; set; } public MapTracker? SchemaDefinitions { get; set; } public ArrayTracker? Forms { get; set; } + public ArrayTracker? Optional { get; set; } + public MapTracker? Actions { get; set; } public MapTracker? Properties { get; set; } @@ -47,9 +53,11 @@ public virtual bool Equals(TDThing? other) return Context == other.Context && Type == other.Type && Title == other.Title && + Description == other.Description && Links == other.Links && SchemaDefinitions == other.SchemaDefinitions && Forms == other.Forms && + Optional == other.Optional && Actions == other.Actions && Properties == other.Properties && Events == other.Events; @@ -58,7 +66,7 @@ public virtual bool Equals(TDThing? other) public override int GetHashCode() { - return (Context, Type, Title, Links, SchemaDefinitions, Forms, Actions, Properties, Events).GetHashCode(); + return (Context, Type, Title, Description, Links, SchemaDefinitions, Forms, Optional, Actions, Properties, Events).GetHashCode(); } public static bool operator ==(TDThing? left, TDThing? right) @@ -121,6 +129,13 @@ public IEnumerable Traverse() yield return item; } } + if (Description != null) + { + foreach (ITraversable item in Description.Traverse()) + { + yield return item; + } + } if (Links != null) { foreach (ITraversable item in Links.Traverse()) @@ -142,6 +157,13 @@ public IEnumerable Traverse() yield return item; } } + if (Optional != null) + { + foreach (ITraversable item in Optional.Traverse()) + { + yield return item; + } + } if (Actions != null) { foreach (ITraversable item in Actions.Traverse()) @@ -193,6 +215,9 @@ public static TDThing Deserialize(ref Utf8JsonReader reader) case TitleName: thing.Title = ValueTracker.Deserialize(ref reader, TitleName); break; + case DescriptionName: + thing.Description = ValueTracker.Deserialize(ref reader, DescriptionName); + break; case LinksName: thing.Links = ArrayTracker.Deserialize(ref reader, LinksName); break; @@ -202,6 +227,9 @@ public static TDThing Deserialize(ref Utf8JsonReader reader) case FormsName: thing.Forms = ArrayTracker.Deserialize(ref reader, FormsName); break; + case OptionalName: + thing.Optional = ArrayTracker.Deserialize(ref reader, OptionalName); + break; case ActionsName: thing.Actions = MapTracker.Deserialize(ref reader, ActionsName); break; diff --git a/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt b/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt index f3d55abcaf..58df22b4f6 100644 --- a/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt +++ b/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt @@ -12,7 +12,7 @@ "title": "<#=this.serviceName.AsGiven#>", "links": [ { - "rel": "service-desc", + "rel": "dtv:naming", "href": "<#=this.schemaNamesPath#>", "type": "application/json" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ThingUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ThingUnsupportedProperty.json new file mode 100644 index 0000000000..b0e824555f --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ThingUnsupportedProperty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ThingUnsupportedProperty.TD.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "ThingUnsupportedProperty.TD.json", + "line": 8, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyHref.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyHref.TD.json index 016524fbd7..5faa1659f4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyHref.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyHref.TD.json @@ -7,7 +7,7 @@ "title": "Noop", "links": [ { - "rel": "service-desc", + "rel": "dtv:naming", "href": "", "type": "application/json" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyType.TD.json index 82dd7cb5ca..0e436accc8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyType.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyType.TD.json @@ -7,7 +7,7 @@ "title": "Noop", "links": [ { - "rel": "service-desc", + "rel": "dtv:naming", "href": "../../name-rules/DefaultSchemaNames.json", "type": "" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoHref.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoHref.TD.json index ae3ba8a279..07b7619c30 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoHref.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoHref.TD.json @@ -7,7 +7,7 @@ "title": "Noop", "links": [ { - "rel": "service-desc", + "rel": "dtv:naming", "type": "application/json" } ], diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoType.TD.json index b72e7b2774..a493f8f15f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoType.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoType.TD.json @@ -7,7 +7,7 @@ "title": "Noop", "links": [ { - "rel": "service-desc", + "rel": "dtv:naming", "href": "../../name-rules/DefaultSchemaNames.json" } ], diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonJsonFile.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonJsonFile.TD.json index 6fd1f48c01..1b95194f72 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonJsonFile.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonJsonFile.TD.json @@ -7,7 +7,7 @@ "title": "Noop", "links": [ { - "rel": "service-desc", + "rel": "dtv:naming", "href": "../../TestCase.cs", "type": "application/json" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonexistentFile.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonexistentFile.TD.json index 4e62987f1b..9e591bbb11 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonexistentFile.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonexistentFile.TD.json @@ -7,7 +7,7 @@ "title": "Noop", "links": [ { - "rel": "service-desc", + "rel": "dtv:naming", "href": "../../Nonexistent.json", "type": "application/json" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkTypeNotJson.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkTypeNotJson.TD.json index 67d323f622..cb0e13f852 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkTypeNotJson.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkTypeNotJson.TD.json @@ -7,7 +7,7 @@ "title": "Noop", "links": [ { - "rel": "service-desc", + "rel": "dtv:naming", "href": "../../name-rules/DefaultSchemaNames.json", "type": "application/text" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkUnsupportedProperty.TD.json index 75b79ac2cd..5b778f297c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkUnsupportedProperty.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkUnsupportedProperty.TD.json @@ -7,7 +7,7 @@ "title": "Noop", "links": [ { - "rel": "service-desc", + "rel": "dtv:naming", "href": "../../name-rules/DefaultSchemaNames.json", "type": "application/json", "foo": "bar" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/MultipleLinks.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/MultipleLinks.TD.json index e78bc88218..9bbba93738 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/MultipleLinks.TD.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/MultipleLinks.TD.json @@ -7,12 +7,12 @@ "title": "Noop", "links": [ { - "rel": "service-desc", + "rel": "dtv:naming", "href": "../../name-rules/DefaultSchemaNames.json", "type": "application/json" }, { - "rel": "service-desc", + "rel": "dtv:naming", "href": "../../name-rules/DefaultSchemaNames.json", "type": "application/json" } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ThingUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ThingUnsupportedProperty.TD.json new file mode 100644 index 0000000000..684ed9984a --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ThingUnsupportedProperty.TD.json @@ -0,0 +1,24 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "foobar": "hello", + "actions": { + "noop": { + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} From 5fb11a679f269f3c2b805abadb8fa68f1aaec81d Mon Sep 17 00:00:00 2001 From: "John (JD) Douceur" Date: Wed, 7 Jan 2026 15:10:34 -0800 Subject: [PATCH 36/52] change file suffix from .TD.json to .TM.json --- codegen2/eval/aio/gen.sh | 16 ++++++++-------- codegen2/eval/wot/.vscode/settings.json | 2 +- .../src/Dtdl2Wot/Command/t4/CommandAffordance.tt | 1 - .../Dtdl2Wot/Interface/code/InterfaceThing.cs | 2 +- .../src/Dtdl2Wot/Interface/t4/InterfaceThing.tt | 3 --- .../Dtdl2Wot/Property/t4/PropertyAffordance.tt | 2 -- .../Dtdl2Wot/Telemetry/t4/TelemetryAffordance.tt | 1 - .../test-cases/SampleTest.json | 4 ++-- ...onFormAdditionalResponseContentTypeEmpty.json | 4 ++-- ...ionFormAdditionalResponseContentTypeText.json | 4 ++-- ...tionalResponseNoMatchingSchemaDefinition.json | 4 ++-- .../ActionFormAdditionalResponseNoSchema.json | 4 ++-- ...ormAdditionalResponseNoSchemaDefinitions.json | 4 ++-- .../ActionFormAdditionalResponseNoSuccess.json | 4 ++-- ...ormAdditionalResponseSchemaDefinitionMap.json | 4 ++-- ...itionalResponseSchemaDefinitionNotObject.json | 4 ++-- .../ActionFormAdditionalResponseSchemaEmpty.json | 4 ++-- .../ActionFormAdditionalResponseSuccessTrue.json | 4 ++-- ...ormAdditionalResponseUnsupportedProperty.json | 4 ++-- .../ActionFormAdditionalResponsesMultiple.json | 4 ++-- .../failure/ActionFormContentTypeText.json | 4 ++-- .../failure/ActionFormHeaderCodeEmpty.json | 4 ++-- ...FormHeaderCodeNoMatchingSchemaDefinition.json | 4 ++-- .../ActionFormHeaderCodeNoSchemaDefinitions.json | 4 ++-- ...ionFormHeaderCodeSchemaDefinitionNotEnum.json | 4 ++-- .../ActionFormHeaderInfoContentTypeEmpty.json | 4 ++-- .../ActionFormHeaderInfoContentTypeNotJson.json | 4 ++-- .../ActionFormHeaderInfoNoContentType.json | 4 ++-- ...FormHeaderInfoNoMatchingSchemaDefinition.json | 4 ++-- .../failure/ActionFormHeaderInfoNoSchema.json | 4 ++-- .../ActionFormHeaderInfoNoSchemaDefinitions.json | 4 ++-- .../ActionFormHeaderInfoSchemaDefinitionMap.json | 4 ++-- ...nFormHeaderInfoSchemaDefinitionNotObject.json | 4 ++-- .../failure/ActionFormHeaderInfoSchemaEmpty.json | 4 ++-- .../failure/ActionFormHeaderInfoSuccessTrue.json | 4 ++-- .../ActionFormHeaderInfoUnsupportedProperty.json | 4 ++-- .../failure/ActionFormHeaderInfosMultiple.json | 4 ++-- .../failure/ActionFormOpInvokeDuplicate.json | 4 ++-- .../test-cases/failure/ActionFormOpRead.json | 4 ++-- .../test-cases/failure/ActionFormOpSub.json | 4 ++-- .../test-cases/failure/ActionFormOpWrite.json | 4 ++-- .../failure/ActionFormServiceGroupEmpty.json | 4 ++-- .../failure/ActionFormTopicNoContentType.json | 4 ++-- .../failure/ActionFormTopicTokenAction.json | 4 ++-- .../failure/ActionFormTopicTokenConsumerId.json | 4 ++-- .../ActionFormTopicTokenMaintainerId.json | 4 ++-- .../failure/ActionFormTopicTokenSenderId.json | 4 ++-- .../failure/ActionFormUnsupportedProperty.json | 4 ++-- .../test-cases/failure/ActionFormsEmpty.json | 4 ++-- .../failure/ActionFormsMultipleContentTypes.json | 4 ++-- .../failure/ActionFormsOpInvokeDuplicate.json | 4 ++-- .../failure/ActionFormsOplessAndInvoke.json | 4 ++-- .../failure/ActionFormsOplessDuplicate.json | 4 ++-- .../test-cases/failure/ActionInputMap.json | 4 ++-- .../ActionInputNullAndContentTypeJson.json | 4 ++-- .../test-cases/failure/ActionInputNumber.json | 4 ++-- .../ActionInputObjectAndContentTypeCustom.json | 4 ++-- .../ActionInputObjectAndContentTypeRaw.json | 4 ++-- .../failure/ActionInputObjectConst.json | 4 ++-- .../failure/ActionInputObjectErrorMessage.json | 4 ++-- .../test-cases/failure/ActionInputString.json | 4 ++-- .../test-cases/failure/ActionNoForms.json | 4 ++-- .../failure/ActionNoFormsWithTopic.json | 4 ++-- .../test-cases/failure/ActionOutputMap.json | 4 ++-- .../ActionOutputNullAndContentTypeJson.json | 4 ++-- .../test-cases/failure/ActionOutputNumber.json | 4 ++-- .../ActionOutputObjectAndContentTypeCustom.json | 4 ++-- .../ActionOutputObjectAndContentTypeRaw.json | 4 ++-- .../failure/ActionOutputObjectConst.json | 4 ++-- .../failure/ActionOutputObjectErrorMessage.json | 4 ++-- .../test-cases/failure/ActionOutputString.json | 4 ++-- .../failure/ActionUnsupportedProperty.json | 4 ++-- .../test-cases/failure/ArrayKey.json | 4 ++-- .../test-cases/failure/BooleanKey.json | 4 ++-- .../failure/ContextDtvWrongPrefix.json | 4 ++-- .../test-cases/failure/ContextDtvWrongUri.json | 6 +++--- .../test-cases/failure/ContextMissingDtv.json | 4 ++-- .../test-cases/failure/ContextMissingWot.json | 4 ++-- .../test-cases/failure/ContextWrongType.json | 4 ++-- .../test-cases/failure/DuplicateKey.json | 4 ++-- .../test-cases/failure/EventBooleanConst.json | 4 ++-- .../failure/EventFormAdditionalResponses.json | 4 ++-- .../failure/EventFormContentTypeText.json | 4 ++-- .../test-cases/failure/EventFormHeaderCode.json | 4 ++-- .../test-cases/failure/EventFormHeaderInfo.json | 4 ++-- .../test-cases/failure/EventFormOpInvoke.json | 4 ++-- .../test-cases/failure/EventFormOpRead.json | 4 ++-- .../test-cases/failure/EventFormOpSubAll.json | 4 ++-- .../failure/EventFormOpSubDuplicate.json | 4 ++-- .../test-cases/failure/EventFormOpWrite.json | 4 ++-- .../failure/EventFormServiceGroupEmpty.json | 4 ++-- .../failure/EventFormTopicNoContentType.json | 4 ++-- .../failure/EventFormTopicTokenAction.json | 4 ++-- .../failure/EventFormTopicTokenConsumerId.json | 4 ++-- .../failure/EventFormTopicTokenExecutorId.json | 4 ++-- .../failure/EventFormTopicTokenInvokerId.json | 4 ++-- .../failure/EventFormTopicTokenMaintainerId.json | 4 ++-- .../failure/EventFormUnsupportedProperty.json | 4 ++-- .../test-cases/failure/EventFormsEmpty.json | 4 ++-- .../failure/EventFormsOpSubDuplicate.json | 4 ++-- .../failure/EventFormsOplessAndSub.json | 4 ++-- .../failure/EventFormsOplessDuplicate.json | 4 ++-- .../test-cases/failure/EventIntegerConst.json | 4 ++-- .../test-cases/failure/EventNoForms.json | 4 ++-- ...EventNoFormsWithTopicAndNoRootFormSubAll.json | 4 ++-- .../failure/EventNullAndContentTypeJson.json | 4 ++-- .../test-cases/failure/EventNumberConst.json | 4 ++-- .../failure/EventObjectAndContentTypeCustom.json | 4 ++-- .../failure/EventObjectAndContentTypeRaw.json | 4 ++-- .../test-cases/failure/EventObjectConst.json | 4 ++-- .../failure/EventObjectErrorMessage.json | 4 ++-- .../test-cases/failure/EventStringConst.json | 4 ++-- .../failure/EventUnsupportedProperty.json | 4 ++-- .../test-cases/failure/LinkEmptyHref.json | 4 ++-- .../test-cases/failure/LinkEmptyType.json | 4 ++-- .../test-cases/failure/LinkNoHref.json | 4 ++-- .../test-cases/failure/LinkNoType.json | 4 ++-- .../test-cases/failure/LinkNonJsonFile.json | 4 ++-- .../test-cases/failure/LinkNonexistentFile.json | 4 ++-- .../test-cases/failure/LinkTypeNotJson.json | 4 ++-- .../failure/LinkUnsupportedProperty.json | 4 ++-- .../test-cases/failure/MissingColon.json | 4 ++-- .../test-cases/failure/MissingComma.json | 4 ++-- .../test-cases/failure/MissingElement.json | 4 ++-- .../test-cases/failure/MissingKey.json | 4 ++-- .../test-cases/failure/MissingValue.json | 4 ++-- .../test-cases/failure/MultipleLinks.json | 4 ++-- .../test-cases/failure/NoClientOrServer.json | 2 +- .../test-cases/failure/NoContext.json | 4 ++-- .../test-cases/failure/NoTitle.json | 4 ++-- .../test-cases/failure/NoType.json | 4 ++-- .../test-cases/failure/NonexistentThing.json | 2 +- .../test-cases/failure/NumericKey.json | 4 ++-- .../test-cases/failure/ObjectKey.json | 4 ++-- .../test-cases/failure/PropertyBooleanConst.json | 4 ++-- ...tyFormAdditionalResponseContentTypeEmpty.json | 4 ++-- ...rtyFormAdditionalResponseContentTypeText.json | 4 ++-- ...tionalResponseNoMatchingSchemaDefinition.json | 4 ++-- .../PropertyFormAdditionalResponseNoSchema.json | 4 ++-- ...ormAdditionalResponseNoSchemaDefinitions.json | 4 ++-- .../PropertyFormAdditionalResponseNoSuccess.json | 4 ++-- ...ormAdditionalResponseSchemaDefinitionMap.json | 4 ++-- ...itionalResponseSchemaDefinitionNotObject.json | 4 ++-- ...ropertyFormAdditionalResponseSchemaEmpty.json | 4 ++-- ...ropertyFormAdditionalResponseSuccessTrue.json | 4 ++-- ...ormAdditionalResponseUnsupportedProperty.json | 4 ++-- .../PropertyFormAdditionalResponsesMultiple.json | 4 ++-- .../failure/PropertyFormContentTypeText.json | 4 ++-- .../failure/PropertyFormHeaderCode.json | 4 ++-- .../failure/PropertyFormHeaderInfo.json | 4 ++-- .../test-cases/failure/PropertyFormOpInvoke.json | 4 ++-- .../failure/PropertyFormOpReadAll.json | 4 ++-- .../failure/PropertyFormOpReadDuplicate.json | 4 ++-- .../test-cases/failure/PropertyFormOpSub.json | 4 ++-- .../failure/PropertyFormOpWriteDuplicate.json | 4 ++-- .../failure/PropertyFormOpWriteMulti.json | 4 ++-- ...ootFormReadAllWithoutAdditionalResponses.json | 4 ++-- ...rmOplessWithoutTopicAndNoRootFormReadAll.json | 4 ++-- ...ootFormReadAllWithoutAdditionalResponses.json | 4 ++-- ...FormReadWithoutTopicAndNoRootFormReadAll.json | 4 ++-- ...outTopicWriteWithTopicAndRootFormReadAll.json | 4 ++-- .../failure/PropertyFormServiceGroup.json | 4 ++-- .../failure/PropertyFormTopicNoContentType.json | 4 ++-- .../PropertyFormTopicTokenExecutorId.json | 4 ++-- .../failure/PropertyFormTopicTokenInvokerId.json | 4 ++-- ...mTopicTokenNoActionWhenNoOpAndNoReadOnly.json | 4 ++-- ...picTokenNoActionWhenNoOpAndReadOnlyFalse.json | 4 ++-- ...tyFormTopicTokenNoActionWhenReadAndWrite.json | 4 ++-- .../failure/PropertyFormTopicTokenSenderId.json | 4 ++-- .../failure/PropertyFormUnsupportedProperty.json | 4 ++-- ...FormWriteMultiWithoutAdditionalResponses.json | 4 ++-- ...WriteWithoutTopicAndNoRootFormWriteMulti.json | 4 ++-- .../test-cases/failure/PropertyFormsEmpty.json | 4 ++-- .../failure/PropertyFormsOpReadDuplicate.json | 4 ++-- .../failure/PropertyFormsOpWriteDuplicate.json | 4 ++-- .../failure/PropertyFormsOpWriteNoRead.json | 4 ++-- .../failure/PropertyFormsOplessAndRead.json | 4 ++-- .../failure/PropertyFormsOplessDuplicate.json | 4 ++-- .../test-cases/failure/PropertyIntegerConst.json | 4 ++-- .../test-cases/failure/PropertyNoForms.json | 4 ++-- .../test-cases/failure/PropertyNumberConst.json | 4 ++-- .../test-cases/failure/PropertyObjectConst.json | 4 ++-- .../failure/PropertyObjectErrorMessage.json | 4 ++-- .../test-cases/failure/PropertyStringConst.json | 4 ++-- .../test-cases/failure/PropertyTypeNull.json | 4 ++-- .../failure/PropertyUnsupportedProperty.json | 4 ++-- ...otFormAdditionalResponseContentTypeEmpty.json | 4 ++-- ...ootFormAdditionalResponseContentTypeText.json | 4 ++-- .../RootFormAdditionalResponseNoSuccess.json | 4 ++-- .../RootFormAdditionalResponseSchema.json | 4 ++-- .../RootFormAdditionalResponseSuccessTrue.json | 4 ++-- ...ormAdditionalResponseUnsupportedProperty.json | 4 ++-- .../RootFormAdditionalResponsesAndSubAll.json | 4 ++-- .../RootFormAdditionalResponsesMultiple.json | 4 ++-- .../failure/RootFormContentTypeCustom.json | 4 ++-- .../failure/RootFormContentTypeRaw.json | 4 ++-- .../failure/RootFormContentTypeText.json | 4 ++-- .../test-cases/failure/RootFormHeaderCode.json | 4 ++-- .../test-cases/failure/RootFormHeaderInfo.json | 4 ++-- .../failure/RootFormNoContentType.json | 4 ++-- .../test-cases/failure/RootFormNoOp.json | 4 ++-- .../test-cases/failure/RootFormNoTopic.json | 4 ++-- .../test-cases/failure/RootFormOpArrayEmpty.json | 4 ++-- .../failure/RootFormOpElementEmpty.json | 4 ++-- .../test-cases/failure/RootFormOpEmpty.json | 4 ++-- .../failure/RootFormOpReadAllAndSubAll.json | 4 ++-- .../failure/RootFormOpReadAllDuplicate.json | 4 ++-- .../test-cases/failure/RootFormOpReadOne.json | 4 ++-- .../failure/RootFormOpSubAllDuplicate.json | 4 ++-- .../test-cases/failure/RootFormOpSubOne.json | 4 ++-- .../failure/RootFormOpWiteMultiAndSubAll.json | 4 ++-- .../failure/RootFormOpWriteMultiDuplicate.json | 4 ++-- .../test-cases/failure/RootFormOpWriteOne.json | 4 ++-- .../failure/RootFormReadAllButNoProperties.json | 4 ++-- .../failure/RootFormServiceGroupEmpty.json | 4 ++-- .../failure/RootFormServiceGroupNoSubAll.json | 4 ++-- .../failure/RootFormSubAllButNoEvents.json | 4 ++-- .../test-cases/failure/RootFormTopicEmpty.json | 4 ++-- .../failure/RootFormTopicLevelEmpty.json | 4 ++-- .../failure/RootFormTopicLevelInvalid.json | 4 ++-- .../failure/RootFormTopicReservedStart.json | 4 ++-- .../RootFormTopicTokenActionWhenSubAll.json | 4 ++-- .../RootFormTopicTokenConsumerIdWhenSubAll.json | 4 ++-- .../failure/RootFormTopicTokenCustomEmpty.json | 4 ++-- .../failure/RootFormTopicTokenCustomInvalid.json | 4 ++-- .../failure/RootFormTopicTokenEmpty.json | 4 ++-- .../failure/RootFormTopicTokenExecutorId.json | 4 ++-- .../failure/RootFormTopicTokenInvokerId.json | 4 ++-- ...RootFormTopicTokenMaintainerIdWhenSubAll.json | 4 ++-- ...picTokenNoActionWhenReadAllAndWriteMulti.json | 4 ++-- .../RootFormTopicTokenSenderIdWhenReadAll.json | 4 ++-- ...RootFormTopicTokenSenderIdWhenWriteMulti.json | 4 ++-- .../failure/RootFormTopicTokenUnrecognized.json | 4 ++-- ...ootFormWriteMultiButNoWritableProperties.json | 4 ++-- .../test-cases/failure/RootFormsEmpty.json | 4 ++-- .../failure/RootFormsOpReadAllDuplicate.json | 4 ++-- .../failure/RootFormsOpSubAllDuplicate.json | 4 ++-- .../failure/RootFormsOpWriteMultiDuplicate.json | 4 ++-- .../failure/RootFormsOpWriteMultiNoReadAll.json | 4 ++-- .../failure/SchemaDefinitionArrayConst.json | 4 ++-- .../SchemaDefinitionArrayItemsNoType.json | 4 ++-- .../SchemaDefinitionArrayItemsNotObject.json | 4 ++-- .../SchemaDefinitionArrayItemsObjectConst.json | 4 ++-- .../failure/SchemaDefinitionArrayItemsRef.json | 4 ++-- .../SchemaDefinitionArrayItemsStringConst.json | 4 ++-- .../SchemaDefinitionArrayItemsTypeNotString.json | 4 ++-- .../SchemaDefinitionArrayItemsTypeNull.json | 4 ++-- ...chemaDefinitionArrayItemsTypeUnsupported.json | 4 ++-- .../failure/SchemaDefinitionArrayNoItems.json | 4 ++-- ...emaDefinitionBooleanConstValueNotBoolean.json | 4 ++-- .../failure/SchemaDefinitionBooleanReadOnly.json | 4 ++-- ...hemaDefinitionBooleanUnsupportedProperty.json | 4 ++-- ...chemaDefinitionIntegerConstValueAboveMax.json | 4 ++-- ...chemaDefinitionIntegerConstValueBelowMin.json | 4 ++-- ...emaDefinitionIntegerConstValueNotInteger.json | 4 ++-- ...emaDefinitionIntegerConstValueNotNumeric.json | 4 ++-- .../SchemaDefinitionIntegerMaxNotInteger.json | 4 ++-- .../SchemaDefinitionIntegerMaxNotNumeric.json | 4 ++-- .../SchemaDefinitionIntegerMinAboveMax.json | 4 ++-- .../SchemaDefinitionIntegerMinNotInteger.json | 4 ++-- .../SchemaDefinitionIntegerMinNotNumeric.json | 4 ++-- .../failure/SchemaDefinitionIntegerReadOnly.json | 4 ++-- ...hemaDefinitionIntegerUnsupportedProperty.json | 4 ++-- ...aDefinitionMapAdditionalPropertiesNoType.json | 4 ++-- ...finitionMapAdditionalPropertiesNotObject.json | 4 ++-- ...nitionMapAdditionalPropertiesObjectConst.json | 4 ++-- ...hemaDefinitionMapAdditionalPropertiesRef.json | 4 ++-- ...nitionMapAdditionalPropertiesStringConst.json | 4 ++-- ...tionMapAdditionalPropertiesTypeNotString.json | 4 ++-- ...efinitionMapAdditionalPropertiesTypeNull.json | 4 ++-- ...onMapAdditionalPropertiesTypeUnsupported.json | 4 ++-- .../failure/SchemaDefinitionMapConst.json | 4 ++-- .../failure/SchemaDefinitionNoType.json | 4 ++-- ...SchemaDefinitionNumberConstValueAboveMax.json | 4 ++-- ...SchemaDefinitionNumberConstValueBelowMin.json | 4 ++-- ...hemaDefinitionNumberConstValueNotNumeric.json | 4 ++-- .../SchemaDefinitionNumberMaxNotNumeric.json | 4 ++-- .../SchemaDefinitionNumberMinAboveMax.json | 4 ++-- .../SchemaDefinitionNumberMinNotNumeric.json | 4 ++-- .../failure/SchemaDefinitionNumberReadOnly.json | 4 ++-- ...chemaDefinitionNumberUnsupportedProperty.json | 4 ++-- .../SchemaDefinitionObjectBothDeterminants.json | 4 ++-- .../SchemaDefinitionObjectConstNotObject.json | 4 ++-- ...efinitionObjectConstPropertyBooleanConst.json | 4 ++-- ...tionObjectConstPropertyBooleanNotBoolean.json | 4 ++-- ...tConstPropertyBooleanUnsupportedProperty.json | 4 ++-- ...nitionObjectConstPropertyIntegerAboveMax.json | 4 ++-- ...nitionObjectConstPropertyIntegerBelowMin.json | 4 ++-- ...efinitionObjectConstPropertyIntegerConst.json | 4 ++-- ...tionObjectConstPropertyIntegerNotInteger.json | 4 ++-- ...tionObjectConstPropertyIntegerNotNumeric.json | 4 ++-- ...tConstPropertyIntegerUnsupportedProperty.json | 4 ++-- ...chemaDefinitionObjectConstPropertyNoType.json | 4 ++-- ...hemaDefinitionObjectConstPropertyNoValue.json | 4 ++-- ...initionObjectConstPropertyNumberAboveMax.json | 4 ++-- ...initionObjectConstPropertyNumberBelowMin.json | 4 ++-- ...DefinitionObjectConstPropertyNumberConst.json | 4 ++-- ...itionObjectConstPropertyNumberNotNumeric.json | 4 ++-- ...ctConstPropertyNumberUnsupportedProperty.json | 4 ++-- ...DefinitionObjectConstPropertyStringConst.json | 4 ++-- ...ctConstPropertyStringUnsupportedProperty.json | 4 ++-- ...nObjectConstPropertyStringValueNotString.json | 4 ++-- ...maDefinitionObjectConstPropertyTypeArray.json | 4 ++-- ...emaDefinitionObjectConstPropertyTypeNull.json | 4 ++-- ...aDefinitionObjectConstPropertyTypeObject.json | 4 ++-- ...nitionObjectConstPropertyTypeUnsupported.json | 4 ++-- ...DefinitionObjectConstUnsupportedProperty.json | 4 ++-- ...SchemaDefinitionObjectConstValueNoSchema.json | 4 ++-- ...maDefinitionObjectErrorMessageNoProperty.json | 4 ++-- ...emaDefinitionObjectErrorMessageNotString.json | 4 ++-- ...itionObjectErrorMessagePropertyNotString.json | 4 ++-- .../SchemaDefinitionObjectNoDeterminant.json | 4 ++-- ...chemaDefinitionObjectPropertiesNotObject.json | 4 ++-- .../SchemaDefinitionObjectPropertyNoType.json | 4 ++-- ...chemaDefinitionObjectPropertyObjectConst.json | 4 ++-- .../SchemaDefinitionObjectPropertyRef.json | 4 ++-- ...chemaDefinitionObjectPropertyStringConst.json | 4 ++-- ...emaDefinitionObjectPropertyTypeNotString.json | 4 ++-- .../SchemaDefinitionObjectPropertyTypeNull.json | 4 ++-- ...aDefinitionObjectPropertyTypeUnsupported.json | 4 ++-- ...SchemaDefinitionObjectRequiredNoProperty.json | 4 ++-- .../SchemaDefinitionObjectRequiredNotString.json | 4 ++-- .../test-cases/failure/SchemaDefinitionRef.json | 4 ++-- ...hemaDefinitionStringConstContentEncoding.json | 4 ++-- .../SchemaDefinitionStringConstFormat.json | 4 ++-- .../SchemaDefinitionStringConstPattern.json | 4 ++-- ...DefinitionStringConstUnsupportedProperty.json | 4 ++-- ...chemaDefinitionStringConstValueNotString.json | 4 ++-- ...DefinitionStringContentEncodingNotString.json | 4 ++-- ...ionStringContentEncodingUnsupportedValue.json | 4 ++-- .../failure/SchemaDefinitionStringEnumConst.json | 4 ++-- ...chemaDefinitionStringEnumContentEncoding.json | 4 ++-- ...SchemaDefinitionStringEnumElementInvalid.json | 4 ++-- .../SchemaDefinitionStringEnumFormat.json | 4 ++-- .../SchemaDefinitionStringEnumPattern.json | 4 ++-- .../SchemaDefinitionStringEnumReadOnly.json | 4 ++-- ...aDefinitionStringEnumUnsupportedProperty.json | 4 ++-- ...DefinitionStringFormatAndContentEncoding.json | 4 ++-- .../SchemaDefinitionStringFormatAndPattern.json | 4 ++-- .../SchemaDefinitionStringFormatNotString.json | 4 ++-- ...maDefinitionStringFormatUnsupportedValue.json | 4 ++-- ...efinitionStringPatternAndContentEncoding.json | 4 ++-- ...initionStringPatternNotDurationOrDecimal.json | 4 ++-- .../SchemaDefinitionStringPatternNotString.json | 4 ++-- ...chemaDefinitionStringPatternRegexInvalid.json | 4 ++-- .../failure/SchemaDefinitionStringReadOnly.json | 4 ++-- ...chemaDefinitionStringUnsupportedProperty.json | 4 ++-- .../failure/SchemaDefinitionTypeNotString.json | 4 ++-- .../failure/SchemaDefinitionTypeNull.json | 4 ++-- .../failure/SchemaDefinitionTypeUnsupported.json | 4 ++-- .../failure/ThingUnsupportedProperty.json | 4 ++-- .../test-cases/failure/TitleEmpty.json | 4 ++-- .../test-cases/failure/TitleInvalid.json | 4 ++-- .../test-cases/failure/TitleNotString.json | 4 ++-- .../test-cases/failure/TrailingComma.json | 6 +++--- .../test-cases/failure/TypeEmpty.json | 4 ++-- .../test-cases/failure/TypeNotThingModel.json | 4 ++-- .../test-cases/failure/UnclosedArray.json | 4 ++-- .../test-cases/failure/UnclosedObject.json | 4 ++-- .../test-cases/failure/UnsupportedLanguage.json | 2 +- .../test-cases/success/LinkNoRel.json | 2 +- .../test-cases/success/LinkOtherRel.json | 2 +- ...ButNoReadablePropertyAdditionalResponses.json | 4 ++-- ...ButNoWritablePropertyAdditionalResponses.json | 4 ++-- .../thing-descriptions/.vscode/settings.json | 4 ++-- ...rmAdditionalResponseContentTypeEmpty.TM.json} | 0 ...ormAdditionalResponseContentTypeText.TM.json} | 0 ...alResponseNoMatchingSchemaDefinition.TM.json} | 0 ...ActionFormAdditionalResponseNoSchema.TM.json} | 0 ...dditionalResponseNoSchemaDefinitions.TM.json} | 0 ...ctionFormAdditionalResponseNoSuccess.TM.json} | 0 ...dditionalResponseSchemaDefinitionMap.TM.json} | 0 ...nalResponseSchemaDefinitionNotObject.TM.json} | 0 ...ionFormAdditionalResponseSchemaEmpty.TM.json} | 0 ...ionFormAdditionalResponseSuccessTrue.TM.json} | 0 ...dditionalResponseUnsupportedProperty.TM.json} | 0 ...ctionFormAdditionalResponsesMultiple.TM.json} | 0 ...TD.json => ActionFormContentTypeText.TM.json} | 0 ...TD.json => ActionFormHeaderCodeEmpty.TM.json} | 0 ...HeaderCodeNoMatchingSchemaDefinition.TM.json} | 0 ...ionFormHeaderCodeNoSchemaDefinitions.TM.json} | 0 ...ormHeaderCodeSchemaDefinitionNotEnum.TM.json} | 0 ...ActionFormHeaderInfoContentTypeEmpty.TM.json} | 0 ...tionFormHeaderInfoContentTypeNotJson.TM.json} | 0 ...=> ActionFormHeaderInfoNoContentType.TM.json} | 0 ...HeaderInfoNoMatchingSchemaDefinition.TM.json} | 0 ...json => ActionFormHeaderInfoNoSchema.TM.json} | 0 ...ionFormHeaderInfoNoSchemaDefinitions.TM.json} | 0 ...ionFormHeaderInfoSchemaDefinitionMap.TM.json} | 0 ...mHeaderInfoSchemaDefinitionNotObject.TM.json} | 0 ...n => ActionFormHeaderInfoSchemaEmpty.TM.json} | 0 ...n => ActionFormHeaderInfoSuccessTrue.TM.json} | 0 ...ionFormHeaderInfoUnsupportedProperty.TM.json} | 0 ...son => ActionFormHeaderInfosMultiple.TM.json} | 0 ....json => ActionFormOpInvokeDuplicate.TM.json} | 0 ....json => ActionFormServiceGroupEmpty.TM.json} | 0 ...json => ActionFormTopicNoContentType.TM.json} | 0 ...D.json => ActionFormTopicTokenAction.TM.json} | 0 ...on => ActionFormTopicTokenConsumerId.TM.json} | 0 ... => ActionFormTopicTokenMaintainerId.TM.json} | 0 ...json => ActionFormTopicTokenSenderId.TM.json} | 0 ...son => ActionFormUnsupportedProperty.TM.json} | 0 ...n => ActionFormsMultipleContentTypes.TM.json} | 0 ...json => ActionFormsOpInvokeDuplicate.TM.json} | 0 ...D.json => ActionFormsOplessAndInvoke.TM.json} | 0 ...D.json => ActionFormsOplessDuplicate.TM.json} | 0 ...onInputMap.TD.json => ActionInputMap.TM.json} | 0 ...=> ActionInputNullAndContentTypeJson.TM.json} | 0 ...tNumber.TD.json => ActionInputNumber.TM.json} | 0 ...ctionInputObjectAndContentTypeCustom.TM.json} | 0 ...> ActionInputObjectAndContentTypeRaw.TM.json} | 0 ...st.TD.json => ActionInputObjectConst.TM.json} | 0 ...son => ActionInputObjectErrorMessage.TM.json} | 0 ...tString.TD.json => ActionInputString.TM.json} | 0 ...tionNoForms.TD.json => ActionNoForms.TM.json} | 0 ...ic.TD.json => ActionNoFormsWithTopic.TM.json} | 0 ...OutputMap.TD.json => ActionOutputMap.TM.json} | 0 ...> ActionOutputNullAndContentTypeJson.TM.json} | 0 ...Number.TD.json => ActionOutputNumber.TM.json} | 0 ...tionOutputObjectAndContentTypeCustom.TM.json} | 0 ... ActionOutputObjectAndContentTypeRaw.TM.json} | 0 ...t.TD.json => ActionOutputObjectConst.TM.json} | 0 ...on => ActionOutputObjectErrorMessage.TM.json} | 0 ...String.TD.json => ActionOutputString.TM.json} | 0 ...TD.json => ActionUnsupportedProperty.TM.json} | 0 ...fix.TD.json => ContextDtvWrongPrefix.TM.json} | 0 ...ongUri.TD.json => ContextDtvWrongUri.TM.json} | 0 ...singDtv.TD.json => ContextMissingDtv.TM.json} | 0 ...anConst.TD.json => EventBooleanConst.TM.json} | 0 ...json => EventFormAdditionalResponses.TM.json} | 0 ....TD.json => EventFormContentTypeText.TM.json} | 0 ...rCode.TD.json => EventFormHeaderCode.TM.json} | 0 ...rInfo.TD.json => EventFormHeaderInfo.TM.json} | 0 ...e.TD.json => EventFormOpSubDuplicate.TM.json} | 0 ...D.json => EventFormServiceGroupEmpty.TM.json} | 0 ....json => EventFormTopicNoContentType.TM.json} | 0 ...TD.json => EventFormTopicTokenAction.TM.json} | 0 ...son => EventFormTopicTokenConsumerId.TM.json} | 0 ...son => EventFormTopicTokenExecutorId.TM.json} | 0 ...json => EventFormTopicTokenInvokerId.TM.json} | 0 ...n => EventFormTopicTokenMaintainerId.TM.json} | 0 ...json => EventFormUnsupportedProperty.TM.json} | 0 ....TD.json => EventFormsOpSubDuplicate.TM.json} | 0 ...ub.TD.json => EventFormsOplessAndSub.TM.json} | 0 ...TD.json => EventFormsOplessDuplicate.TM.json} | 0 ...erConst.TD.json => EventIntegerConst.TM.json} | 0 ...EventNoForms.TD.json => EventNoForms.TM.json} | 0 ...tNoFormsWithTopicAndNoRootFormSubAll.TM.json} | 0 ....json => EventNullAndContentTypeJson.TM.json} | 0 ...berConst.TD.json => EventNumberConst.TM.json} | 0 ...n => EventObjectAndContentTypeCustom.TM.json} | 0 ...json => EventObjectAndContentTypeRaw.TM.json} | 0 ...ectConst.TD.json => EventObjectConst.TM.json} | 0 ...e.TD.json => EventObjectErrorMessage.TM.json} | 0 ...ingConst.TD.json => EventStringConst.TM.json} | 0 ....TD.json => EventUnsupportedProperty.TM.json} | 0 ...nkEmptyHref.TD.json => LinkEmptyHref.TM.json} | 0 ...nkEmptyType.TD.json => LinkEmptyType.TM.json} | 0 .../{LinkNoHref.TD.json => LinkNoHref.TM.json} | 0 .../{LinkNoType.TD.json => LinkNoType.TM.json} | 0 ...nJsonFile.TD.json => LinkNonJsonFile.TM.json} | 0 ...tFile.TD.json => LinkNonexistentFile.TM.json} | 0 ...peNotJson.TD.json => LinkTypeNotJson.TM.json} | 0 ...y.TD.json => LinkUnsupportedProperty.TM.json} | 0 ...ltipleLinks.TD.json => MultipleLinks.TM.json} | 0 .../{NoTitle.TD.json => NoTitle.TM.json} | 0 ...onst.TD.json => PropertyBooleanConst.TM.json} | 0 ...rmAdditionalResponseContentTypeEmpty.TM.json} | 0 ...ormAdditionalResponseContentTypeText.TM.json} | 0 ...alResponseNoMatchingSchemaDefinition.TM.json} | 0 ...opertyFormAdditionalResponseNoSchema.TM.json} | 0 ...dditionalResponseNoSchemaDefinitions.TM.json} | 0 ...pertyFormAdditionalResponseNoSuccess.TM.json} | 0 ...dditionalResponseSchemaDefinitionMap.TM.json} | 0 ...nalResponseSchemaDefinitionNotObject.TM.json} | 0 ...rtyFormAdditionalResponseSchemaEmpty.TM.json} | 0 ...rtyFormAdditionalResponseSuccessTrue.TM.json} | 0 ...dditionalResponseUnsupportedProperty.TM.json} | 0 ...pertyFormAdditionalResponsesMultiple.TM.json} | 0 ....json => PropertyFormContentTypeText.TM.json} | 0 ...de.TD.json => PropertyFormHeaderCode.TM.json} | 0 ...fo.TD.json => PropertyFormHeaderInfo.TM.json} | 0 ....json => PropertyFormOpReadDuplicate.TM.json} | 0 ...json => PropertyFormOpWriteDuplicate.TM.json} | 0 ...ormReadAllWithoutAdditionalResponses.TM.json} | 0 ...lessWithoutTopicAndNoRootFormReadAll.TM.json} | 0 ...ormReadAllWithoutAdditionalResponses.TM.json} | 0 ...ReadWithoutTopicAndNoRootFormReadAll.TM.json} | 0 ...opicWriteWithTopicAndRootFormReadAll.TM.json} | 0 ....TD.json => PropertyFormServiceGroup.TM.json} | 0 ...on => PropertyFormTopicNoContentType.TM.json} | 0 ... => PropertyFormTopicTokenExecutorId.TM.json} | 0 ...n => PropertyFormTopicTokenInvokerId.TM.json} | 0 ...icTokenNoActionWhenNoOpAndNoReadOnly.TM.json} | 0 ...okenNoActionWhenNoOpAndReadOnlyFalse.TM.json} | 0 ...rmTopicTokenNoActionWhenReadAndWrite.TM.json} | 0 ...on => PropertyFormTopicTokenSenderId.TM.json} | 0 ...n => PropertyFormUnsupportedProperty.TM.json} | 0 ...WriteMultiWithoutAdditionalResponses.TM.json} | 0 ...eWithoutTopicAndNoRootFormWriteMulti.TM.json} | 0 ...json => PropertyFormsOpReadDuplicate.TM.json} | 0 ...son => PropertyFormsOpWriteDuplicate.TM.json} | 0 ...D.json => PropertyFormsOpWriteNoRead.TM.json} | 0 ...D.json => PropertyFormsOplessAndRead.TM.json} | 0 ...json => PropertyFormsOplessDuplicate.TM.json} | 0 ...onst.TD.json => PropertyIntegerConst.TM.json} | 0 ...tyNoForms.TD.json => PropertyNoForms.TM.json} | 0 ...Const.TD.json => PropertyNumberConst.TM.json} | 0 ...Const.TD.json => PropertyObjectConst.TM.json} | 0 ...D.json => PropertyObjectErrorMessage.TM.json} | 0 ...Const.TD.json => PropertyStringConst.TM.json} | 0 ...TypeNull.TD.json => PropertyTypeNull.TM.json} | 0 ....json => PropertyUnsupportedProperty.TM.json} | 0 ...rmAdditionalResponseContentTypeEmpty.TM.json} | 0 ...ormAdditionalResponseContentTypeText.TM.json} | 0 ... RootFormAdditionalResponseNoSuccess.TM.json} | 0 ... => RootFormAdditionalResponseSchema.TM.json} | 0 ...ootFormAdditionalResponseSuccessTrue.TM.json} | 0 ...dditionalResponseUnsupportedProperty.TM.json} | 0 ...RootFormAdditionalResponsesAndSubAll.TM.json} | 0 ... RootFormAdditionalResponsesMultiple.TM.json} | 0 ...TD.json => RootFormContentTypeCustom.TM.json} | 0 ...aw.TD.json => RootFormContentTypeRaw.TM.json} | 0 ...t.TD.json => RootFormContentTypeText.TM.json} | 0 ...erCode.TD.json => RootFormHeaderCode.TM.json} | 0 ...erInfo.TD.json => RootFormHeaderInfo.TM.json} | 0 ...ype.TD.json => RootFormNoContentType.TM.json} | 0 ...rmNoTopic.TD.json => RootFormNoTopic.TM.json} | 0 ...D.json => RootFormOpReadAllAndSubAll.TM.json} | 0 ...D.json => RootFormOpReadAllDuplicate.TM.json} | 0 ...TD.json => RootFormOpSubAllDuplicate.TM.json} | 0 ...json => RootFormOpWiteMultiAndSubAll.TM.json} | 0 ...son => RootFormOpWriteMultiDuplicate.TM.json} | 0 ...on => RootFormReadAllButNoProperties.TM.json} | 0 ...TD.json => RootFormServiceGroupEmpty.TM.json} | 0 ...json => RootFormServiceGroupNoSubAll.TM.json} | 0 ...TD.json => RootFormSubAllButNoEvents.TM.json} | 0 ...cEmpty.TD.json => RootFormTopicEmpty.TM.json} | 0 ...y.TD.json => RootFormTopicLevelEmpty.TM.json} | 0 ...TD.json => RootFormTopicLevelInvalid.TM.json} | 0 ...D.json => RootFormTopicReservedStart.TM.json} | 0 ...> RootFormTopicTokenActionWhenSubAll.TM.json} | 0 ...otFormTopicTokenConsumerIdWhenSubAll.TM.json} | 0 ...son => RootFormTopicTokenCustomEmpty.TM.json} | 0 ...n => RootFormTopicTokenCustomInvalid.TM.json} | 0 ...y.TD.json => RootFormTopicTokenEmpty.TM.json} | 0 ...json => RootFormTopicTokenExecutorId.TM.json} | 0 ....json => RootFormTopicTokenInvokerId.TM.json} | 0 ...FormTopicTokenMaintainerIdWhenSubAll.TM.json} | 0 ...okenNoActionWhenReadAllAndWriteMulti.TM.json} | 0 ...ootFormTopicTokenSenderIdWhenReadAll.TM.json} | 0 ...FormTopicTokenSenderIdWhenWriteMulti.TM.json} | 0 ...on => RootFormTopicTokenUnrecognized.TM.json} | 0 ...ormWriteMultiButNoWritableProperties.TM.json} | 0 ....json => RootFormsOpReadAllDuplicate.TM.json} | 0 ...D.json => RootFormsOpSubAllDuplicate.TM.json} | 0 ...on => RootFormsOpWriteMultiDuplicate.TM.json} | 0 ...on => RootFormsOpWriteMultiNoReadAll.TM.json} | 0 ...D.json => SchemaDefinitionArrayConst.TM.json} | 0 ... => SchemaDefinitionArrayItemsNoType.TM.json} | 0 ...chemaDefinitionArrayItemsObjectConst.TM.json} | 0 ...son => SchemaDefinitionArrayItemsRef.TM.json} | 0 ...chemaDefinitionArrayItemsStringConst.TM.json} | 0 ...> SchemaDefinitionArrayItemsTypeNull.TM.json} | 0 ...json => SchemaDefinitionArrayNoItems.TM.json} | 0 ...efinitionBooleanConstValueNotBoolean.TM.json} | 0 ...n => SchemaDefinitionBooleanReadOnly.TM.json} | 0 ...DefinitionBooleanUnsupportedProperty.TM.json} | 0 ...aDefinitionIntegerConstValueAboveMax.TM.json} | 0 ...aDefinitionIntegerConstValueBelowMin.TM.json} | 0 ...efinitionIntegerConstValueNotInteger.TM.json} | 0 ...efinitionIntegerConstValueNotNumeric.TM.json} | 0 ...SchemaDefinitionIntegerMaxNotInteger.TM.json} | 0 ...> SchemaDefinitionIntegerMinAboveMax.TM.json} | 0 ...SchemaDefinitionIntegerMinNotInteger.TM.json} | 0 ...n => SchemaDefinitionIntegerReadOnly.TM.json} | 0 ...DefinitionIntegerUnsupportedProperty.TM.json} | 0 ...initionMapAdditionalPropertiesNoType.TM.json} | 0 ...onMapAdditionalPropertiesObjectConst.TM.json} | 0 ...DefinitionMapAdditionalPropertiesRef.TM.json} | 0 ...onMapAdditionalPropertiesStringConst.TM.json} | 0 ...itionMapAdditionalPropertiesTypeNull.TM.json} | 0 ....TD.json => SchemaDefinitionMapConst.TM.json} | 0 ...pe.TD.json => SchemaDefinitionNoType.TM.json} | 0 ...maDefinitionNumberConstValueAboveMax.TM.json} | 0 ...maDefinitionNumberConstValueBelowMin.TM.json} | 0 ...DefinitionNumberConstValueNotNumeric.TM.json} | 0 ...=> SchemaDefinitionNumberMinAboveMax.TM.json} | 0 ...on => SchemaDefinitionNumberReadOnly.TM.json} | 0 ...aDefinitionNumberUnsupportedProperty.TM.json} | 0 ...hemaDefinitionObjectBothDeterminants.TM.json} | 0 ...SchemaDefinitionObjectConstNotObject.TM.json} | 0 ...itionObjectConstPropertyBooleanConst.TM.json} | 0 ...ObjectConstPropertyBooleanNotBoolean.TM.json} | 0 ...stPropertyBooleanUnsupportedProperty.TM.json} | 0 ...onObjectConstPropertyIntegerAboveMax.TM.json} | 0 ...onObjectConstPropertyIntegerBelowMin.TM.json} | 0 ...itionObjectConstPropertyIntegerConst.TM.json} | 0 ...ObjectConstPropertyIntegerNotInteger.TM.json} | 0 ...ObjectConstPropertyIntegerNotNumeric.TM.json} | 0 ...stPropertyIntegerUnsupportedProperty.TM.json} | 0 ...aDefinitionObjectConstPropertyNoType.TM.json} | 0 ...DefinitionObjectConstPropertyNoValue.TM.json} | 0 ...ionObjectConstPropertyNumberAboveMax.TM.json} | 0 ...ionObjectConstPropertyNumberBelowMin.TM.json} | 0 ...nitionObjectConstPropertyNumberConst.TM.json} | 0 ...nObjectConstPropertyNumberNotNumeric.TM.json} | 0 ...nstPropertyNumberUnsupportedProperty.TM.json} | 0 ...nitionObjectConstPropertyStringConst.TM.json} | 0 ...nstPropertyStringUnsupportedProperty.TM.json} | 0 ...ectConstPropertyStringValueNotString.TM.json} | 0 ...finitionObjectConstPropertyTypeArray.TM.json} | 0 ...efinitionObjectConstPropertyTypeNull.TM.json} | 0 ...initionObjectConstPropertyTypeObject.TM.json} | 0 ...nitionObjectConstUnsupportedProperty.TM.json} | 0 ...maDefinitionObjectConstValueNoSchema.TM.json} | 0 ...finitionObjectErrorMessageNoProperty.TM.json} | 0 ...efinitionObjectErrorMessageNotString.TM.json} | 0 ...nObjectErrorMessagePropertyNotString.TM.json} | 0 ... SchemaDefinitionObjectNoDeterminant.TM.json} | 0 ...aDefinitionObjectPropertiesNotObject.TM.json} | 0 ...SchemaDefinitionObjectPropertyNoType.TM.json} | 0 ...aDefinitionObjectPropertyObjectConst.TM.json} | 0 ...=> SchemaDefinitionObjectPropertyRef.TM.json} | 0 ...aDefinitionObjectPropertyStringConst.TM.json} | 0 ...hemaDefinitionObjectPropertyTypeNull.TM.json} | 0 ...maDefinitionObjectRequiredNoProperty.TM.json} | 0 ...onRef.TD.json => SchemaDefinitionRef.TM.json} | 0 ...DefinitionStringConstContentEncoding.TM.json} | 0 ...=> SchemaDefinitionStringConstFormat.TM.json} | 0 ...> SchemaDefinitionStringConstPattern.TM.json} | 0 ...nitionStringConstUnsupportedProperty.TM.json} | 0 ...aDefinitionStringConstValueNotString.TM.json} | 0 ...tringContentEncodingUnsupportedValue.TM.json} | 0 ...n => SchemaDefinitionStringEnumConst.TM.json} | 0 ...aDefinitionStringEnumContentEncoding.TM.json} | 0 ...maDefinitionStringEnumElementInvalid.TM.json} | 0 ... => SchemaDefinitionStringEnumFormat.TM.json} | 0 ...=> SchemaDefinitionStringEnumPattern.TM.json} | 0 ...> SchemaDefinitionStringEnumReadOnly.TM.json} | 0 ...initionStringEnumUnsupportedProperty.TM.json} | 0 ...nitionStringFormatAndContentEncoding.TM.json} | 0 ...hemaDefinitionStringFormatAndPattern.TM.json} | 0 ...finitionStringFormatUnsupportedValue.TM.json} | 0 ...itionStringPatternAndContentEncoding.TM.json} | 0 ...ionStringPatternNotDurationOrDecimal.TM.json} | 0 ...aDefinitionStringPatternRegexInvalid.TM.json} | 0 ...on => SchemaDefinitionStringReadOnly.TM.json} | 0 ...aDefinitionStringUnsupportedProperty.TM.json} | 0 ....TD.json => SchemaDefinitionTypeNull.TM.json} | 0 ....TD.json => ThingUnsupportedProperty.TM.json} | 0 .../{TitleEmpty.TD.json => TitleEmpty.TM.json} | 0 ...TitleInvalid.TD.json => TitleInvalid.TM.json} | 0 .../{ArrayKey.TD.json => ArrayKey.TM.json} | 0 .../{BooleanKey.TD.json => BooleanKey.TM.json} | 0 ...DuplicateKey.TD.json => DuplicateKey.TM.json} | 0 ...MissingColon.TD.json => MissingColon.TM.json} | 0 ...MissingComma.TD.json => MissingComma.TM.json} | 0 ...ingElement.TD.json => MissingElement.TM.json} | 0 .../{MissingKey.TD.json => MissingKey.TM.json} | 0 ...MissingValue.TD.json => MissingValue.TM.json} | 0 .../{NumericKey.TD.json => NumericKey.TM.json} | 0 .../{ObjectKey.TD.json => ObjectKey.TM.json} | 0 ...ailingComma.TD.json => TrailingComma.TM.json} | 0 ...closedArray.TD.json => UnclosedArray.TM.json} | 0 ...osedObject.TD.json => UnclosedObject.TM.json} | 0 ...rmOpRead.TD.json => ActionFormOpRead.TM.json} | 0 ...FormOpSub.TD.json => ActionFormOpSub.TM.json} | 0 ...OpWrite.TD.json => ActionFormOpWrite.TM.json} | 0 ...rmsEmpty.TD.json => ActionFormsEmpty.TM.json} | 0 ...singWot.TD.json => ContextMissingWot.TM.json} | 0 ...rongType.TD.json => ContextWrongType.TM.json} | 0 ...pInvoke.TD.json => EventFormOpInvoke.TM.json} | 0 ...ormOpRead.TD.json => EventFormOpRead.TM.json} | 0 ...pSubAll.TD.json => EventFormOpSubAll.TM.json} | 0 ...mOpWrite.TD.json => EventFormOpWrite.TM.json} | 0 ...ormsEmpty.TD.json => EventFormsEmpty.TM.json} | 0 .../{NoContext.TD.json => NoContext.TM.json} | 0 .../{NoType.TD.json => NoType.TM.json} | 0 ...voke.TD.json => PropertyFormOpInvoke.TM.json} | 0 ...All.TD.json => PropertyFormOpReadAll.TM.json} | 0 ...rmOpSub.TD.json => PropertyFormOpSub.TM.json} | 0 ....TD.json => PropertyFormOpWriteMulti.TM.json} | 0 ...sEmpty.TD.json => PropertyFormsEmpty.TM.json} | 0 ...RootFormNoOp.TD.json => RootFormNoOp.TM.json} | 0 ...mpty.TD.json => RootFormOpArrayEmpty.TM.json} | 0 ...ty.TD.json => RootFormOpElementEmpty.TM.json} | 0 ...rmOpEmpty.TD.json => RootFormOpEmpty.TM.json} | 0 ...ReadOne.TD.json => RootFormOpReadOne.TM.json} | 0 ...OpSubOne.TD.json => RootFormOpSubOne.TM.json} | 0 ...iteOne.TD.json => RootFormOpWriteOne.TM.json} | 0 ...FormsEmpty.TD.json => RootFormsEmpty.TM.json} | 0 ... SchemaDefinitionArrayItemsNotObject.TM.json} | 0 ...emaDefinitionArrayItemsTypeNotString.TM.json} | 0 ...aDefinitionArrayItemsTypeUnsupported.TM.json} | 0 ...SchemaDefinitionIntegerMaxNotNumeric.TM.json} | 0 ...SchemaDefinitionIntegerMinNotNumeric.TM.json} | 0 ...tionMapAdditionalPropertiesNotObject.TM.json} | 0 ...MapAdditionalPropertiesTypeNotString.TM.json} | 0 ...pAdditionalPropertiesTypeUnsupported.TM.json} | 0 ... SchemaDefinitionNumberMaxNotNumeric.TM.json} | 0 ... SchemaDefinitionNumberMinNotNumeric.TM.json} | 0 ...onObjectConstPropertyTypeUnsupported.TM.json} | 0 ...efinitionObjectPropertyTypeNotString.TM.json} | 0 ...initionObjectPropertyTypeUnsupported.TM.json} | 0 ...emaDefinitionObjectRequiredNotString.TM.json} | 0 ...nitionStringContentEncodingNotString.TM.json} | 0 ...chemaDefinitionStringFormatNotString.TM.json} | 0 ...hemaDefinitionStringPatternNotString.TM.json} | 0 ...son => SchemaDefinitionTypeNotString.TM.json} | 0 ...n => SchemaDefinitionTypeUnsupported.TM.json} | 0 ...eNotString.TD.json => TitleNotString.TM.json} | 0 .../{TypeEmpty.TD.json => TypeEmpty.TM.json} | 0 ...ngModel.TD.json => TypeNotThingModel.TM.json} | 0 .../{LinkNoRel.TD.json => LinkNoRel.TM.json} | 0 ...LinkOtherRel.TD.json => LinkOtherRel.TM.json} | 0 .../valid/{Noop.TD.json => Noop.TM.json} | 0 ...oReadablePropertyAdditionalResponses.TM.json} | 0 ...oWritablePropertyAdditionalResponses.TM.json} | 0 719 files changed, 723 insertions(+), 730 deletions(-) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormAdditionalResponseContentTypeEmpty.TD.json => ActionFormAdditionalResponseContentTypeEmpty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormAdditionalResponseContentTypeText.TD.json => ActionFormAdditionalResponseContentTypeText.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormAdditionalResponseNoMatchingSchemaDefinition.TD.json => ActionFormAdditionalResponseNoMatchingSchemaDefinition.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormAdditionalResponseNoSchema.TD.json => ActionFormAdditionalResponseNoSchema.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormAdditionalResponseNoSchemaDefinitions.TD.json => ActionFormAdditionalResponseNoSchemaDefinitions.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormAdditionalResponseNoSuccess.TD.json => ActionFormAdditionalResponseNoSuccess.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormAdditionalResponseSchemaDefinitionMap.TD.json => ActionFormAdditionalResponseSchemaDefinitionMap.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormAdditionalResponseSchemaDefinitionNotObject.TD.json => ActionFormAdditionalResponseSchemaDefinitionNotObject.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormAdditionalResponseSchemaEmpty.TD.json => ActionFormAdditionalResponseSchemaEmpty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormAdditionalResponseSuccessTrue.TD.json => ActionFormAdditionalResponseSuccessTrue.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormAdditionalResponseUnsupportedProperty.TD.json => ActionFormAdditionalResponseUnsupportedProperty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormAdditionalResponsesMultiple.TD.json => ActionFormAdditionalResponsesMultiple.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormContentTypeText.TD.json => ActionFormContentTypeText.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormHeaderCodeEmpty.TD.json => ActionFormHeaderCodeEmpty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormHeaderCodeNoMatchingSchemaDefinition.TD.json => ActionFormHeaderCodeNoMatchingSchemaDefinition.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormHeaderCodeNoSchemaDefinitions.TD.json => ActionFormHeaderCodeNoSchemaDefinitions.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormHeaderCodeSchemaDefinitionNotEnum.TD.json => ActionFormHeaderCodeSchemaDefinitionNotEnum.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormHeaderInfoContentTypeEmpty.TD.json => ActionFormHeaderInfoContentTypeEmpty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormHeaderInfoContentTypeNotJson.TD.json => ActionFormHeaderInfoContentTypeNotJson.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormHeaderInfoNoContentType.TD.json => ActionFormHeaderInfoNoContentType.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormHeaderInfoNoMatchingSchemaDefinition.TD.json => ActionFormHeaderInfoNoMatchingSchemaDefinition.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormHeaderInfoNoSchema.TD.json => ActionFormHeaderInfoNoSchema.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormHeaderInfoNoSchemaDefinitions.TD.json => ActionFormHeaderInfoNoSchemaDefinitions.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormHeaderInfoSchemaDefinitionMap.TD.json => ActionFormHeaderInfoSchemaDefinitionMap.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormHeaderInfoSchemaDefinitionNotObject.TD.json => ActionFormHeaderInfoSchemaDefinitionNotObject.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormHeaderInfoSchemaEmpty.TD.json => ActionFormHeaderInfoSchemaEmpty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormHeaderInfoSuccessTrue.TD.json => ActionFormHeaderInfoSuccessTrue.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormHeaderInfoUnsupportedProperty.TD.json => ActionFormHeaderInfoUnsupportedProperty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormHeaderInfosMultiple.TD.json => ActionFormHeaderInfosMultiple.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormOpInvokeDuplicate.TD.json => ActionFormOpInvokeDuplicate.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormServiceGroupEmpty.TD.json => ActionFormServiceGroupEmpty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormTopicNoContentType.TD.json => ActionFormTopicNoContentType.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormTopicTokenAction.TD.json => ActionFormTopicTokenAction.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormTopicTokenConsumerId.TD.json => ActionFormTopicTokenConsumerId.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormTopicTokenMaintainerId.TD.json => ActionFormTopicTokenMaintainerId.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormTopicTokenSenderId.TD.json => ActionFormTopicTokenSenderId.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormUnsupportedProperty.TD.json => ActionFormUnsupportedProperty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormsMultipleContentTypes.TD.json => ActionFormsMultipleContentTypes.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormsOpInvokeDuplicate.TD.json => ActionFormsOpInvokeDuplicate.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormsOplessAndInvoke.TD.json => ActionFormsOplessAndInvoke.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionFormsOplessDuplicate.TD.json => ActionFormsOplessDuplicate.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionInputMap.TD.json => ActionInputMap.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionInputNullAndContentTypeJson.TD.json => ActionInputNullAndContentTypeJson.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionInputNumber.TD.json => ActionInputNumber.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionInputObjectAndContentTypeCustom.TD.json => ActionInputObjectAndContentTypeCustom.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionInputObjectAndContentTypeRaw.TD.json => ActionInputObjectAndContentTypeRaw.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionInputObjectConst.TD.json => ActionInputObjectConst.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionInputObjectErrorMessage.TD.json => ActionInputObjectErrorMessage.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionInputString.TD.json => ActionInputString.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionNoForms.TD.json => ActionNoForms.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionNoFormsWithTopic.TD.json => ActionNoFormsWithTopic.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionOutputMap.TD.json => ActionOutputMap.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionOutputNullAndContentTypeJson.TD.json => ActionOutputNullAndContentTypeJson.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionOutputNumber.TD.json => ActionOutputNumber.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionOutputObjectAndContentTypeCustom.TD.json => ActionOutputObjectAndContentTypeCustom.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionOutputObjectAndContentTypeRaw.TD.json => ActionOutputObjectAndContentTypeRaw.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionOutputObjectConst.TD.json => ActionOutputObjectConst.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionOutputObjectErrorMessage.TD.json => ActionOutputObjectErrorMessage.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionOutputString.TD.json => ActionOutputString.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ActionUnsupportedProperty.TD.json => ActionUnsupportedProperty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ContextDtvWrongPrefix.TD.json => ContextDtvWrongPrefix.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ContextDtvWrongUri.TD.json => ContextDtvWrongUri.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ContextMissingDtv.TD.json => ContextMissingDtv.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{EventBooleanConst.TD.json => EventBooleanConst.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{EventFormAdditionalResponses.TD.json => EventFormAdditionalResponses.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{EventFormContentTypeText.TD.json => EventFormContentTypeText.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{EventFormHeaderCode.TD.json => EventFormHeaderCode.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{EventFormHeaderInfo.TD.json => EventFormHeaderInfo.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{EventFormOpSubDuplicate.TD.json => EventFormOpSubDuplicate.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{EventFormServiceGroupEmpty.TD.json => EventFormServiceGroupEmpty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{EventFormTopicNoContentType.TD.json => EventFormTopicNoContentType.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{EventFormTopicTokenAction.TD.json => EventFormTopicTokenAction.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{EventFormTopicTokenConsumerId.TD.json => EventFormTopicTokenConsumerId.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{EventFormTopicTokenExecutorId.TD.json => EventFormTopicTokenExecutorId.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{EventFormTopicTokenInvokerId.TD.json => EventFormTopicTokenInvokerId.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{EventFormTopicTokenMaintainerId.TD.json => EventFormTopicTokenMaintainerId.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{EventFormUnsupportedProperty.TD.json => EventFormUnsupportedProperty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{EventFormsOpSubDuplicate.TD.json => EventFormsOpSubDuplicate.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{EventFormsOplessAndSub.TD.json => EventFormsOplessAndSub.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{EventFormsOplessDuplicate.TD.json => EventFormsOplessDuplicate.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{EventIntegerConst.TD.json => EventIntegerConst.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{EventNoForms.TD.json => EventNoForms.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{EventNoFormsWithTopicAndNoRootFormSubAll.TD.json => EventNoFormsWithTopicAndNoRootFormSubAll.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{EventNullAndContentTypeJson.TD.json => EventNullAndContentTypeJson.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{EventNumberConst.TD.json => EventNumberConst.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{EventObjectAndContentTypeCustom.TD.json => EventObjectAndContentTypeCustom.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{EventObjectAndContentTypeRaw.TD.json => EventObjectAndContentTypeRaw.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{EventObjectConst.TD.json => EventObjectConst.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{EventObjectErrorMessage.TD.json => EventObjectErrorMessage.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{EventStringConst.TD.json => EventStringConst.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{EventUnsupportedProperty.TD.json => EventUnsupportedProperty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{LinkEmptyHref.TD.json => LinkEmptyHref.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{LinkEmptyType.TD.json => LinkEmptyType.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{LinkNoHref.TD.json => LinkNoHref.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{LinkNoType.TD.json => LinkNoType.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{LinkNonJsonFile.TD.json => LinkNonJsonFile.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{LinkNonexistentFile.TD.json => LinkNonexistentFile.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{LinkTypeNotJson.TD.json => LinkTypeNotJson.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{LinkUnsupportedProperty.TD.json => LinkUnsupportedProperty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{MultipleLinks.TD.json => MultipleLinks.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{NoTitle.TD.json => NoTitle.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyBooleanConst.TD.json => PropertyBooleanConst.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormAdditionalResponseContentTypeEmpty.TD.json => PropertyFormAdditionalResponseContentTypeEmpty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormAdditionalResponseContentTypeText.TD.json => PropertyFormAdditionalResponseContentTypeText.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TD.json => PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormAdditionalResponseNoSchema.TD.json => PropertyFormAdditionalResponseNoSchema.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormAdditionalResponseNoSchemaDefinitions.TD.json => PropertyFormAdditionalResponseNoSchemaDefinitions.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormAdditionalResponseNoSuccess.TD.json => PropertyFormAdditionalResponseNoSuccess.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormAdditionalResponseSchemaDefinitionMap.TD.json => PropertyFormAdditionalResponseSchemaDefinitionMap.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormAdditionalResponseSchemaDefinitionNotObject.TD.json => PropertyFormAdditionalResponseSchemaDefinitionNotObject.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormAdditionalResponseSchemaEmpty.TD.json => PropertyFormAdditionalResponseSchemaEmpty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormAdditionalResponseSuccessTrue.TD.json => PropertyFormAdditionalResponseSuccessTrue.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormAdditionalResponseUnsupportedProperty.TD.json => PropertyFormAdditionalResponseUnsupportedProperty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormAdditionalResponsesMultiple.TD.json => PropertyFormAdditionalResponsesMultiple.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormContentTypeText.TD.json => PropertyFormContentTypeText.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormHeaderCode.TD.json => PropertyFormHeaderCode.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormHeaderInfo.TD.json => PropertyFormHeaderInfo.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormOpReadDuplicate.TD.json => PropertyFormOpReadDuplicate.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormOpWriteDuplicate.TD.json => PropertyFormOpWriteDuplicate.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json => PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TD.json => PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json => PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormReadWithoutTopicAndNoRootFormReadAll.TD.json => PropertyFormReadWithoutTopicAndNoRootFormReadAll.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TD.json => PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormServiceGroup.TD.json => PropertyFormServiceGroup.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormTopicNoContentType.TD.json => PropertyFormTopicNoContentType.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormTopicTokenExecutorId.TD.json => PropertyFormTopicTokenExecutorId.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormTopicTokenInvokerId.TD.json => PropertyFormTopicTokenInvokerId.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TD.json => PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TD.json => PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormTopicTokenNoActionWhenReadAndWrite.TD.json => PropertyFormTopicTokenNoActionWhenReadAndWrite.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormTopicTokenSenderId.TD.json => PropertyFormTopicTokenSenderId.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormUnsupportedProperty.TD.json => PropertyFormUnsupportedProperty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TD.json => PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TD.json => PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormsOpReadDuplicate.TD.json => PropertyFormsOpReadDuplicate.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormsOpWriteDuplicate.TD.json => PropertyFormsOpWriteDuplicate.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormsOpWriteNoRead.TD.json => PropertyFormsOpWriteNoRead.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormsOplessAndRead.TD.json => PropertyFormsOplessAndRead.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyFormsOplessDuplicate.TD.json => PropertyFormsOplessDuplicate.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyIntegerConst.TD.json => PropertyIntegerConst.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyNoForms.TD.json => PropertyNoForms.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyNumberConst.TD.json => PropertyNumberConst.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyObjectConst.TD.json => PropertyObjectConst.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyObjectErrorMessage.TD.json => PropertyObjectErrorMessage.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyStringConst.TD.json => PropertyStringConst.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyTypeNull.TD.json => PropertyTypeNull.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{PropertyUnsupportedProperty.TD.json => PropertyUnsupportedProperty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormAdditionalResponseContentTypeEmpty.TD.json => RootFormAdditionalResponseContentTypeEmpty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormAdditionalResponseContentTypeText.TD.json => RootFormAdditionalResponseContentTypeText.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormAdditionalResponseNoSuccess.TD.json => RootFormAdditionalResponseNoSuccess.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormAdditionalResponseSchema.TD.json => RootFormAdditionalResponseSchema.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormAdditionalResponseSuccessTrue.TD.json => RootFormAdditionalResponseSuccessTrue.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormAdditionalResponseUnsupportedProperty.TD.json => RootFormAdditionalResponseUnsupportedProperty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormAdditionalResponsesAndSubAll.TD.json => RootFormAdditionalResponsesAndSubAll.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormAdditionalResponsesMultiple.TD.json => RootFormAdditionalResponsesMultiple.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormContentTypeCustom.TD.json => RootFormContentTypeCustom.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormContentTypeRaw.TD.json => RootFormContentTypeRaw.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormContentTypeText.TD.json => RootFormContentTypeText.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormHeaderCode.TD.json => RootFormHeaderCode.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormHeaderInfo.TD.json => RootFormHeaderInfo.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormNoContentType.TD.json => RootFormNoContentType.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormNoTopic.TD.json => RootFormNoTopic.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormOpReadAllAndSubAll.TD.json => RootFormOpReadAllAndSubAll.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormOpReadAllDuplicate.TD.json => RootFormOpReadAllDuplicate.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormOpSubAllDuplicate.TD.json => RootFormOpSubAllDuplicate.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormOpWiteMultiAndSubAll.TD.json => RootFormOpWiteMultiAndSubAll.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormOpWriteMultiDuplicate.TD.json => RootFormOpWriteMultiDuplicate.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormReadAllButNoProperties.TD.json => RootFormReadAllButNoProperties.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormServiceGroupEmpty.TD.json => RootFormServiceGroupEmpty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormServiceGroupNoSubAll.TD.json => RootFormServiceGroupNoSubAll.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormSubAllButNoEvents.TD.json => RootFormSubAllButNoEvents.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormTopicEmpty.TD.json => RootFormTopicEmpty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormTopicLevelEmpty.TD.json => RootFormTopicLevelEmpty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormTopicLevelInvalid.TD.json => RootFormTopicLevelInvalid.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormTopicReservedStart.TD.json => RootFormTopicReservedStart.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormTopicTokenActionWhenSubAll.TD.json => RootFormTopicTokenActionWhenSubAll.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormTopicTokenConsumerIdWhenSubAll.TD.json => RootFormTopicTokenConsumerIdWhenSubAll.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormTopicTokenCustomEmpty.TD.json => RootFormTopicTokenCustomEmpty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormTopicTokenCustomInvalid.TD.json => RootFormTopicTokenCustomInvalid.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormTopicTokenEmpty.TD.json => RootFormTopicTokenEmpty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormTopicTokenExecutorId.TD.json => RootFormTopicTokenExecutorId.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormTopicTokenInvokerId.TD.json => RootFormTopicTokenInvokerId.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormTopicTokenMaintainerIdWhenSubAll.TD.json => RootFormTopicTokenMaintainerIdWhenSubAll.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TD.json => RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormTopicTokenSenderIdWhenReadAll.TD.json => RootFormTopicTokenSenderIdWhenReadAll.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormTopicTokenSenderIdWhenWriteMulti.TD.json => RootFormTopicTokenSenderIdWhenWriteMulti.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormTopicTokenUnrecognized.TD.json => RootFormTopicTokenUnrecognized.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormWriteMultiButNoWritableProperties.TD.json => RootFormWriteMultiButNoWritableProperties.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormsOpReadAllDuplicate.TD.json => RootFormsOpReadAllDuplicate.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormsOpSubAllDuplicate.TD.json => RootFormsOpSubAllDuplicate.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormsOpWriteMultiDuplicate.TD.json => RootFormsOpWriteMultiDuplicate.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{RootFormsOpWriteMultiNoReadAll.TD.json => RootFormsOpWriteMultiNoReadAll.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionArrayConst.TD.json => SchemaDefinitionArrayConst.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionArrayItemsNoType.TD.json => SchemaDefinitionArrayItemsNoType.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionArrayItemsObjectConst.TD.json => SchemaDefinitionArrayItemsObjectConst.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionArrayItemsRef.TD.json => SchemaDefinitionArrayItemsRef.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionArrayItemsStringConst.TD.json => SchemaDefinitionArrayItemsStringConst.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionArrayItemsTypeNull.TD.json => SchemaDefinitionArrayItemsTypeNull.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionArrayNoItems.TD.json => SchemaDefinitionArrayNoItems.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionBooleanConstValueNotBoolean.TD.json => SchemaDefinitionBooleanConstValueNotBoolean.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionBooleanReadOnly.TD.json => SchemaDefinitionBooleanReadOnly.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionBooleanUnsupportedProperty.TD.json => SchemaDefinitionBooleanUnsupportedProperty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionIntegerConstValueAboveMax.TD.json => SchemaDefinitionIntegerConstValueAboveMax.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionIntegerConstValueBelowMin.TD.json => SchemaDefinitionIntegerConstValueBelowMin.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionIntegerConstValueNotInteger.TD.json => SchemaDefinitionIntegerConstValueNotInteger.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionIntegerConstValueNotNumeric.TD.json => SchemaDefinitionIntegerConstValueNotNumeric.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionIntegerMaxNotInteger.TD.json => SchemaDefinitionIntegerMaxNotInteger.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionIntegerMinAboveMax.TD.json => SchemaDefinitionIntegerMinAboveMax.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionIntegerMinNotInteger.TD.json => SchemaDefinitionIntegerMinNotInteger.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionIntegerReadOnly.TD.json => SchemaDefinitionIntegerReadOnly.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionIntegerUnsupportedProperty.TD.json => SchemaDefinitionIntegerUnsupportedProperty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionMapAdditionalPropertiesNoType.TD.json => SchemaDefinitionMapAdditionalPropertiesNoType.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionMapAdditionalPropertiesObjectConst.TD.json => SchemaDefinitionMapAdditionalPropertiesObjectConst.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionMapAdditionalPropertiesRef.TD.json => SchemaDefinitionMapAdditionalPropertiesRef.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionMapAdditionalPropertiesStringConst.TD.json => SchemaDefinitionMapAdditionalPropertiesStringConst.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionMapAdditionalPropertiesTypeNull.TD.json => SchemaDefinitionMapAdditionalPropertiesTypeNull.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionMapConst.TD.json => SchemaDefinitionMapConst.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionNoType.TD.json => SchemaDefinitionNoType.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionNumberConstValueAboveMax.TD.json => SchemaDefinitionNumberConstValueAboveMax.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionNumberConstValueBelowMin.TD.json => SchemaDefinitionNumberConstValueBelowMin.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionNumberConstValueNotNumeric.TD.json => SchemaDefinitionNumberConstValueNotNumeric.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionNumberMinAboveMax.TD.json => SchemaDefinitionNumberMinAboveMax.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionNumberReadOnly.TD.json => SchemaDefinitionNumberReadOnly.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionNumberUnsupportedProperty.TD.json => SchemaDefinitionNumberUnsupportedProperty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectBothDeterminants.TD.json => SchemaDefinitionObjectBothDeterminants.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectConstNotObject.TD.json => SchemaDefinitionObjectConstNotObject.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectConstPropertyBooleanConst.TD.json => SchemaDefinitionObjectConstPropertyBooleanConst.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TD.json => SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TD.json => SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectConstPropertyIntegerAboveMax.TD.json => SchemaDefinitionObjectConstPropertyIntegerAboveMax.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectConstPropertyIntegerBelowMin.TD.json => SchemaDefinitionObjectConstPropertyIntegerBelowMin.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectConstPropertyIntegerConst.TD.json => SchemaDefinitionObjectConstPropertyIntegerConst.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectConstPropertyIntegerNotInteger.TD.json => SchemaDefinitionObjectConstPropertyIntegerNotInteger.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TD.json => SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TD.json => SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectConstPropertyNoType.TD.json => SchemaDefinitionObjectConstPropertyNoType.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectConstPropertyNoValue.TD.json => SchemaDefinitionObjectConstPropertyNoValue.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectConstPropertyNumberAboveMax.TD.json => SchemaDefinitionObjectConstPropertyNumberAboveMax.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectConstPropertyNumberBelowMin.TD.json => SchemaDefinitionObjectConstPropertyNumberBelowMin.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectConstPropertyNumberConst.TD.json => SchemaDefinitionObjectConstPropertyNumberConst.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectConstPropertyNumberNotNumeric.TD.json => SchemaDefinitionObjectConstPropertyNumberNotNumeric.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TD.json => SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectConstPropertyStringConst.TD.json => SchemaDefinitionObjectConstPropertyStringConst.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TD.json => SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectConstPropertyStringValueNotString.TD.json => SchemaDefinitionObjectConstPropertyStringValueNotString.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectConstPropertyTypeArray.TD.json => SchemaDefinitionObjectConstPropertyTypeArray.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectConstPropertyTypeNull.TD.json => SchemaDefinitionObjectConstPropertyTypeNull.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectConstPropertyTypeObject.TD.json => SchemaDefinitionObjectConstPropertyTypeObject.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectConstUnsupportedProperty.TD.json => SchemaDefinitionObjectConstUnsupportedProperty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectConstValueNoSchema.TD.json => SchemaDefinitionObjectConstValueNoSchema.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectErrorMessageNoProperty.TD.json => SchemaDefinitionObjectErrorMessageNoProperty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectErrorMessageNotString.TD.json => SchemaDefinitionObjectErrorMessageNotString.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectErrorMessagePropertyNotString.TD.json => SchemaDefinitionObjectErrorMessagePropertyNotString.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectNoDeterminant.TD.json => SchemaDefinitionObjectNoDeterminant.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectPropertiesNotObject.TD.json => SchemaDefinitionObjectPropertiesNotObject.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectPropertyNoType.TD.json => SchemaDefinitionObjectPropertyNoType.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectPropertyObjectConst.TD.json => SchemaDefinitionObjectPropertyObjectConst.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectPropertyRef.TD.json => SchemaDefinitionObjectPropertyRef.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectPropertyStringConst.TD.json => SchemaDefinitionObjectPropertyStringConst.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectPropertyTypeNull.TD.json => SchemaDefinitionObjectPropertyTypeNull.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionObjectRequiredNoProperty.TD.json => SchemaDefinitionObjectRequiredNoProperty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionRef.TD.json => SchemaDefinitionRef.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionStringConstContentEncoding.TD.json => SchemaDefinitionStringConstContentEncoding.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionStringConstFormat.TD.json => SchemaDefinitionStringConstFormat.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionStringConstPattern.TD.json => SchemaDefinitionStringConstPattern.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionStringConstUnsupportedProperty.TD.json => SchemaDefinitionStringConstUnsupportedProperty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionStringConstValueNotString.TD.json => SchemaDefinitionStringConstValueNotString.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionStringContentEncodingUnsupportedValue.TD.json => SchemaDefinitionStringContentEncodingUnsupportedValue.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionStringEnumConst.TD.json => SchemaDefinitionStringEnumConst.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionStringEnumContentEncoding.TD.json => SchemaDefinitionStringEnumContentEncoding.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionStringEnumElementInvalid.TD.json => SchemaDefinitionStringEnumElementInvalid.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionStringEnumFormat.TD.json => SchemaDefinitionStringEnumFormat.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionStringEnumPattern.TD.json => SchemaDefinitionStringEnumPattern.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionStringEnumReadOnly.TD.json => SchemaDefinitionStringEnumReadOnly.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionStringEnumUnsupportedProperty.TD.json => SchemaDefinitionStringEnumUnsupportedProperty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionStringFormatAndContentEncoding.TD.json => SchemaDefinitionStringFormatAndContentEncoding.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionStringFormatAndPattern.TD.json => SchemaDefinitionStringFormatAndPattern.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionStringFormatUnsupportedValue.TD.json => SchemaDefinitionStringFormatUnsupportedValue.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionStringPatternAndContentEncoding.TD.json => SchemaDefinitionStringPatternAndContentEncoding.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionStringPatternNotDurationOrDecimal.TD.json => SchemaDefinitionStringPatternNotDurationOrDecimal.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionStringPatternRegexInvalid.TD.json => SchemaDefinitionStringPatternRegexInvalid.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionStringReadOnly.TD.json => SchemaDefinitionStringReadOnly.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionStringUnsupportedProperty.TD.json => SchemaDefinitionStringUnsupportedProperty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{SchemaDefinitionTypeNull.TD.json => SchemaDefinitionTypeNull.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{ThingUnsupportedProperty.TD.json => ThingUnsupportedProperty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{TitleEmpty.TD.json => TitleEmpty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/{TitleInvalid.TD.json => TitleInvalid.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/{ArrayKey.TD.json => ArrayKey.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/{BooleanKey.TD.json => BooleanKey.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/{DuplicateKey.TD.json => DuplicateKey.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/{MissingColon.TD.json => MissingColon.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/{MissingComma.TD.json => MissingComma.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/{MissingElement.TD.json => MissingElement.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/{MissingKey.TD.json => MissingKey.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/{MissingValue.TD.json => MissingValue.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/{NumericKey.TD.json => NumericKey.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/{ObjectKey.TD.json => ObjectKey.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/{TrailingComma.TD.json => TrailingComma.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/{UnclosedArray.TD.json => UnclosedArray.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/{UnclosedObject.TD.json => UnclosedObject.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{ActionFormOpRead.TD.json => ActionFormOpRead.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{ActionFormOpSub.TD.json => ActionFormOpSub.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{ActionFormOpWrite.TD.json => ActionFormOpWrite.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{ActionFormsEmpty.TD.json => ActionFormsEmpty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{ContextMissingWot.TD.json => ContextMissingWot.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{ContextWrongType.TD.json => ContextWrongType.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{EventFormOpInvoke.TD.json => EventFormOpInvoke.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{EventFormOpRead.TD.json => EventFormOpRead.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{EventFormOpSubAll.TD.json => EventFormOpSubAll.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{EventFormOpWrite.TD.json => EventFormOpWrite.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{EventFormsEmpty.TD.json => EventFormsEmpty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{NoContext.TD.json => NoContext.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{NoType.TD.json => NoType.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{PropertyFormOpInvoke.TD.json => PropertyFormOpInvoke.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{PropertyFormOpReadAll.TD.json => PropertyFormOpReadAll.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{PropertyFormOpSub.TD.json => PropertyFormOpSub.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{PropertyFormOpWriteMulti.TD.json => PropertyFormOpWriteMulti.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{PropertyFormsEmpty.TD.json => PropertyFormsEmpty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{RootFormNoOp.TD.json => RootFormNoOp.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{RootFormOpArrayEmpty.TD.json => RootFormOpArrayEmpty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{RootFormOpElementEmpty.TD.json => RootFormOpElementEmpty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{RootFormOpEmpty.TD.json => RootFormOpEmpty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{RootFormOpReadOne.TD.json => RootFormOpReadOne.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{RootFormOpSubOne.TD.json => RootFormOpSubOne.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{RootFormOpWriteOne.TD.json => RootFormOpWriteOne.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{RootFormsEmpty.TD.json => RootFormsEmpty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{SchemaDefinitionArrayItemsNotObject.TD.json => SchemaDefinitionArrayItemsNotObject.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{SchemaDefinitionArrayItemsTypeNotString.TD.json => SchemaDefinitionArrayItemsTypeNotString.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{SchemaDefinitionArrayItemsTypeUnsupported.TD.json => SchemaDefinitionArrayItemsTypeUnsupported.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{SchemaDefinitionIntegerMaxNotNumeric.TD.json => SchemaDefinitionIntegerMaxNotNumeric.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{SchemaDefinitionIntegerMinNotNumeric.TD.json => SchemaDefinitionIntegerMinNotNumeric.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{SchemaDefinitionMapAdditionalPropertiesNotObject.TD.json => SchemaDefinitionMapAdditionalPropertiesNotObject.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{SchemaDefinitionMapAdditionalPropertiesTypeNotString.TD.json => SchemaDefinitionMapAdditionalPropertiesTypeNotString.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TD.json => SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{SchemaDefinitionNumberMaxNotNumeric.TD.json => SchemaDefinitionNumberMaxNotNumeric.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{SchemaDefinitionNumberMinNotNumeric.TD.json => SchemaDefinitionNumberMinNotNumeric.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{SchemaDefinitionObjectConstPropertyTypeUnsupported.TD.json => SchemaDefinitionObjectConstPropertyTypeUnsupported.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{SchemaDefinitionObjectPropertyTypeNotString.TD.json => SchemaDefinitionObjectPropertyTypeNotString.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{SchemaDefinitionObjectPropertyTypeUnsupported.TD.json => SchemaDefinitionObjectPropertyTypeUnsupported.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{SchemaDefinitionObjectRequiredNotString.TD.json => SchemaDefinitionObjectRequiredNotString.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{SchemaDefinitionStringContentEncodingNotString.TD.json => SchemaDefinitionStringContentEncodingNotString.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{SchemaDefinitionStringFormatNotString.TD.json => SchemaDefinitionStringFormatNotString.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{SchemaDefinitionStringPatternNotString.TD.json => SchemaDefinitionStringPatternNotString.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{SchemaDefinitionTypeNotString.TD.json => SchemaDefinitionTypeNotString.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{SchemaDefinitionTypeUnsupported.TD.json => SchemaDefinitionTypeUnsupported.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{TitleNotString.TD.json => TitleNotString.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{TypeEmpty.TD.json => TypeEmpty.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/{TypeNotThingModel.TD.json => TypeNotThingModel.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/{LinkNoRel.TD.json => LinkNoRel.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/{LinkOtherRel.TD.json => LinkOtherRel.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/{Noop.TD.json => Noop.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/{RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TD.json => RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TM.json} (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/{RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TD.json => RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TM.json} (100%) diff --git a/codegen2/eval/aio/gen.sh b/codegen2/eval/aio/gen.sh index 5b93eb2350..758cb33c3a 100644 --- a/codegen2/eval/aio/gen.sh +++ b/codegen2/eval/aio/gen.sh @@ -10,23 +10,23 @@ $genFromDtdl --modelFile ./eng/dtdl/adr-base-service.json --outDir ./eng/dtdl/Fr $genFromDtdl --modelFile ./eng/dtdl/device-discovery-service.json --outDir ./eng/dtdl/FromDtdl/AssetAndDeviceRegistry/device_discovery_gen --lang rust --sdkPath ../../../rust [[ -d ./eng/dtdl/FromWot/AssetAndDeviceRegistry ]] && rm -r ./eng/dtdl/FromWot/AssetAndDeviceRegistry -$genFromWot --thingFiles ./eng/dtdl/AdrBaseService.TD.json --outDir ./eng/dtdl/FromWot/AssetAndDeviceRegistry --lang csharp --namespace AdrBaseService --workingDir obj/akri/AdrBaseService --sdkPath ../../../dotnet/src/Azure.Iot.Operations.Protocol -$genFromWot --thingFiles ./eng/dtdl/DeviceDiscoveryService.TD.json --outDir ./eng/dtdl/FromWot/AssetAndDeviceRegistry --lang csharp --namespace DeviceDiscoveryService --workingDir obj/akri/DeviceDiscoveryService --sdkPath ../../../dotnet/src/Azure.Iot.Operations.Protocol -$genFromWot --thingFiles ./eng/dtdl/AdrBaseService.TD.json --outDir ./eng/dtdl/FromWot/AssetAndDeviceRegistry/adr_base_gen --lang rust --namespace AdrBaseService --workingDir target/akri/AdrBaseService --sdkPath ../../../rust -$genFromWot --thingFiles ./eng/dtdl/DeviceDiscoveryService.TD.json --outDir ./eng/dtdl/FromWot/AssetAndDeviceRegistry/device_discovery_gen --lang rust --namespace DeviceDiscoveryService --workingDir target/akri/DeviceDiscoveryService --sdkPath ../../../rust +$genFromWot --thingFiles ./eng/dtdl/AdrBaseService.TM.json --outDir ./eng/dtdl/FromWot/AssetAndDeviceRegistry --lang csharp --namespace AdrBaseService --workingDir obj/akri/AdrBaseService --sdkPath ../../../dotnet/src/Azure.Iot.Operations.Protocol +$genFromWot --thingFiles ./eng/dtdl/DeviceDiscoveryService.TM.json --outDir ./eng/dtdl/FromWot/AssetAndDeviceRegistry --lang csharp --namespace DeviceDiscoveryService --workingDir obj/akri/DeviceDiscoveryService --sdkPath ../../../dotnet/src/Azure.Iot.Operations.Protocol +$genFromWot --thingFiles ./eng/dtdl/AdrBaseService.TM.json --outDir ./eng/dtdl/FromWot/AssetAndDeviceRegistry/adr_base_gen --lang rust --namespace AdrBaseService --workingDir target/akri/AdrBaseService --sdkPath ../../../rust +$genFromWot --thingFiles ./eng/dtdl/DeviceDiscoveryService.TM.json --outDir ./eng/dtdl/FromWot/AssetAndDeviceRegistry/device_discovery_gen --lang rust --namespace DeviceDiscoveryService --workingDir target/akri/DeviceDiscoveryService --sdkPath ../../../rust [[ -d ./eng/dtdl/FromDtdl/SchemaRegistry ]] && rm -r ./eng/dtdl/FromDtdl/SchemaRegistry $genFromDtdl --modelFile ./eng/dtdl/SchemaRegistry-1.json --outDir ./eng/dtdl/FromDtdl/SchemaRegistry --lang csharp --sdkPath ../../../dotnet/src/Azure.Iot.Operations.Protocol $genFromDtdl --modelFile ./eng/dtdl/SchemaRegistry-1.json --outDir ./eng/dtdl/FromDtdl/SchemaRegistry/schemaregistry_gen --lang rust --sdkPath ../../../rust [[ -d ./eng/dtdl/FromWot/SchemaRegistry ]] && rm -r ./eng/dtdl/FromWot/SchemaRegistry -$genFromWot --thingFiles ./eng/dtdl/SchemaRegistry.TD.json --outDir ./eng/dtdl/FromWot/SchemaRegistry --lang csharp --namespace SchemaRegistry --workingDir obj/akri/SchemaRegistry --sdkPath ../../../dotnet/src/Azure.Iot.Operations.Protocol -$genFromWot --thingFiles ./eng/dtdl/SchemaRegistry.TD.json --outDir ./eng/dtdl/FromWot/SchemaRegistry/schemaregistry_gen --lang rust --namespace SchemaRegistry --workingDir target/akri/SchemaRegistry --sdkPath ../../../rust +$genFromWot --thingFiles ./eng/dtdl/SchemaRegistry.TM.json --outDir ./eng/dtdl/FromWot/SchemaRegistry --lang csharp --namespace SchemaRegistry --workingDir obj/akri/SchemaRegistry --sdkPath ../../../dotnet/src/Azure.Iot.Operations.Protocol +$genFromWot --thingFiles ./eng/dtdl/SchemaRegistry.TM.json --outDir ./eng/dtdl/FromWot/SchemaRegistry/schemaregistry_gen --lang rust --namespace SchemaRegistry --workingDir target/akri/SchemaRegistry --sdkPath ../../../rust [[ -d ./eng/dtdl/FromDtdl/StateStore ]] && rm -r ./eng/dtdl/FromDtdl/StateStore $genFromDtdl --modelFile ./eng/dtdl/statestore.json --outDir ./eng/dtdl/FromDtdl/StateStore --lang csharp --sdkPath ../../../dotnet/src/Azure.Iot.Operations.Protocol $genFromDtdl --modelFile ./eng/dtdl/statestore.json --outDir ./eng/dtdl/FromDtdl/StateStore/state_store_gen --lang rust --sdkPath ../../../rust [[ -d ./eng/dtdl/FromWot/StateStore ]] && rm -r ./eng/dtdl/FromWot/StateStore -$genFromWot --thingFiles ./eng/dtdl/StateStore.TD.json --outDir ./eng/dtdl/FromWot/StateStore --lang csharp --namespace StateStore --workingDir obj/akri/StateStore --sdkPath ../../../dotnet/src/Azure.Iot.Operations.Protocol -$genFromWot --thingFiles ./eng/dtdl/StateStore.TD.json --outDir ./eng/dtdl/FromWot/StateStore/state_store_gen --lang rust --namespace StateStore --workingDir obj/akri/StateStore --sdkPath ../../../dotnet/src/Azure.Iot.Operations.Protocol +$genFromWot --thingFiles ./eng/dtdl/StateStore.TM.json --outDir ./eng/dtdl/FromWot/StateStore --lang csharp --namespace StateStore --workingDir obj/akri/StateStore --sdkPath ../../../dotnet/src/Azure.Iot.Operations.Protocol +$genFromWot --thingFiles ./eng/dtdl/StateStore.TM.json --outDir ./eng/dtdl/FromWot/StateStore/state_store_gen --lang rust --namespace StateStore --workingDir obj/akri/StateStore --sdkPath ../../../dotnet/src/Azure.Iot.Operations.Protocol diff --git a/codegen2/eval/wot/.vscode/settings.json b/codegen2/eval/wot/.vscode/settings.json index 0c40ec4af1..8ce7a1138b 100644 --- a/codegen2/eval/wot/.vscode/settings.json +++ b/codegen2/eval/wot/.vscode/settings.json @@ -2,7 +2,7 @@ "json.schemaDownload.enable": true, "json.schemas": [ { - "fileMatch": [ "**/*.TD.json" ], + "fileMatch": [ "**/*.TM.json" ], "url": "../../schema/aio-tm-json-schema.json" } ] diff --git a/codegen2/src/Dtdl2Wot/Command/t4/CommandAffordance.tt b/codegen2/src/Dtdl2Wot/Command/t4/CommandAffordance.tt index 24304b40c4..304e635db3 100644 --- a/codegen2/src/Dtdl2Wot/Command/t4/CommandAffordance.tt +++ b/codegen2/src/Dtdl2Wot/Command/t4/CommandAffordance.tt @@ -85,7 +85,6 @@ <# } #> "forms": [ { - "href": "<#=this.dtCommand.Id#>", "contentType": "<#=this.contentType#>", <# if (this.isResponseSchemaResult) { #> <# if (this.errorSchemaName != null) { #> diff --git a/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs b/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs index 86d7161a3a..ee7f27fa41 100644 --- a/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs +++ b/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs @@ -70,7 +70,7 @@ public InterfaceThing(IReadOnlyDictionary modelDict, Dtmi in this.thingDescriber = new ThingDescriber(mqttVersion); } - public string FileName { get => $"{this.serviceName.AsGiven}.TD.json"; } + public string FileName { get => $"{this.serviceName.AsGiven}.TM.json"; } public string FolderPath { get => string.Empty; } } diff --git a/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt b/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt index 58df22b4f6..062ec3773f 100644 --- a/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt +++ b/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt @@ -56,7 +56,6 @@ "forms": [ <# if (this.aggregateTelemetries) { #> { - "href": "<#=this.dtInterface.Id#>", "contentType": "<#=this.contentType#>", "dtv:topic": "<#=this.telemetryTopic#>", "op": "subscribeallevents" @@ -65,7 +64,6 @@ <# if (this.aggregateProperties) { #> <# if (this.dtInterface.Properties.Any(p => p.Value.Writable)) { #> { - "href": "<#=this.dtInterface.Id#>", "contentType": "<#=this.contentType#>", <# if (this.dtInterface.Properties.Values.Any(p => p.Writable && IsSchemaPropertyResult(p.Schema) && ((DTObjectInfo)p.Schema).Fields.Any(f => IsFieldWriteError(f)))) { #> "additionalResponses": [ @@ -79,7 +77,6 @@ }, <# } #> { - "href": "<#=this.dtInterface.Id#>", "contentType": "<#=this.contentType#>", <# if (this.dtInterface.Properties.Values.Any(p => IsSchemaPropertyResult(p.Schema) && ((DTObjectInfo)p.Schema).Fields.Any(f => IsFieldReadError(f)))) { #> "additionalResponses": [ diff --git a/codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.tt b/codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.tt index f751fa2e84..991c8f3528 100644 --- a/codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.tt +++ b/codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.tt @@ -14,7 +14,6 @@ "forms": [ <# if (this.dtProperty.Writable) { #> { - "href": "<#=this.dtProperty.Id#>", "contentType": "<#=this.contentType#>", <# if (this.isSchemaPropertyResult && this.writeErrorSchemaName != null) { #> "additionalResponses": [ @@ -31,7 +30,6 @@ }, <# } #> { - "href": "<#=this.dtProperty.Id#>", "contentType": "<#=this.contentType#>", <# if (this.isSchemaPropertyResult && this.readErrorSchemaName != null) { #> "additionalResponses": [ diff --git a/codegen2/src/Dtdl2Wot/Telemetry/t4/TelemetryAffordance.tt b/codegen2/src/Dtdl2Wot/Telemetry/t4/TelemetryAffordance.tt index 5bff6298bf..1fd5a65943 100644 --- a/codegen2/src/Dtdl2Wot/Telemetry/t4/TelemetryAffordance.tt +++ b/codegen2/src/Dtdl2Wot/Telemetry/t4/TelemetryAffordance.tt @@ -18,7 +18,6 @@ <# } #> "forms": [ { - "href": "<#=this.dtTelemetry.Id#>", "contentType": "<#=this.contentType#>", <# if (this.serviceGroupId != null) { #> "dtv:serviceGroupId": "<#=this.serviceGroupId#>", diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/SampleTest.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/SampleTest.json index c7f955b16f..b0d93354df 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/SampleTest.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/SampleTest.json @@ -1,7 +1,7 @@ { "success": false, "commandLine": { - "thingFiles": [ "valid/Noop.TD.json" ], + "thingFiles": [ "valid/Noop.TM.json" ], "schemas": [ ], "typeNamer": null, "outDir": "", @@ -17,7 +17,7 @@ "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "OneAction.TD.json", + "filename": "OneAction.TM.json", "line": 32, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeEmpty.json index 92e57d7c40..36167172ce 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeEmpty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseContentTypeEmpty.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseContentTypeEmpty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyEmpty", - "filename": "ActionFormAdditionalResponseContentTypeEmpty.TD.json", + "filename": "ActionFormAdditionalResponseContentTypeEmpty.TM.json", "line": 36, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeText.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeText.json index 3ec0f208b6..15e32809c1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeText.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeText.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseContentTypeText.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseContentTypeText.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "ActionFormAdditionalResponseContentTypeText.TD.json", + "filename": "ActionFormAdditionalResponseContentTypeText.TM.json", "line": 36, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoMatchingSchemaDefinition.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoMatchingSchemaDefinition.json index b0034e12b5..760c68a241 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoMatchingSchemaDefinition.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoMatchingSchemaDefinition.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseNoMatchingSchemaDefinition.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseNoMatchingSchemaDefinition.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ItemNotFound", - "filename": "ActionFormAdditionalResponseNoMatchingSchemaDefinition.TD.json", + "filename": "ActionFormAdditionalResponseNoMatchingSchemaDefinition.TM.json", "line": 28, "cfLine": 8, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchema.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchema.json index 5a201039e0..26dee01b5f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchema.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchema.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseNoSchema.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseNoSchema.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", - "filename": "ActionFormAdditionalResponseNoSchema.TD.json", + "filename": "ActionFormAdditionalResponseNoSchema.TM.json", "line": 34, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchemaDefinitions.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchemaDefinitions.json index 780e982d19..a8888f68f6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchemaDefinitions.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchemaDefinitions.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseNoSchemaDefinitions.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseNoSchemaDefinitions.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ItemNotFound", - "filename": "ActionFormAdditionalResponseNoSchemaDefinitions.TD.json", + "filename": "ActionFormAdditionalResponseNoSchemaDefinitions.TM.json", "line": 18, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSuccess.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSuccess.json index 5ed8b06de5..41baf2e260 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSuccess.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSuccess.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseNoSuccess.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseNoSuccess.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", - "filename": "ActionFormAdditionalResponseNoSuccess.TD.json", + "filename": "ActionFormAdditionalResponseNoSuccess.TM.json", "line": 33, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionMap.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionMap.json index 102c68662e..48483ef666 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionMap.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionMap.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionMap.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionMap.TM.json" ], "lang": "none" }, "errors": [ { "condition": "TypeMismatch", - "filename": "ActionFormAdditionalResponseSchemaDefinitionMap.TD.json", + "filename": "ActionFormAdditionalResponseSchemaDefinitionMap.TM.json", "line": 33, "cfLine": 16, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionNotObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionNotObject.json index fb81bfc125..d636a0f07f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionNotObject.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionNotObject.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionNotObject.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionNotObject.TM.json" ], "lang": "none" }, "errors": [ { "condition": "TypeMismatch", - "filename": "ActionFormAdditionalResponseSchemaDefinitionNotObject.TD.json", + "filename": "ActionFormAdditionalResponseSchemaDefinitionNotObject.TM.json", "line": 35, "cfLine": 9, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaEmpty.json index 72a8136510..74bf7b9c01 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaEmpty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseSchemaEmpty.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseSchemaEmpty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyEmpty", - "filename": "ActionFormAdditionalResponseSchemaEmpty.TD.json", + "filename": "ActionFormAdditionalResponseSchemaEmpty.TM.json", "line": 36, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSuccessTrue.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSuccessTrue.json index c267c84ad3..a3dc6e06bc 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSuccessTrue.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSuccessTrue.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseSuccessTrue.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseSuccessTrue.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "ActionFormAdditionalResponseSuccessTrue.TD.json", + "filename": "ActionFormAdditionalResponseSuccessTrue.TM.json", "line": 34, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseUnsupportedProperty.json index 78c00e2313..ec0d87889d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseUnsupportedProperty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseUnsupportedProperty.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponseUnsupportedProperty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "ActionFormAdditionalResponseUnsupportedProperty.TD.json", + "filename": "ActionFormAdditionalResponseUnsupportedProperty.TM.json", "line": 37, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponsesMultiple.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponsesMultiple.json index 7a5de39dfb..14bf5e45b6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponsesMultiple.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponsesMultiple.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponsesMultiple.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormAdditionalResponsesMultiple.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ElementsPlural", - "filename": "ActionFormAdditionalResponsesMultiple.TD.json", + "filename": "ActionFormAdditionalResponsesMultiple.TM.json", "line": 33, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormContentTypeText.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormContentTypeText.json index 3f243c2b1d..c070918fc4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormContentTypeText.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormContentTypeText.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormContentTypeText.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormContentTypeText.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "ActionFormContentTypeText.TD.json", + "filename": "ActionFormContentTypeText.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeEmpty.json index 080d3a7a74..f7875e673a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeEmpty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormHeaderCodeEmpty.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormHeaderCodeEmpty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyEmpty", - "filename": "ActionFormHeaderCodeEmpty.TD.json", + "filename": "ActionFormHeaderCodeEmpty.TM.json", "line": 15, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoMatchingSchemaDefinition.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoMatchingSchemaDefinition.json index 5e4bd7e4d3..0a0732e193 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoMatchingSchemaDefinition.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoMatchingSchemaDefinition.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormHeaderCodeNoMatchingSchemaDefinition.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormHeaderCodeNoMatchingSchemaDefinition.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ItemNotFound", - "filename": "ActionFormHeaderCodeNoMatchingSchemaDefinition.TD.json", + "filename": "ActionFormHeaderCodeNoMatchingSchemaDefinition.TM.json", "line": 20, "cfLine": 8, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoSchemaDefinitions.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoSchemaDefinitions.json index 4efc9a32de..d0d6e5b8da 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoSchemaDefinitions.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoSchemaDefinitions.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormHeaderCodeNoSchemaDefinitions.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormHeaderCodeNoSchemaDefinitions.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ItemNotFound", - "filename": "ActionFormHeaderCodeNoSchemaDefinitions.TD.json", + "filename": "ActionFormHeaderCodeNoSchemaDefinitions.TM.json", "line": 15, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeSchemaDefinitionNotEnum.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeSchemaDefinitionNotEnum.json index 2615f64756..e942cf1207 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeSchemaDefinitionNotEnum.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeSchemaDefinitionNotEnum.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormHeaderCodeSchemaDefinitionNotEnum.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormHeaderCodeSchemaDefinitionNotEnum.TM.json" ], "lang": "none" }, "errors": [ { "condition": "TypeMismatch", - "filename": "ActionFormHeaderCodeSchemaDefinitionNotEnum.TD.json", + "filename": "ActionFormHeaderCodeSchemaDefinitionNotEnum.TM.json", "line": 20, "cfLine": 9, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeEmpty.json index d7fe91fce7..015cfbef0f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeEmpty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoContentTypeEmpty.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoContentTypeEmpty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyEmpty", - "filename": "ActionFormHeaderInfoContentTypeEmpty.TD.json", + "filename": "ActionFormHeaderInfoContentTypeEmpty.TM.json", "line": 36, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeNotJson.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeNotJson.json index a5161c4b9f..101cee5505 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeNotJson.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeNotJson.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoContentTypeNotJson.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoContentTypeNotJson.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "ActionFormHeaderInfoContentTypeNotJson.TD.json", + "filename": "ActionFormHeaderInfoContentTypeNotJson.TM.json", "line": 36, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoContentType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoContentType.json index 4e571586ce..bbd6a0a4c1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoContentType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoContentType.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoNoContentType.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoNoContentType.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", - "filename": "ActionFormHeaderInfoNoContentType.TD.json", + "filename": "ActionFormHeaderInfoNoContentType.TM.json", "line": 33, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoMatchingSchemaDefinition.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoMatchingSchemaDefinition.json index 448f598a58..8d7c370f91 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoMatchingSchemaDefinition.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoMatchingSchemaDefinition.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoNoMatchingSchemaDefinition.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoNoMatchingSchemaDefinition.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ItemNotFound", - "filename": "ActionFormHeaderInfoNoMatchingSchemaDefinition.TD.json", + "filename": "ActionFormHeaderInfoNoMatchingSchemaDefinition.TM.json", "line": 28, "cfLine": 8, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchema.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchema.json index ae31b26901..1dc47e9aef 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchema.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchema.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoNoSchema.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoNoSchema.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", - "filename": "ActionFormHeaderInfoNoSchema.TD.json", + "filename": "ActionFormHeaderInfoNoSchema.TM.json", "line": 34, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchemaDefinitions.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchemaDefinitions.json index c2d4fb0d3a..1fbe3bc8ae 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchemaDefinitions.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchemaDefinitions.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoNoSchemaDefinitions.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoNoSchemaDefinitions.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ItemNotFound", - "filename": "ActionFormHeaderInfoNoSchemaDefinitions.TD.json", + "filename": "ActionFormHeaderInfoNoSchemaDefinitions.TM.json", "line": 18, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionMap.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionMap.json index 094f28375b..1548a28317 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionMap.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionMap.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionMap.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionMap.TM.json" ], "lang": "none" }, "errors": [ { "condition": "TypeMismatch", - "filename": "ActionFormHeaderInfoSchemaDefinitionMap.TD.json", + "filename": "ActionFormHeaderInfoSchemaDefinitionMap.TM.json", "line": 33, "cfLine": 16, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionNotObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionNotObject.json index 2a08e1af57..20638fcb47 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionNotObject.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionNotObject.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionNotObject.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionNotObject.TM.json" ], "lang": "none" }, "errors": [ { "condition": "TypeMismatch", - "filename": "ActionFormHeaderInfoSchemaDefinitionNotObject.TD.json", + "filename": "ActionFormHeaderInfoSchemaDefinitionNotObject.TM.json", "line": 35, "cfLine": 9, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaEmpty.json index 61c1ec5856..cba7ecec85 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaEmpty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoSchemaEmpty.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoSchemaEmpty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyEmpty", - "filename": "ActionFormHeaderInfoSchemaEmpty.TD.json", + "filename": "ActionFormHeaderInfoSchemaEmpty.TM.json", "line": 36, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSuccessTrue.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSuccessTrue.json index e9c5787d07..fce9d098d2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSuccessTrue.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSuccessTrue.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoSuccessTrue.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoSuccessTrue.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "ActionFormHeaderInfoSuccessTrue.TD.json", + "filename": "ActionFormHeaderInfoSuccessTrue.TM.json", "line": 34, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoUnsupportedProperty.json index b58ce6779c..f39952762e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoUnsupportedProperty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoUnsupportedProperty.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfoUnsupportedProperty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "ActionFormHeaderInfoUnsupportedProperty.TD.json", + "filename": "ActionFormHeaderInfoUnsupportedProperty.TM.json", "line": 37, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfosMultiple.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfosMultiple.json index b979825bb2..a62bf5d2ee 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfosMultiple.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfosMultiple.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfosMultiple.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormHeaderInfosMultiple.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ElementsPlural", - "filename": "ActionFormHeaderInfosMultiple.TD.json", + "filename": "ActionFormHeaderInfosMultiple.TM.json", "line": 33, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpInvokeDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpInvokeDuplicate.json index cde13a0f30..33091668ea 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpInvokeDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpInvokeDuplicate.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormOpInvokeDuplicate.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormOpInvokeDuplicate.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Duplication", - "filename": "ActionFormOpInvokeDuplicate.TD.json", + "filename": "ActionFormOpInvokeDuplicate.TM.json", "line": 14, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpRead.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpRead.json index 6e8bb21e78..a209e6367f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpRead.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpRead.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/ActionFormOpRead.TD.json" ], + "thingFiles": [ "invalidThing/ActionFormOpRead.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "ActionFormOpRead.TD.json", + "filename": "ActionFormOpRead.TM.json", "line": 14, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpSub.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpSub.json index ce3d2f9246..0a2c48d713 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpSub.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpSub.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/ActionFormOpSub.TD.json" ], + "thingFiles": [ "invalidThing/ActionFormOpSub.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "ActionFormOpSub.TD.json", + "filename": "ActionFormOpSub.TM.json", "line": 14, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpWrite.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpWrite.json index cb7dd2fbb0..c8be572390 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpWrite.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpWrite.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/ActionFormOpWrite.TD.json" ], + "thingFiles": [ "invalidThing/ActionFormOpWrite.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "ActionFormOpWrite.TD.json", + "filename": "ActionFormOpWrite.TM.json", "line": 14, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormServiceGroupEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormServiceGroupEmpty.json index 69dca2d246..0980317341 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormServiceGroupEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormServiceGroupEmpty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormServiceGroupEmpty.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormServiceGroupEmpty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyEmpty", - "filename": "ActionFormServiceGroupEmpty.TD.json", + "filename": "ActionFormServiceGroupEmpty.TM.json", "line": 15, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicNoContentType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicNoContentType.json index c4e15afdb0..1890130db1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicNoContentType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicNoContentType.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormTopicNoContentType.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormTopicNoContentType.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "ActionFormTopicNoContentType.TD.json", + "filename": "ActionFormTopicNoContentType.TM.json", "line": 11, "cfLine": 12, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenAction.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenAction.json index 924afccb4a..dc407455a0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenAction.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenAction.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormTopicTokenAction.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormTopicTokenAction.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "ActionFormTopicTokenAction.TD.json", + "filename": "ActionFormTopicTokenAction.TM.json", "line": 13, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenConsumerId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenConsumerId.json index 940ce0dfb1..684defffa3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenConsumerId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenConsumerId.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormTopicTokenConsumerId.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormTopicTokenConsumerId.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "ActionFormTopicTokenConsumerId.TD.json", + "filename": "ActionFormTopicTokenConsumerId.TM.json", "line": 13, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenMaintainerId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenMaintainerId.json index ef0ab2d926..8ada3ef4c3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenMaintainerId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenMaintainerId.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormTopicTokenMaintainerId.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormTopicTokenMaintainerId.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "ActionFormTopicTokenMaintainerId.TD.json", + "filename": "ActionFormTopicTokenMaintainerId.TM.json", "line": 13, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenSenderId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenSenderId.json index 9b9a6adbda..745dcc43e7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenSenderId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenSenderId.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormTopicTokenSenderId.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormTopicTokenSenderId.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "ActionFormTopicTokenSenderId.TD.json", + "filename": "ActionFormTopicTokenSenderId.TM.json", "line": 13, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormUnsupportedProperty.json index 37557d0103..38a7828308 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormUnsupportedProperty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormUnsupportedProperty.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormUnsupportedProperty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "ActionFormUnsupportedProperty.TD.json", + "filename": "ActionFormUnsupportedProperty.TM.json", "line": 15, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsEmpty.json index 421a4021b6..fa82a10611 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsEmpty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/ActionFormsEmpty.TD.json" ], + "thingFiles": [ "invalidThing/ActionFormsEmpty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ElementMissing", - "filename": "ActionFormsEmpty.TD.json", + "filename": "ActionFormsEmpty.TM.json", "line": 10, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsMultipleContentTypes.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsMultipleContentTypes.json index 578f79e348..15b80f95f1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsMultipleContentTypes.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsMultipleContentTypes.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormsMultipleContentTypes.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormsMultipleContentTypes.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "ActionFormsMultipleContentTypes.TD.json", + "filename": "ActionFormsMultipleContentTypes.TM.json", "line": 12, "cfLine": 17, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOpInvokeDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOpInvokeDuplicate.json index 1afd51a4dc..07d4f8d5c7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOpInvokeDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOpInvokeDuplicate.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormsOpInvokeDuplicate.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormsOpInvokeDuplicate.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Duplication", - "filename": "ActionFormsOpInvokeDuplicate.TD.json", + "filename": "ActionFormsOpInvokeDuplicate.TM.json", "line": 14, "cfLine": 19, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessAndInvoke.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessAndInvoke.json index 69b15c6aa6..90fab20da2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessAndInvoke.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessAndInvoke.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormsOplessAndInvoke.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormsOplessAndInvoke.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "ActionFormsOplessAndInvoke.TD.json", + "filename": "ActionFormsOplessAndInvoke.TM.json", "line": 16, "cfLine": 10, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessDuplicate.json index 2a180fcc24..19eeb4ca0c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessDuplicate.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionFormsOplessDuplicate.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionFormsOplessDuplicate.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "ActionFormsOplessDuplicate.TD.json", + "filename": "ActionFormsOplessDuplicate.TM.json", "line": 11, "cfLine": 10, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputMap.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputMap.json index c543910559..79cb4e6245 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputMap.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputMap.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionInputMap.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionInputMap.TM.json" ], "lang": "none" }, "errors": [ { "condition": "TypeMismatch", - "filename": "ActionInputMap.TD.json", + "filename": "ActionInputMap.TM.json", "line": 10, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNullAndContentTypeJson.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNullAndContentTypeJson.json index 6973821144..9579abc546 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNullAndContentTypeJson.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNullAndContentTypeJson.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionInputNullAndContentTypeJson.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionInputNullAndContentTypeJson.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "ActionInputNullAndContentTypeJson.TD.json", + "filename": "ActionInputNullAndContentTypeJson.TM.json", "line": 11, "cfLine": 15, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNumber.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNumber.json index 431772a04c..f536e00958 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNumber.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNumber.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionInputNumber.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionInputNumber.TM.json" ], "lang": "none" }, "errors": [ { "condition": "TypeMismatch", - "filename": "ActionInputNumber.TD.json", + "filename": "ActionInputNumber.TM.json", "line": 10, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeCustom.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeCustom.json index 9f2fa5f5ae..02ae3d9e66 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeCustom.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeCustom.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionInputObjectAndContentTypeCustom.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionInputObjectAndContentTypeCustom.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "ActionInputObjectAndContentTypeCustom.TD.json", + "filename": "ActionInputObjectAndContentTypeCustom.TM.json", "line": 11, "cfLine": 20, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeRaw.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeRaw.json index e043cd395c..118ca29787 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeRaw.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeRaw.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionInputObjectAndContentTypeRaw.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionInputObjectAndContentTypeRaw.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "ActionInputObjectAndContentTypeRaw.TD.json", + "filename": "ActionInputObjectAndContentTypeRaw.TM.json", "line": 11, "cfLine": 20, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectConst.json index 9c4ef823df..60cf852604 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectConst.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionInputObjectConst.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionInputObjectConst.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "ActionInputObjectConst.TD.json", + "filename": "ActionInputObjectConst.TM.json", "line": 17, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectErrorMessage.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectErrorMessage.json index 7a14b156e2..95e11c2fdd 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectErrorMessage.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectErrorMessage.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionInputObjectErrorMessage.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionInputObjectErrorMessage.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "ActionInputObjectErrorMessage.TD.json", + "filename": "ActionInputObjectErrorMessage.TM.json", "line": 17, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputString.json index e00e761807..e81a6bc430 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputString.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputString.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionInputString.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionInputString.TM.json" ], "lang": "none" }, "errors": [ { "condition": "TypeMismatch", - "filename": "ActionInputString.TD.json", + "filename": "ActionInputString.TM.json", "line": 10, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoForms.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoForms.json index 4b7abf350d..513fd87717 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoForms.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoForms.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionNoForms.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionNoForms.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Unusable", - "filename": "ActionNoForms.TD.json", + "filename": "ActionNoForms.TM.json", "line": 9, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoFormsWithTopic.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoFormsWithTopic.json index 081e00d494..80fabb217e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoFormsWithTopic.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoFormsWithTopic.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionNoFormsWithTopic.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionNoFormsWithTopic.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Unusable", - "filename": "ActionNoFormsWithTopic.TD.json", + "filename": "ActionNoFormsWithTopic.TM.json", "line": 9, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputMap.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputMap.json index 133ed6bceb..500430207d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputMap.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputMap.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionOutputMap.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionOutputMap.TM.json" ], "lang": "none" }, "errors": [ { "condition": "TypeMismatch", - "filename": "ActionOutputMap.TD.json", + "filename": "ActionOutputMap.TM.json", "line": 10, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNullAndContentTypeJson.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNullAndContentTypeJson.json index 24da326f3b..215f3599c5 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNullAndContentTypeJson.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNullAndContentTypeJson.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionOutputNullAndContentTypeJson.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionOutputNullAndContentTypeJson.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "ActionOutputNullAndContentTypeJson.TD.json", + "filename": "ActionOutputNullAndContentTypeJson.TM.json", "line": 11, "cfLine": 15, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNumber.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNumber.json index e12bcbe81a..2b1ec43098 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNumber.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNumber.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionOutputNumber.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionOutputNumber.TM.json" ], "lang": "none" }, "errors": [ { "condition": "TypeMismatch", - "filename": "ActionOutputNumber.TD.json", + "filename": "ActionOutputNumber.TM.json", "line": 10, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeCustom.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeCustom.json index ee322d2cbb..e4d3e00f95 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeCustom.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeCustom.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionOutputObjectAndContentTypeCustom.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionOutputObjectAndContentTypeCustom.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "ActionOutputObjectAndContentTypeCustom.TD.json", + "filename": "ActionOutputObjectAndContentTypeCustom.TM.json", "line": 11, "cfLine": 20, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeRaw.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeRaw.json index 7b34fedeac..12e2b6f356 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeRaw.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeRaw.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionOutputObjectAndContentTypeRaw.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionOutputObjectAndContentTypeRaw.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "ActionOutputObjectAndContentTypeRaw.TD.json", + "filename": "ActionOutputObjectAndContentTypeRaw.TM.json", "line": 11, "cfLine": 20, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectConst.json index 8b3bcd18b2..a9723304f0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectConst.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionOutputObjectConst.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionOutputObjectConst.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "ActionOutputObjectConst.TD.json", + "filename": "ActionOutputObjectConst.TM.json", "line": 17, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectErrorMessage.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectErrorMessage.json index 2cee4dabe1..45169beebf 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectErrorMessage.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectErrorMessage.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionOutputObjectErrorMessage.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionOutputObjectErrorMessage.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "ActionOutputObjectErrorMessage.TD.json", + "filename": "ActionOutputObjectErrorMessage.TM.json", "line": 17, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputString.json index 9fc7135a33..96b02ec2b1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputString.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputString.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionOutputString.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionOutputString.TM.json" ], "lang": "none" }, "errors": [ { "condition": "TypeMismatch", - "filename": "ActionOutputString.TD.json", + "filename": "ActionOutputString.TM.json", "line": 10, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionUnsupportedProperty.json index 410f5a5140..67763c3f5e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionUnsupportedProperty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ActionUnsupportedProperty.TD.json" ], + "thingFiles": [ "invalidAioBinding/ActionUnsupportedProperty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "ActionUnsupportedProperty.TD.json", + "filename": "ActionUnsupportedProperty.TM.json", "line": 17, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ArrayKey.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ArrayKey.json index f62631b3ea..16faf1b789 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ArrayKey.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ArrayKey.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidJson/ArrayKey.TD.json" ], + "thingFiles": [ "invalidJson/ArrayKey.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "ArrayKey.TD.json", + "filename": "ArrayKey.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/BooleanKey.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/BooleanKey.json index 876f58a7bb..70caeed8bc 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/BooleanKey.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/BooleanKey.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidJson/BooleanKey.TD.json" ], + "thingFiles": [ "invalidJson/BooleanKey.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "BooleanKey.TD.json", + "filename": "BooleanKey.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextDtvWrongPrefix.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextDtvWrongPrefix.json index b02cb058bb..5dccd3fa38 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextDtvWrongPrefix.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextDtvWrongPrefix.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ContextDtvWrongPrefix.TD.json" ], + "thingFiles": [ "invalidAioBinding/ContextDtvWrongPrefix.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", - "filename": "ContextDtvWrongPrefix.TD.json", + "filename": "ContextDtvWrongPrefix.TM.json", "line": 2, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextDtvWrongUri.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextDtvWrongUri.json index 58c7400669..a42ec314ed 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextDtvWrongUri.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextDtvWrongUri.json @@ -1,20 +1,20 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ContextDtvWrongUri.TD.json" ], + "thingFiles": [ "invalidAioBinding/ContextDtvWrongUri.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "ContextDtvWrongUri.TD.json", + "filename": "ContextDtvWrongUri.TM.json", "line": 4, "cfLine": 0, "crossRef": "" }, { "condition": "PropertyMissing", - "filename": "ContextDtvWrongUri.TD.json", + "filename": "ContextDtvWrongUri.TM.json", "line": 2, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextMissingDtv.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextMissingDtv.json index ffb1040704..aeee13c476 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextMissingDtv.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextMissingDtv.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ContextMissingDtv.TD.json" ], + "thingFiles": [ "invalidAioBinding/ContextMissingDtv.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", - "filename": "ContextMissingDtv.TD.json", + "filename": "ContextMissingDtv.TM.json", "line": 2, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextMissingWot.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextMissingWot.json index 396aa66986..de498b760c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextMissingWot.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextMissingWot.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/ContextMissingWot.TD.json" ], + "thingFiles": [ "invalidThing/ContextMissingWot.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", - "filename": "ContextMissingWot.TD.json", + "filename": "ContextMissingWot.TM.json", "line": 2, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextWrongType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextWrongType.json index a7a5916854..6355c5beb4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextWrongType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextWrongType.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/ContextWrongType.TD.json" ], + "thingFiles": [ "invalidThing/ContextWrongType.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "ContextWrongType.TD.json", + "filename": "ContextWrongType.TM.json", "line": 2, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/DuplicateKey.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/DuplicateKey.json index 8793394088..2b1df693d7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/DuplicateKey.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/DuplicateKey.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidJson/DuplicateKey.TD.json" ], + "thingFiles": [ "invalidJson/DuplicateKey.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "DuplicateKey.TD.json", + "filename": "DuplicateKey.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventBooleanConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventBooleanConst.json index c2fce4f4cb..c6f97c5218 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventBooleanConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventBooleanConst.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/EventBooleanConst.TD.json" ], + "thingFiles": [ "invalidAioBinding/EventBooleanConst.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "EventBooleanConst.TD.json", + "filename": "EventBooleanConst.TM.json", "line": 16, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormAdditionalResponses.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormAdditionalResponses.json index c45a75edad..b3086235ba 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormAdditionalResponses.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormAdditionalResponses.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/EventFormAdditionalResponses.TD.json" ], + "thingFiles": [ "invalidAioBinding/EventFormAdditionalResponses.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "EventFormAdditionalResponses.TD.json", + "filename": "EventFormAdditionalResponses.TM.json", "line": 32, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormContentTypeText.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormContentTypeText.json index 3175ffa12c..e34f264f83 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormContentTypeText.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormContentTypeText.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/EventFormContentTypeText.TD.json" ], + "thingFiles": [ "invalidAioBinding/EventFormContentTypeText.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "EventFormContentTypeText.TD.json", + "filename": "EventFormContentTypeText.TM.json", "line": 19, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderCode.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderCode.json index 7b218fcee3..74bb6676be 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderCode.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderCode.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/EventFormHeaderCode.TD.json" ], + "thingFiles": [ "invalidAioBinding/EventFormHeaderCode.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "EventFormHeaderCode.TD.json", + "filename": "EventFormHeaderCode.TM.json", "line": 31, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderInfo.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderInfo.json index dec538f1cf..4f4e688b87 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderInfo.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderInfo.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/EventFormHeaderInfo.TD.json" ], + "thingFiles": [ "invalidAioBinding/EventFormHeaderInfo.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "EventFormHeaderInfo.TD.json", + "filename": "EventFormHeaderInfo.TM.json", "line": 32, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpInvoke.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpInvoke.json index 2586510d3d..2d7e72725d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpInvoke.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpInvoke.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/EventFormOpInvoke.TD.json" ], + "thingFiles": [ "invalidThing/EventFormOpInvoke.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "EventFormOpInvoke.TD.json", + "filename": "EventFormOpInvoke.TM.json", "line": 21, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpRead.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpRead.json index 71a44c977b..2a4284b94c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpRead.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpRead.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/EventFormOpRead.TD.json" ], + "thingFiles": [ "invalidThing/EventFormOpRead.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "EventFormOpRead.TD.json", + "filename": "EventFormOpRead.TM.json", "line": 21, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubAll.json index 551b75946e..87c4ffba16 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubAll.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/EventFormOpSubAll.TD.json" ], + "thingFiles": [ "invalidThing/EventFormOpSubAll.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "EventFormOpSubAll.TD.json", + "filename": "EventFormOpSubAll.TM.json", "line": 21, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubDuplicate.json index 6fda50ef0a..170ce1c5c4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubDuplicate.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/EventFormOpSubDuplicate.TD.json" ], + "thingFiles": [ "invalidAioBinding/EventFormOpSubDuplicate.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Duplication", - "filename": "EventFormOpSubDuplicate.TD.json", + "filename": "EventFormOpSubDuplicate.TM.json", "line": 21, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpWrite.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpWrite.json index 1b12c694f2..ffb891bc4d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpWrite.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpWrite.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/EventFormOpWrite.TD.json" ], + "thingFiles": [ "invalidThing/EventFormOpWrite.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "EventFormOpWrite.TD.json", + "filename": "EventFormOpWrite.TM.json", "line": 21, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormServiceGroupEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormServiceGroupEmpty.json index 7fd53c3d70..58bf360100 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormServiceGroupEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormServiceGroupEmpty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/EventFormServiceGroupEmpty.TD.json" ], + "thingFiles": [ "invalidAioBinding/EventFormServiceGroupEmpty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyEmpty", - "filename": "EventFormServiceGroupEmpty.TD.json", + "filename": "EventFormServiceGroupEmpty.TM.json", "line": 22, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicNoContentType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicNoContentType.json index 2dc3537585..364e760c56 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicNoContentType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicNoContentType.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/EventFormTopicNoContentType.TD.json" ], + "thingFiles": [ "invalidAioBinding/EventFormTopicNoContentType.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "EventFormTopicNoContentType.TD.json", + "filename": "EventFormTopicNoContentType.TM.json", "line": 18, "cfLine": 19, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenAction.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenAction.json index 1db97a637c..0204e11707 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenAction.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenAction.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/EventFormTopicTokenAction.TD.json" ], + "thingFiles": [ "invalidAioBinding/EventFormTopicTokenAction.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "EventFormTopicTokenAction.TD.json", + "filename": "EventFormTopicTokenAction.TM.json", "line": 20, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenConsumerId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenConsumerId.json index 0f55d3c0e0..d5c3d3bc6a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenConsumerId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenConsumerId.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/EventFormTopicTokenConsumerId.TD.json" ], + "thingFiles": [ "invalidAioBinding/EventFormTopicTokenConsumerId.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "EventFormTopicTokenConsumerId.TD.json", + "filename": "EventFormTopicTokenConsumerId.TM.json", "line": 20, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenExecutorId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenExecutorId.json index 13683cc7bf..296dafe055 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenExecutorId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenExecutorId.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/EventFormTopicTokenExecutorId.TD.json" ], + "thingFiles": [ "invalidAioBinding/EventFormTopicTokenExecutorId.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "EventFormTopicTokenExecutorId.TD.json", + "filename": "EventFormTopicTokenExecutorId.TM.json", "line": 20, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenInvokerId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenInvokerId.json index 624a6538bf..2df4ec6212 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenInvokerId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenInvokerId.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/EventFormTopicTokenInvokerId.TD.json" ], + "thingFiles": [ "invalidAioBinding/EventFormTopicTokenInvokerId.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "EventFormTopicTokenInvokerId.TD.json", + "filename": "EventFormTopicTokenInvokerId.TM.json", "line": 20, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenMaintainerId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenMaintainerId.json index e51bfedffb..8ee77e60f7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenMaintainerId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenMaintainerId.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/EventFormTopicTokenMaintainerId.TD.json" ], + "thingFiles": [ "invalidAioBinding/EventFormTopicTokenMaintainerId.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "EventFormTopicTokenMaintainerId.TD.json", + "filename": "EventFormTopicTokenMaintainerId.TM.json", "line": 20, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormUnsupportedProperty.json index bb67f395dc..71e081ebd4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormUnsupportedProperty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/EventFormUnsupportedProperty.TD.json" ], + "thingFiles": [ "invalidAioBinding/EventFormUnsupportedProperty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "EventFormUnsupportedProperty.TD.json", + "filename": "EventFormUnsupportedProperty.TM.json", "line": 22, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsEmpty.json index 0c8d8d28e7..eb3a116a83 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsEmpty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/EventFormsEmpty.TD.json" ], + "thingFiles": [ "invalidThing/EventFormsEmpty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ElementMissing", - "filename": "EventFormsEmpty.TD.json", + "filename": "EventFormsEmpty.TM.json", "line": 17, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOpSubDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOpSubDuplicate.json index ba4907d2c2..d82580e1b8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOpSubDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOpSubDuplicate.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/EventFormsOpSubDuplicate.TD.json" ], + "thingFiles": [ "invalidAioBinding/EventFormsOpSubDuplicate.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Duplication", - "filename": "EventFormsOpSubDuplicate.TD.json", + "filename": "EventFormsOpSubDuplicate.TM.json", "line": 21, "cfLine": 26, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessAndSub.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessAndSub.json index b7e30f0be7..5514c78359 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessAndSub.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessAndSub.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/EventFormsOplessAndSub.TD.json" ], + "thingFiles": [ "invalidAioBinding/EventFormsOplessAndSub.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "EventFormsOplessAndSub.TD.json", + "filename": "EventFormsOplessAndSub.TM.json", "line": 23, "cfLine": 17, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessDuplicate.json index 3f6e9d7fbf..165008347a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessDuplicate.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/EventFormsOplessDuplicate.TD.json" ], + "thingFiles": [ "invalidAioBinding/EventFormsOplessDuplicate.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "EventFormsOplessDuplicate.TD.json", + "filename": "EventFormsOplessDuplicate.TM.json", "line": 18, "cfLine": 17, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventIntegerConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventIntegerConst.json index 1de3ed5e6e..b40402af5b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventIntegerConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventIntegerConst.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/EventIntegerConst.TD.json" ], + "thingFiles": [ "invalidAioBinding/EventIntegerConst.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "EventIntegerConst.TD.json", + "filename": "EventIntegerConst.TM.json", "line": 16, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoForms.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoForms.json index 6a55ea8276..163d4d179a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoForms.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoForms.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/EventNoForms.TD.json" ], + "thingFiles": [ "invalidAioBinding/EventNoForms.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Unusable", - "filename": "EventNoForms.TD.json", + "filename": "EventNoForms.TM.json", "line": 13, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoFormsWithTopicAndNoRootFormSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoFormsWithTopicAndNoRootFormSubAll.json index f32986df63..1b54db46bf 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoFormsWithTopicAndNoRootFormSubAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoFormsWithTopicAndNoRootFormSubAll.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/EventNoFormsWithTopicAndNoRootFormSubAll.TD.json" ], + "thingFiles": [ "invalidAioBinding/EventNoFormsWithTopicAndNoRootFormSubAll.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Unusable", - "filename": "EventNoFormsWithTopicAndNoRootFormSubAll.TD.json", + "filename": "EventNoFormsWithTopicAndNoRootFormSubAll.TM.json", "line": 13, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNullAndContentTypeJson.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNullAndContentTypeJson.json index ca0b9981e6..a070aed8a2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNullAndContentTypeJson.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNullAndContentTypeJson.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/EventNullAndContentTypeJson.TD.json" ], + "thingFiles": [ "invalidAioBinding/EventNullAndContentTypeJson.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "EventNullAndContentTypeJson.TD.json", + "filename": "EventNullAndContentTypeJson.TM.json", "line": 15, "cfLine": 19, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNumberConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNumberConst.json index cb08c52959..16100b8535 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNumberConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNumberConst.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/EventNumberConst.TD.json" ], + "thingFiles": [ "invalidAioBinding/EventNumberConst.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "EventNumberConst.TD.json", + "filename": "EventNumberConst.TM.json", "line": 16, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeCustom.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeCustom.json index 1fa37d242a..4cedf60cb2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeCustom.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeCustom.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/EventObjectAndContentTypeCustom.TD.json" ], + "thingFiles": [ "invalidAioBinding/EventObjectAndContentTypeCustom.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "EventObjectAndContentTypeCustom.TD.json", + "filename": "EventObjectAndContentTypeCustom.TM.json", "line": 15, "cfLine": 24, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeRaw.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeRaw.json index 005e4d0fc1..0be0cdfc62 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeRaw.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeRaw.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/EventObjectAndContentTypeRaw.TD.json" ], + "thingFiles": [ "invalidAioBinding/EventObjectAndContentTypeRaw.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "EventObjectAndContentTypeRaw.TD.json", + "filename": "EventObjectAndContentTypeRaw.TM.json", "line": 15, "cfLine": 24, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectConst.json index 191c050e68..d380968fa7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectConst.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/EventObjectConst.TD.json" ], + "thingFiles": [ "invalidAioBinding/EventObjectConst.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "EventObjectConst.TD.json", + "filename": "EventObjectConst.TM.json", "line": 21, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectErrorMessage.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectErrorMessage.json index 93068ba06f..9b53472212 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectErrorMessage.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectErrorMessage.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/EventObjectErrorMessage.TD.json" ], + "thingFiles": [ "invalidAioBinding/EventObjectErrorMessage.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "EventObjectErrorMessage.TD.json", + "filename": "EventObjectErrorMessage.TM.json", "line": 21, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventStringConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventStringConst.json index 52dddc4a17..76867e18f9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventStringConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventStringConst.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/EventStringConst.TD.json" ], + "thingFiles": [ "invalidAioBinding/EventStringConst.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "EventStringConst.TD.json", + "filename": "EventStringConst.TM.json", "line": 16, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventUnsupportedProperty.json index 1a3741183c..e855325227 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventUnsupportedProperty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/EventUnsupportedProperty.TD.json" ], + "thingFiles": [ "invalidAioBinding/EventUnsupportedProperty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "EventUnsupportedProperty.TD.json", + "filename": "EventUnsupportedProperty.TM.json", "line": 24, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkEmptyHref.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkEmptyHref.json index bef9f8b1a0..b08731eb13 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkEmptyHref.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkEmptyHref.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/LinkEmptyHref.TD.json" ], + "thingFiles": [ "invalidAioBinding/LinkEmptyHref.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyEmpty", - "filename": "LinkEmptyHref.TD.json", + "filename": "LinkEmptyHref.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkEmptyType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkEmptyType.json index 89de7f2fe0..dc38611f85 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkEmptyType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkEmptyType.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/LinkEmptyType.TD.json" ], + "thingFiles": [ "invalidAioBinding/LinkEmptyType.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyEmpty", - "filename": "LinkEmptyType.TD.json", + "filename": "LinkEmptyType.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNoHref.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNoHref.json index 924e0fd6f2..7d29340985 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNoHref.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNoHref.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/LinkNoHref.TD.json" ], + "thingFiles": [ "invalidAioBinding/LinkNoHref.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", - "filename": "LinkNoHref.TD.json", + "filename": "LinkNoHref.TM.json", "line": 9, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNoType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNoType.json index a21141a99e..3396f0c006 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNoType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNoType.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/LinkNoType.TD.json" ], + "thingFiles": [ "invalidAioBinding/LinkNoType.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", - "filename": "LinkNoType.TD.json", + "filename": "LinkNoType.TM.json", "line": 9, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNonJsonFile.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNonJsonFile.json index a1c9453547..16f5bd7cdd 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNonJsonFile.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNonJsonFile.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/LinkNonJsonFile.TD.json" ], + "thingFiles": [ "invalidAioBinding/LinkNonJsonFile.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "LinkNonJsonFile.TD.json", + "filename": "LinkNonJsonFile.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNonexistentFile.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNonexistentFile.json index 50b167da0e..b8acb356e6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNonexistentFile.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNonexistentFile.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/LinkNonexistentFile.TD.json" ], + "thingFiles": [ "invalidAioBinding/LinkNonexistentFile.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ItemNotFound", - "filename": "LinkNonexistentFile.TD.json", + "filename": "LinkNonexistentFile.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkTypeNotJson.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkTypeNotJson.json index cd9aa78052..226c81277e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkTypeNotJson.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkTypeNotJson.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/LinkTypeNotJson.TD.json" ], + "thingFiles": [ "invalidAioBinding/LinkTypeNotJson.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "LinkTypeNotJson.TD.json", + "filename": "LinkTypeNotJson.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkUnsupportedProperty.json index 36a7b8069b..562aad7999 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkUnsupportedProperty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/LinkUnsupportedProperty.TD.json" ], + "thingFiles": [ "invalidAioBinding/LinkUnsupportedProperty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "LinkUnsupportedProperty.TD.json", + "filename": "LinkUnsupportedProperty.TM.json", "line": 13, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingColon.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingColon.json index 5d8388e896..4d61d15081 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingColon.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingColon.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidJson/MissingColon.TD.json" ], + "thingFiles": [ "invalidJson/MissingColon.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "MissingColon.TD.json", + "filename": "MissingColon.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingComma.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingComma.json index 719e80050b..4a4294d0d4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingComma.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingComma.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidJson/MissingComma.TD.json" ], + "thingFiles": [ "invalidJson/MissingComma.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "MissingComma.TD.json", + "filename": "MissingComma.TM.json", "line": 13, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingElement.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingElement.json index 109bef61d2..077768d520 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingElement.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingElement.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidJson/MissingElement.TD.json" ], + "thingFiles": [ "invalidJson/MissingElement.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "MissingElement.TD.json", + "filename": "MissingElement.TM.json", "line": 9, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingKey.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingKey.json index 1e5906472a..3677d60641 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingKey.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingKey.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidJson/MissingKey.TD.json" ], + "thingFiles": [ "invalidJson/MissingKey.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "MissingKey.TD.json", + "filename": "MissingKey.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingValue.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingValue.json index 7716c801e1..a8c505bb73 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingValue.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingValue.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidJson/MissingValue.TD.json" ], + "thingFiles": [ "invalidJson/MissingValue.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "MissingValue.TD.json", + "filename": "MissingValue.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MultipleLinks.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MultipleLinks.json index e2b710f722..868238fa78 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MultipleLinks.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MultipleLinks.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/MultipleLinks.TD.json" ], + "thingFiles": [ "invalidAioBinding/MultipleLinks.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Duplication", - "filename": "MultipleLinks.TD.json", + "filename": "MultipleLinks.TM.json", "line": 8, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoClientOrServer.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoClientOrServer.json index 169bb79419..920bc475eb 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoClientOrServer.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoClientOrServer.json @@ -1,7 +1,7 @@ { "success": false, "commandLine": { - "thingFiles": [ "valid/OneAction.TD.json" ], + "thingFiles": [ "valid/OneAction.TM.json" ], "schemas": [], "lang": "none", "clientOnly": true, diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoContext.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoContext.json index d535df67aa..32dfafac56 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoContext.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoContext.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/NoContext.TD.json" ], + "thingFiles": [ "invalidThing/NoContext.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", - "filename": "NoContext.TD.json", + "filename": "NoContext.TM.json", "line": 0, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoTitle.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoTitle.json index 64929e454a..dbfa42acef 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoTitle.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoTitle.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/NoTitle.TD.json" ], + "thingFiles": [ "invalidAioBinding/NoTitle.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", - "filename": "NoTitle.TD.json", + "filename": "NoTitle.TM.json", "line": 0, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoType.json index d1e5fd9ddf..d926b8c881 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoType.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/NoType.TD.json" ], + "thingFiles": [ "invalidThing/NoType.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", - "filename": "NoType.TD.json", + "filename": "NoType.TM.json", "line": 0, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NonexistentThing.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NonexistentThing.json index d249de399b..190986f31c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NonexistentThing.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NonexistentThing.json @@ -1,7 +1,7 @@ { "success": false, "commandLine": { - "thingFiles": [ "nothing/Nonexistent.TD.json" ], + "thingFiles": [ "nothing/Nonexistent.TM.json" ], "schemas": [], "lang": "none" }, diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NumericKey.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NumericKey.json index e43a719067..00719604dc 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NumericKey.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NumericKey.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidJson/NumericKey.TD.json" ], + "thingFiles": [ "invalidJson/NumericKey.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "NumericKey.TD.json", + "filename": "NumericKey.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ObjectKey.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ObjectKey.json index dad0eeba36..19023c37db 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ObjectKey.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ObjectKey.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidJson/ObjectKey.TD.json" ], + "thingFiles": [ "invalidJson/ObjectKey.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "ObjectKey.TD.json", + "filename": "ObjectKey.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyBooleanConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyBooleanConst.json index 9a54885b73..2e63500bde 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyBooleanConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyBooleanConst.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyBooleanConst.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyBooleanConst.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "PropertyBooleanConst.TD.json", + "filename": "PropertyBooleanConst.TM.json", "line": 13, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeEmpty.json index a941b783f6..ab5cfd4119 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeEmpty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseContentTypeEmpty.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseContentTypeEmpty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyEmpty", - "filename": "PropertyFormAdditionalResponseContentTypeEmpty.TD.json", + "filename": "PropertyFormAdditionalResponseContentTypeEmpty.TM.json", "line": 39, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeText.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeText.json index 4228c65984..2604be1fdc 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeText.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeText.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseContentTypeText.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseContentTypeText.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "PropertyFormAdditionalResponseContentTypeText.TD.json", + "filename": "PropertyFormAdditionalResponseContentTypeText.TM.json", "line": 32, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.json index df958172c6..3a629b7cc9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ItemNotFound", - "filename": "PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TD.json", + "filename": "PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TM.json", "line": 31, "cfLine": 8, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchema.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchema.json index d07ce113ff..9d90033d59 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchema.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchema.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseNoSchema.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseNoSchema.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", - "filename": "PropertyFormAdditionalResponseNoSchema.TD.json", + "filename": "PropertyFormAdditionalResponseNoSchema.TM.json", "line": 37, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchemaDefinitions.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchemaDefinitions.json index e324da79bd..1c10cff77c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchemaDefinitions.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchemaDefinitions.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseNoSchemaDefinitions.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseNoSchemaDefinitions.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ItemNotFound", - "filename": "PropertyFormAdditionalResponseNoSchemaDefinitions.TD.json", + "filename": "PropertyFormAdditionalResponseNoSchemaDefinitions.TM.json", "line": 21, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSuccess.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSuccess.json index 6c558b13af..630d0983ac 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSuccess.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSuccess.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseNoSuccess.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseNoSuccess.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", - "filename": "PropertyFormAdditionalResponseNoSuccess.TD.json", + "filename": "PropertyFormAdditionalResponseNoSuccess.TM.json", "line": 36, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionMap.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionMap.json index 50e760d0c8..844405804e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionMap.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionMap.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionMap.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionMap.TM.json" ], "lang": "none" }, "errors": [ { "condition": "TypeMismatch", - "filename": "PropertyFormAdditionalResponseSchemaDefinitionMap.TD.json", + "filename": "PropertyFormAdditionalResponseSchemaDefinitionMap.TM.json", "line": 36, "cfLine": 16, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionNotObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionNotObject.json index 74618088e4..70d8bafc6c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionNotObject.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionNotObject.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionNotObject.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionNotObject.TM.json" ], "lang": "none" }, "errors": [ { "condition": "TypeMismatch", - "filename": "PropertyFormAdditionalResponseSchemaDefinitionNotObject.TD.json", + "filename": "PropertyFormAdditionalResponseSchemaDefinitionNotObject.TM.json", "line": 38, "cfLine": 9, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaEmpty.json index 10aa74b3c6..6a5878a09a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaEmpty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseSchemaEmpty.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseSchemaEmpty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyEmpty", - "filename": "PropertyFormAdditionalResponseSchemaEmpty.TD.json", + "filename": "PropertyFormAdditionalResponseSchemaEmpty.TM.json", "line": 39, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSuccessTrue.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSuccessTrue.json index 645893a292..75a1f7ad7f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSuccessTrue.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSuccessTrue.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseSuccessTrue.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseSuccessTrue.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "PropertyFormAdditionalResponseSuccessTrue.TD.json", + "filename": "PropertyFormAdditionalResponseSuccessTrue.TM.json", "line": 37, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseUnsupportedProperty.json index 77ca2fb7bb..a8459e85f9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseUnsupportedProperty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseUnsupportedProperty.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponseUnsupportedProperty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "PropertyFormAdditionalResponseUnsupportedProperty.TD.json", + "filename": "PropertyFormAdditionalResponseUnsupportedProperty.TM.json", "line": 40, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponsesMultiple.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponsesMultiple.json index 74c3c13639..b496b4a71e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponsesMultiple.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponsesMultiple.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponsesMultiple.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormAdditionalResponsesMultiple.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ElementsPlural", - "filename": "PropertyFormAdditionalResponsesMultiple.TD.json", + "filename": "PropertyFormAdditionalResponsesMultiple.TM.json", "line": 36, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormContentTypeText.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormContentTypeText.json index 45298b1d5b..6c742c98bf 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormContentTypeText.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormContentTypeText.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormContentTypeText.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormContentTypeText.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "PropertyFormContentTypeText.TD.json", + "filename": "PropertyFormContentTypeText.TM.json", "line": 15, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderCode.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderCode.json index 522f39b011..63d54232ee 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderCode.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderCode.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormHeaderCode.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormHeaderCode.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "PropertyFormHeaderCode.TD.json", + "filename": "PropertyFormHeaderCode.TM.json", "line": 27, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderInfo.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderInfo.json index d2d68d936b..fa94ec2556 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderInfo.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderInfo.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormHeaderInfo.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormHeaderInfo.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "PropertyFormHeaderInfo.TD.json", + "filename": "PropertyFormHeaderInfo.TM.json", "line": 28, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpInvoke.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpInvoke.json index 6c1422c7b0..435f7a32e7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpInvoke.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpInvoke.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/PropertyFormOpInvoke.TD.json" ], + "thingFiles": [ "invalidThing/PropertyFormOpInvoke.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "PropertyFormOpInvoke.TD.json", + "filename": "PropertyFormOpInvoke.TM.json", "line": 17, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadAll.json index 2c911fbce8..a747aa7625 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadAll.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/PropertyFormOpReadAll.TD.json" ], + "thingFiles": [ "invalidThing/PropertyFormOpReadAll.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "PropertyFormOpReadAll.TD.json", + "filename": "PropertyFormOpReadAll.TM.json", "line": 17, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadDuplicate.json index c00cdf07fa..30f9386931 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadDuplicate.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormOpReadDuplicate.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormOpReadDuplicate.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Duplication", - "filename": "PropertyFormOpReadDuplicate.TD.json", + "filename": "PropertyFormOpReadDuplicate.TM.json", "line": 17, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpSub.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpSub.json index 55ae047c98..771db9459e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpSub.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpSub.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/PropertyFormOpSub.TD.json" ], + "thingFiles": [ "invalidThing/PropertyFormOpSub.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "PropertyFormOpSub.TD.json", + "filename": "PropertyFormOpSub.TM.json", "line": 17, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteDuplicate.json index ceb3f9fcf6..f772661ce9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteDuplicate.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormOpWriteDuplicate.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormOpWriteDuplicate.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Duplication", - "filename": "PropertyFormOpWriteDuplicate.TD.json", + "filename": "PropertyFormOpWriteDuplicate.TM.json", "line": 17, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteMulti.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteMulti.json index f159d4fc56..1cccaad4e2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteMulti.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteMulti.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/PropertyFormOpWriteMulti.TD.json" ], + "thingFiles": [ "invalidThing/PropertyFormOpWriteMulti.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "PropertyFormOpWriteMulti.TD.json", + "filename": "PropertyFormOpWriteMulti.TM.json", "line": 17, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json index e41b8e5f38..679b0be147 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Unusable", - "filename": "PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json", + "filename": "PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json", "line": 31, "cfLine": 18, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.json index b2e60ab000..d11a6f6051 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Unusable", - "filename": "PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TD.json", + "filename": "PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TM.json", "line": 14, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json index 4adcf2fa66..d407dd3e10 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Unusable", - "filename": "PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json", + "filename": "PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json", "line": 31, "cfLine": 19, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicAndNoRootFormReadAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicAndNoRootFormReadAll.json index ef2adff60b..3a6007013a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicAndNoRootFormReadAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicAndNoRootFormReadAll.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormReadWithoutTopicAndNoRootFormReadAll.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormReadWithoutTopicAndNoRootFormReadAll.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Unusable", - "filename": "PropertyFormReadWithoutTopicAndNoRootFormReadAll.TD.json", + "filename": "PropertyFormReadWithoutTopicAndNoRootFormReadAll.TM.json", "line": 14, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.json index 651ee1194b..96241db2f5 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TD.json", + "filename": "PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TM.json", "line": 25, "cfLine": 20, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormServiceGroup.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormServiceGroup.json index d093114ad0..c1c318ba17 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormServiceGroup.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormServiceGroup.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormServiceGroup.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormServiceGroup.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "PropertyFormServiceGroup.TD.json", + "filename": "PropertyFormServiceGroup.TM.json", "line": 18, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicNoContentType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicNoContentType.json index 351a50046e..09c5d3ad29 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicNoContentType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicNoContentType.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormTopicNoContentType.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormTopicNoContentType.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "PropertyFormTopicNoContentType.TD.json", + "filename": "PropertyFormTopicNoContentType.TM.json", "line": 14, "cfLine": 15, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenExecutorId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenExecutorId.json index ea5a26b5ed..1330a8f961 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenExecutorId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenExecutorId.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormTopicTokenExecutorId.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormTopicTokenExecutorId.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "PropertyFormTopicTokenExecutorId.TD.json", + "filename": "PropertyFormTopicTokenExecutorId.TM.json", "line": 16, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenInvokerId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenInvokerId.json index 4a803de358..0f33856a8a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenInvokerId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenInvokerId.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormTopicTokenInvokerId.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormTopicTokenInvokerId.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "PropertyFormTopicTokenInvokerId.TD.json", + "filename": "PropertyFormTopicTokenInvokerId.TM.json", "line": 16, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.json index e2183b1667..f52106d714 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TD.json", + "filename": "PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TM.json", "line": 16, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.json index 278f470338..1251512ed1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TD.json", + "filename": "PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TM.json", "line": 17, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenReadAndWrite.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenReadAndWrite.json index 4e9781595a..5184343d25 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenReadAndWrite.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenReadAndWrite.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormTopicTokenNoActionWhenReadAndWrite.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormTopicTokenNoActionWhenReadAndWrite.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "PropertyFormTopicTokenNoActionWhenReadAndWrite.TD.json", + "filename": "PropertyFormTopicTokenNoActionWhenReadAndWrite.TM.json", "line": 16, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenSenderId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenSenderId.json index 4f6a7b7539..d4d12cc9dc 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenSenderId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenSenderId.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormTopicTokenSenderId.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormTopicTokenSenderId.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "PropertyFormTopicTokenSenderId.TD.json", + "filename": "PropertyFormTopicTokenSenderId.TM.json", "line": 16, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormUnsupportedProperty.json index 7cc25ff602..1abfc0f943 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormUnsupportedProperty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormUnsupportedProperty.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormUnsupportedProperty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "PropertyFormUnsupportedProperty.TD.json", + "filename": "PropertyFormUnsupportedProperty.TM.json", "line": 18, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.json index cd95e66680..127fb03c7d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Unusable", - "filename": "PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TD.json", + "filename": "PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TM.json", "line": 51, "cfLine": 29, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.json index 0b6f6380a1..b4b3035428 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Unusable", - "filename": "PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TD.json", + "filename": "PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TM.json", "line": 19, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsEmpty.json index ff8a362bd5..934ff31e4c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsEmpty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/PropertyFormsEmpty.TD.json" ], + "thingFiles": [ "invalidThing/PropertyFormsEmpty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ElementMissing", - "filename": "PropertyFormsEmpty.TD.json", + "filename": "PropertyFormsEmpty.TM.json", "line": 13, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpReadDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpReadDuplicate.json index 188172153e..10ffbd93c3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpReadDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpReadDuplicate.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormsOpReadDuplicate.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormsOpReadDuplicate.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Duplication", - "filename": "PropertyFormsOpReadDuplicate.TD.json", + "filename": "PropertyFormsOpReadDuplicate.TM.json", "line": 17, "cfLine": 22, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteDuplicate.json index 1301579834..0053001bb6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteDuplicate.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormsOpWriteDuplicate.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormsOpWriteDuplicate.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Duplication", - "filename": "PropertyFormsOpWriteDuplicate.TD.json", + "filename": "PropertyFormsOpWriteDuplicate.TM.json", "line": 17, "cfLine": 22, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteNoRead.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteNoRead.json index f5711d1f4e..4506910ec7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteNoRead.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteNoRead.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormsOpWriteNoRead.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormsOpWriteNoRead.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "PropertyFormsOpWriteNoRead.TD.json", + "filename": "PropertyFormsOpWriteNoRead.TM.json", "line": 17, "cfLine": 13, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessAndRead.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessAndRead.json index e2ddd56c78..fba10f63bc 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessAndRead.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessAndRead.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormsOplessAndRead.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormsOplessAndRead.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "PropertyFormsOplessAndRead.TD.json", + "filename": "PropertyFormsOplessAndRead.TM.json", "line": 19, "cfLine": 13, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessDuplicate.json index 8ae9382ca1..ad1321b538 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessDuplicate.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyFormsOplessDuplicate.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyFormsOplessDuplicate.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "PropertyFormsOplessDuplicate.TD.json", + "filename": "PropertyFormsOplessDuplicate.TM.json", "line": 14, "cfLine": 13, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyIntegerConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyIntegerConst.json index ebf88a999c..6b509781f8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyIntegerConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyIntegerConst.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyIntegerConst.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyIntegerConst.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "PropertyIntegerConst.TD.json", + "filename": "PropertyIntegerConst.TM.json", "line": 13, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNoForms.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNoForms.json index 01524d5886..19e8ecb28e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNoForms.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNoForms.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyNoForms.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyNoForms.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Unusable", - "filename": "PropertyNoForms.TD.json", + "filename": "PropertyNoForms.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNumberConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNumberConst.json index 4579d0786b..c9bc60d954 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNumberConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNumberConst.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyNumberConst.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyNumberConst.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "PropertyNumberConst.TD.json", + "filename": "PropertyNumberConst.TM.json", "line": 13, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyObjectConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyObjectConst.json index 78fd69b433..558cfde79a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyObjectConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyObjectConst.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyObjectConst.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyObjectConst.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "PropertyObjectConst.TD.json", + "filename": "PropertyObjectConst.TM.json", "line": 18, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyObjectErrorMessage.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyObjectErrorMessage.json index 26be392754..0504370232 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyObjectErrorMessage.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyObjectErrorMessage.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyObjectErrorMessage.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyObjectErrorMessage.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "PropertyObjectErrorMessage.TD.json", + "filename": "PropertyObjectErrorMessage.TM.json", "line": 18, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyStringConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyStringConst.json index 1454e5ba0e..6fefcabf27 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyStringConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyStringConst.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyStringConst.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyStringConst.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "PropertyStringConst.TD.json", + "filename": "PropertyStringConst.TM.json", "line": 13, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyTypeNull.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyTypeNull.json index 03aabbec64..9500c0a77b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyTypeNull.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyTypeNull.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyTypeNull.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyTypeNull.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "PropertyTypeNull.TD.json", + "filename": "PropertyTypeNull.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyUnsupportedProperty.json index 450193cdf3..3b1775e6e2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyUnsupportedProperty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/PropertyUnsupportedProperty.TD.json" ], + "thingFiles": [ "invalidAioBinding/PropertyUnsupportedProperty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "PropertyUnsupportedProperty.TD.json", + "filename": "PropertyUnsupportedProperty.TM.json", "line": 20, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeEmpty.json index acd70e8412..a2165b5a57 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeEmpty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormAdditionalResponseContentTypeEmpty.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormAdditionalResponseContentTypeEmpty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyEmpty", - "filename": "RootFormAdditionalResponseContentTypeEmpty.TD.json", + "filename": "RootFormAdditionalResponseContentTypeEmpty.TM.json", "line": 14, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeText.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeText.json index 9b858c9271..c1aebe8e0f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeText.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeText.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormAdditionalResponseContentTypeText.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormAdditionalResponseContentTypeText.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "RootFormAdditionalResponseContentTypeText.TD.json", + "filename": "RootFormAdditionalResponseContentTypeText.TM.json", "line": 14, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseNoSuccess.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseNoSuccess.json index c86f468ee4..1f22fdacc8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseNoSuccess.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseNoSuccess.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormAdditionalResponseNoSuccess.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormAdditionalResponseNoSuccess.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", - "filename": "RootFormAdditionalResponseNoSuccess.TD.json", + "filename": "RootFormAdditionalResponseNoSuccess.TM.json", "line": 13, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSchema.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSchema.json index b9d22bcdba..6a8a31f6f4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSchema.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSchema.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormAdditionalResponseSchema.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormAdditionalResponseSchema.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "RootFormAdditionalResponseSchema.TD.json", + "filename": "RootFormAdditionalResponseSchema.TM.json", "line": 21, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSuccessTrue.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSuccessTrue.json index 7868e41384..2f3712635f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSuccessTrue.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSuccessTrue.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormAdditionalResponseSuccessTrue.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormAdditionalResponseSuccessTrue.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "RootFormAdditionalResponseSuccessTrue.TD.json", + "filename": "RootFormAdditionalResponseSuccessTrue.TM.json", "line": 15, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseUnsupportedProperty.json index b05d1f8abe..81412c6d5a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseUnsupportedProperty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormAdditionalResponseUnsupportedProperty.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormAdditionalResponseUnsupportedProperty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "RootFormAdditionalResponseUnsupportedProperty.TD.json", + "filename": "RootFormAdditionalResponseUnsupportedProperty.TM.json", "line": 16, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesAndSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesAndSubAll.json index 73999e7e2d..0785b227c5 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesAndSubAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesAndSubAll.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormAdditionalResponsesAndSubAll.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormAdditionalResponsesAndSubAll.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "RootFormAdditionalResponsesAndSubAll.TD.json", + "filename": "RootFormAdditionalResponsesAndSubAll.TM.json", "line": 12, "cfLine": 17, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesMultiple.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesMultiple.json index 3cbdee72df..8c51a8cf5d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesMultiple.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesMultiple.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormAdditionalResponsesMultiple.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormAdditionalResponsesMultiple.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ElementsPlural", - "filename": "RootFormAdditionalResponsesMultiple.TD.json", + "filename": "RootFormAdditionalResponsesMultiple.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeCustom.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeCustom.json index eb1cdbd790..6796de2aa9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeCustom.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeCustom.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormContentTypeCustom.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormContentTypeCustom.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "RootFormContentTypeCustom.TD.json", + "filename": "RootFormContentTypeCustom.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeRaw.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeRaw.json index 42494fe027..ef08a2fe3f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeRaw.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeRaw.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormContentTypeRaw.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormContentTypeRaw.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "RootFormContentTypeRaw.TD.json", + "filename": "RootFormContentTypeRaw.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeText.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeText.json index 8ab5df490b..c20c4a082e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeText.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeText.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormContentTypeText.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormContentTypeText.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "RootFormContentTypeText.TD.json", + "filename": "RootFormContentTypeText.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderCode.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderCode.json index 5e71309674..6b42fbda97 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderCode.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderCode.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormHeaderCode.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormHeaderCode.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "RootFormHeaderCode.TD.json", + "filename": "RootFormHeaderCode.TM.json", "line": 21, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderInfo.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderInfo.json index f5960b3093..21e21a3ded 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderInfo.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderInfo.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormHeaderInfo.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormHeaderInfo.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "RootFormHeaderInfo.TD.json", + "filename": "RootFormHeaderInfo.TM.json", "line": 21, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoContentType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoContentType.json index 64c56fb405..6d5d9b7365 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoContentType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoContentType.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormNoContentType.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormNoContentType.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "RootFormNoContentType.TD.json", + "filename": "RootFormNoContentType.TM.json", "line": 9, "cfLine": 10, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoOp.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoOp.json index 6ed696f8c2..166fa050ce 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoOp.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoOp.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/RootFormNoOp.TD.json" ], + "thingFiles": [ "invalidThing/RootFormNoOp.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", - "filename": "RootFormNoOp.TD.json", + "filename": "RootFormNoOp.TM.json", "line": 9, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoTopic.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoTopic.json index 373fa0a11c..3fc4ae7bc7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoTopic.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoTopic.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormNoTopic.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormNoTopic.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", - "filename": "RootFormNoTopic.TD.json", + "filename": "RootFormNoTopic.TM.json", "line": 9, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpArrayEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpArrayEmpty.json index 8e105afae1..de837ebdb7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpArrayEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpArrayEmpty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/RootFormOpArrayEmpty.TD.json" ], + "thingFiles": [ "invalidThing/RootFormOpArrayEmpty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ElementMissing", - "filename": "RootFormOpArrayEmpty.TD.json", + "filename": "RootFormOpArrayEmpty.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpElementEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpElementEmpty.json index caf25022cb..aee528f464 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpElementEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpElementEmpty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/RootFormOpElementEmpty.TD.json" ], + "thingFiles": [ "invalidThing/RootFormOpElementEmpty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyEmpty", - "filename": "RootFormOpElementEmpty.TD.json", + "filename": "RootFormOpElementEmpty.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpEmpty.json index 0f2bcf27f5..a5a30175c8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpEmpty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/RootFormOpEmpty.TD.json" ], + "thingFiles": [ "invalidThing/RootFormOpEmpty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyEmpty", - "filename": "RootFormOpEmpty.TD.json", + "filename": "RootFormOpEmpty.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllAndSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllAndSubAll.json index fa2813e707..211d94e04d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllAndSubAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllAndSubAll.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormOpReadAllAndSubAll.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormOpReadAllAndSubAll.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "RootFormOpReadAllAndSubAll.TD.json", + "filename": "RootFormOpReadAllAndSubAll.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllDuplicate.json index 0a9d2eb831..81abc48bc9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllDuplicate.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormOpReadAllDuplicate.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormOpReadAllDuplicate.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Duplication", - "filename": "RootFormOpReadAllDuplicate.TD.json", + "filename": "RootFormOpReadAllDuplicate.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadOne.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadOne.json index 74fe8a0369..b6d254d10f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadOne.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadOne.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/RootFormOpReadOne.TD.json" ], + "thingFiles": [ "invalidThing/RootFormOpReadOne.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "RootFormOpReadOne.TD.json", + "filename": "RootFormOpReadOne.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubAllDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubAllDuplicate.json index 168e85b0ec..2e23f88d2f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubAllDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubAllDuplicate.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormOpSubAllDuplicate.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormOpSubAllDuplicate.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Duplication", - "filename": "RootFormOpSubAllDuplicate.TD.json", + "filename": "RootFormOpSubAllDuplicate.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubOne.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubOne.json index caf25022cb..aee528f464 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubOne.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubOne.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/RootFormOpElementEmpty.TD.json" ], + "thingFiles": [ "invalidThing/RootFormOpElementEmpty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyEmpty", - "filename": "RootFormOpElementEmpty.TD.json", + "filename": "RootFormOpElementEmpty.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWiteMultiAndSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWiteMultiAndSubAll.json index 392b995dae..6b27af3e83 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWiteMultiAndSubAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWiteMultiAndSubAll.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormOpWiteMultiAndSubAll.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormOpWiteMultiAndSubAll.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "RootFormOpWiteMultiAndSubAll.TD.json", + "filename": "RootFormOpWiteMultiAndSubAll.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteMultiDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteMultiDuplicate.json index aa0852fb48..332a07a471 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteMultiDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteMultiDuplicate.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormOpWriteMultiDuplicate.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormOpWriteMultiDuplicate.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Duplication", - "filename": "RootFormOpWriteMultiDuplicate.TD.json", + "filename": "RootFormOpWriteMultiDuplicate.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteOne.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteOne.json index caf25022cb..aee528f464 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteOne.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteOne.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/RootFormOpElementEmpty.TD.json" ], + "thingFiles": [ "invalidThing/RootFormOpElementEmpty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyEmpty", - "filename": "RootFormOpElementEmpty.TD.json", + "filename": "RootFormOpElementEmpty.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormReadAllButNoProperties.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormReadAllButNoProperties.json index 1675d47ae7..7194248935 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormReadAllButNoProperties.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormReadAllButNoProperties.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormReadAllButNoProperties.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormReadAllButNoProperties.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Unusable", - "filename": "RootFormReadAllButNoProperties.TD.json", + "filename": "RootFormReadAllButNoProperties.TM.json", "line": 12, "cfLine": 17, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupEmpty.json index 8c9604e0ae..cae9eedb9d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupEmpty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormServiceGroupEmpty.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormServiceGroupEmpty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyEmpty", - "filename": "RootFormServiceGroupEmpty.TD.json", + "filename": "RootFormServiceGroupEmpty.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupNoSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupNoSubAll.json index 0d7c50b8b5..9df342bcb1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupNoSubAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupNoSubAll.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormServiceGroupNoSubAll.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormServiceGroupNoSubAll.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "RootFormServiceGroupNoSubAll.TD.json", + "filename": "RootFormServiceGroupNoSubAll.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormSubAllButNoEvents.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormSubAllButNoEvents.json index e09d204f04..1cc129b7ee 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormSubAllButNoEvents.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormSubAllButNoEvents.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormSubAllButNoEvents.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormSubAllButNoEvents.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Unusable", - "filename": "RootFormSubAllButNoEvents.TD.json", + "filename": "RootFormSubAllButNoEvents.TM.json", "line": 12, "cfLine": 19, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicEmpty.json index fbc5f4a9ae..a03dbf6f57 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicEmpty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormTopicEmpty.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormTopicEmpty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyEmpty", - "filename": "RootFormTopicEmpty.TD.json", + "filename": "RootFormTopicEmpty.TM.json", "line": 10, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelEmpty.json index cb661ed46b..6a41dbe6d4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelEmpty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormTopicLevelEmpty.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormTopicLevelEmpty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "RootFormTopicLevelEmpty.TD.json", + "filename": "RootFormTopicLevelEmpty.TM.json", "line": 10, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelInvalid.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelInvalid.json index a77c5d622f..cc290ec300 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelInvalid.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelInvalid.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormTopicLevelInvalid.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormTopicLevelInvalid.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "RootFormTopicLevelInvalid.TD.json", + "filename": "RootFormTopicLevelInvalid.TM.json", "line": 10, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicReservedStart.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicReservedStart.json index 8657956f6f..833ad46d1d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicReservedStart.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicReservedStart.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormTopicReservedStart.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormTopicReservedStart.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "RootFormTopicReservedStart.TD.json", + "filename": "RootFormTopicReservedStart.TM.json", "line": 10, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenActionWhenSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenActionWhenSubAll.json index 89205e5c92..1c65a69715 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenActionWhenSubAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenActionWhenSubAll.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormTopicTokenActionWhenSubAll.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormTopicTokenActionWhenSubAll.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "RootFormTopicTokenActionWhenSubAll.TD.json", + "filename": "RootFormTopicTokenActionWhenSubAll.TM.json", "line": 10, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenConsumerIdWhenSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenConsumerIdWhenSubAll.json index 100d6c3a5f..938b44c838 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenConsumerIdWhenSubAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenConsumerIdWhenSubAll.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormTopicTokenConsumerIdWhenSubAll.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormTopicTokenConsumerIdWhenSubAll.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "RootFormTopicTokenConsumerIdWhenSubAll.TD.json", + "filename": "RootFormTopicTokenConsumerIdWhenSubAll.TM.json", "line": 10, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomEmpty.json index 561237177e..d7a8b61dbb 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomEmpty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormTopicTokenCustomEmpty.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormTopicTokenCustomEmpty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "RootFormTopicTokenCustomEmpty.TD.json", + "filename": "RootFormTopicTokenCustomEmpty.TM.json", "line": 10, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomInvalid.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomInvalid.json index fcfb56d9c5..996cd5c00c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomInvalid.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomInvalid.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormTopicTokenCustomInvalid.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormTopicTokenCustomInvalid.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "RootFormTopicTokenCustomInvalid.TD.json", + "filename": "RootFormTopicTokenCustomInvalid.TM.json", "line": 10, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenEmpty.json index 8923038cd7..2c3f4398ca 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenEmpty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormTopicTokenEmpty.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormTopicTokenEmpty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "RootFormTopicTokenEmpty.TD.json", + "filename": "RootFormTopicTokenEmpty.TM.json", "line": 10, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenExecutorId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenExecutorId.json index 819ca4fa1b..27849a22f7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenExecutorId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenExecutorId.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormTopicTokenExecutorId.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormTopicTokenExecutorId.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "RootFormTopicTokenExecutorId.TD.json", + "filename": "RootFormTopicTokenExecutorId.TM.json", "line": 10, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenInvokerId.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenInvokerId.json index c2569cf136..1f18c38bfc 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenInvokerId.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenInvokerId.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormTopicTokenInvokerId.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormTopicTokenInvokerId.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "RootFormTopicTokenInvokerId.TD.json", + "filename": "RootFormTopicTokenInvokerId.TM.json", "line": 10, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenMaintainerIdWhenSubAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenMaintainerIdWhenSubAll.json index ebef70b40c..31798bc3ef 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenMaintainerIdWhenSubAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenMaintainerIdWhenSubAll.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormTopicTokenMaintainerIdWhenSubAll.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormTopicTokenMaintainerIdWhenSubAll.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "RootFormTopicTokenMaintainerIdWhenSubAll.TD.json", + "filename": "RootFormTopicTokenMaintainerIdWhenSubAll.TM.json", "line": 10, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.json index d083fbf0cf..126c481af2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TD.json", + "filename": "RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TM.json", "line": 10, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenReadAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenReadAll.json index 4e4ddb0f12..180ca30609 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenReadAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenReadAll.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormTopicTokenSenderIdWhenReadAll.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormTopicTokenSenderIdWhenReadAll.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "RootFormTopicTokenSenderIdWhenReadAll.TD.json", + "filename": "RootFormTopicTokenSenderIdWhenReadAll.TM.json", "line": 10, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenWriteMulti.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenWriteMulti.json index 744ec9d53a..f3bfc67154 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenWriteMulti.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenWriteMulti.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormTopicTokenSenderIdWhenWriteMulti.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormTopicTokenSenderIdWhenWriteMulti.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "RootFormTopicTokenSenderIdWhenWriteMulti.TD.json", + "filename": "RootFormTopicTokenSenderIdWhenWriteMulti.TM.json", "line": 10, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenUnrecognized.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenUnrecognized.json index b5114b6938..00f26381cb 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenUnrecognized.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenUnrecognized.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormTopicTokenUnrecognized.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormTopicTokenUnrecognized.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "RootFormTopicTokenUnrecognized.TD.json", + "filename": "RootFormTopicTokenUnrecognized.TM.json", "line": 10, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormWriteMultiButNoWritableProperties.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormWriteMultiButNoWritableProperties.json index 4a1a328187..d7bfd2a91e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormWriteMultiButNoWritableProperties.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormWriteMultiButNoWritableProperties.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormWriteMultiButNoWritableProperties.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormWriteMultiButNoWritableProperties.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Unusable", - "filename": "RootFormWriteMultiButNoWritableProperties.TD.json", + "filename": "RootFormWriteMultiButNoWritableProperties.TM.json", "line": 17, "cfLine": 22, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsEmpty.json index 5027efd654..3fec6c6cff 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsEmpty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/RootFormsEmpty.TD.json" ], + "thingFiles": [ "invalidThing/RootFormsEmpty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ElementMissing", - "filename": "RootFormsEmpty.TD.json", + "filename": "RootFormsEmpty.TM.json", "line": 8, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpReadAllDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpReadAllDuplicate.json index 4d9b6277a8..b1eba36f55 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpReadAllDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpReadAllDuplicate.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormsOpReadAllDuplicate.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormsOpReadAllDuplicate.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Duplication", - "filename": "RootFormsOpReadAllDuplicate.TD.json", + "filename": "RootFormsOpReadAllDuplicate.TM.json", "line": 12, "cfLine": 17, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpSubAllDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpSubAllDuplicate.json index 42ed347449..11b2c6e322 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpSubAllDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpSubAllDuplicate.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormsOpSubAllDuplicate.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormsOpSubAllDuplicate.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Duplication", - "filename": "RootFormsOpSubAllDuplicate.TD.json", + "filename": "RootFormsOpSubAllDuplicate.TM.json", "line": 12, "cfLine": 17, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiDuplicate.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiDuplicate.json index e9760dbb80..c70442ec85 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiDuplicate.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiDuplicate.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormsOpWriteMultiDuplicate.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormsOpWriteMultiDuplicate.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Duplication", - "filename": "RootFormsOpWriteMultiDuplicate.TD.json", + "filename": "RootFormsOpWriteMultiDuplicate.TM.json", "line": 12, "cfLine": 17, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiNoReadAll.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiNoReadAll.json index 5533844873..a3b28003e4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiNoReadAll.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiNoReadAll.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/RootFormsOpWriteMultiNoReadAll.TD.json" ], + "thingFiles": [ "invalidAioBinding/RootFormsOpWriteMultiNoReadAll.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "RootFormsOpWriteMultiNoReadAll.TD.json", + "filename": "RootFormsOpWriteMultiNoReadAll.TM.json", "line": 12, "cfLine": 8, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayConst.json index a45a30713d..cc0b65c728 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayConst.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionArrayConst.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionArrayConst.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "SchemaDefinitionArrayConst.TD.json", + "filename": "SchemaDefinitionArrayConst.TM.json", "line": 14, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsNoType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsNoType.json index 489ddec266..568d982d6b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsNoType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsNoType.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionArrayItemsNoType.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionArrayItemsNoType.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", - "filename": "SchemaDefinitionArrayItemsNoType.TD.json", + "filename": "SchemaDefinitionArrayItemsNoType.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsNotObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsNotObject.json index 9576a43c5e..b9cf4c9193 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsNotObject.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsNotObject.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/SchemaDefinitionArrayItemsNotObject.TD.json" ], + "thingFiles": [ "invalidThing/SchemaDefinitionArrayItemsNotObject.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "SchemaDefinitionArrayItemsNotObject.TD.json", + "filename": "SchemaDefinitionArrayItemsNotObject.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsObjectConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsObjectConst.json index 8cd9a856d0..2359b7a916 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsObjectConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsObjectConst.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionArrayItemsObjectConst.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionArrayItemsObjectConst.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionArrayItemsObjectConst.TD.json", + "filename": "SchemaDefinitionArrayItemsObjectConst.TM.json", "line": 18, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsRef.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsRef.json index b0bae0d56b..68248154c6 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsRef.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsRef.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionArrayItemsRef.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionArrayItemsRef.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionArrayItemsRef.TD.json", + "filename": "SchemaDefinitionArrayItemsRef.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsStringConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsStringConst.json index 294bed72a6..59e1a2a1b1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsStringConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsStringConst.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionArrayItemsStringConst.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionArrayItemsStringConst.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionArrayItemsStringConst.TD.json", + "filename": "SchemaDefinitionArrayItemsStringConst.TM.json", "line": 13, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeNotString.json index dd6a4c831d..cdb42a47fc 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeNotString.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeNotString.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/SchemaDefinitionArrayItemsTypeNotString.TD.json" ], + "thingFiles": [ "invalidThing/SchemaDefinitionArrayItemsTypeNotString.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "SchemaDefinitionArrayItemsTypeNotString.TD.json", + "filename": "SchemaDefinitionArrayItemsTypeNotString.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeNull.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeNull.json index 0146f78146..4bd0cc583e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeNull.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeNull.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionArrayItemsTypeNull.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionArrayItemsTypeNull.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "SchemaDefinitionArrayItemsTypeNull.TD.json", + "filename": "SchemaDefinitionArrayItemsTypeNull.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeUnsupported.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeUnsupported.json index c5db6b59be..0ad6ccb0d5 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeUnsupported.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeUnsupported.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/SchemaDefinitionArrayItemsTypeUnsupported.TD.json" ], + "thingFiles": [ "invalidThing/SchemaDefinitionArrayItemsTypeUnsupported.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "SchemaDefinitionArrayItemsTypeUnsupported.TD.json", + "filename": "SchemaDefinitionArrayItemsTypeUnsupported.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayNoItems.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayNoItems.json index 24c0d52bac..0db2c20603 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayNoItems.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayNoItems.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionArrayNoItems.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionArrayNoItems.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", - "filename": "SchemaDefinitionArrayNoItems.TD.json", + "filename": "SchemaDefinitionArrayNoItems.TM.json", "line": 9, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanConstValueNotBoolean.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanConstValueNotBoolean.json index 0bd99cea87..09e31ed714 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanConstValueNotBoolean.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanConstValueNotBoolean.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionBooleanConstValueNotBoolean.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionBooleanConstValueNotBoolean.TM.json" ], "lang": "none" }, "errors": [ { "condition": "TypeMismatch", - "filename": "SchemaDefinitionBooleanConstValueNotBoolean.TD.json", + "filename": "SchemaDefinitionBooleanConstValueNotBoolean.TM.json", "line": 11, "cfLine": 10, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanReadOnly.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanReadOnly.json index 32c0c43eaf..63ae803380 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanReadOnly.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanReadOnly.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionBooleanReadOnly.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionBooleanReadOnly.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionBooleanReadOnly.TD.json", + "filename": "SchemaDefinitionBooleanReadOnly.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanUnsupportedProperty.json index 2c793f4c67..1646c2cc9c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanUnsupportedProperty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionBooleanUnsupportedProperty.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionBooleanUnsupportedProperty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionBooleanUnsupportedProperty.TD.json", + "filename": "SchemaDefinitionBooleanUnsupportedProperty.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueAboveMax.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueAboveMax.json index a63ed71692..7074ec2d6b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueAboveMax.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueAboveMax.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionIntegerConstValueAboveMax.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionIntegerConstValueAboveMax.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "SchemaDefinitionIntegerConstValueAboveMax.TD.json", + "filename": "SchemaDefinitionIntegerConstValueAboveMax.TM.json", "line": 12, "cfLine": 11, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueBelowMin.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueBelowMin.json index 1e2dd118ca..8f60b2adda 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueBelowMin.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueBelowMin.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionIntegerConstValueBelowMin.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionIntegerConstValueBelowMin.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "SchemaDefinitionIntegerConstValueBelowMin.TD.json", + "filename": "SchemaDefinitionIntegerConstValueBelowMin.TM.json", "line": 12, "cfLine": 11, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueNotInteger.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueNotInteger.json index e85b312ba2..425756cbea 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueNotInteger.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueNotInteger.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionIntegerConstValueNotInteger.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionIntegerConstValueNotInteger.TM.json" ], "lang": "none" }, "errors": [ { "condition": "TypeMismatch", - "filename": "SchemaDefinitionIntegerConstValueNotInteger.TD.json", + "filename": "SchemaDefinitionIntegerConstValueNotInteger.TM.json", "line": 11, "cfLine": 10, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueNotNumeric.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueNotNumeric.json index ce1efd8ea6..9f620c04f2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueNotNumeric.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueNotNumeric.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionIntegerConstValueNotNumeric.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionIntegerConstValueNotNumeric.TM.json" ], "lang": "none" }, "errors": [ { "condition": "TypeMismatch", - "filename": "SchemaDefinitionIntegerConstValueNotNumeric.TD.json", + "filename": "SchemaDefinitionIntegerConstValueNotNumeric.TM.json", "line": 11, "cfLine": 10, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMaxNotInteger.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMaxNotInteger.json index ebb7105e72..65b3ca95e2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMaxNotInteger.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMaxNotInteger.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionIntegerMaxNotInteger.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionIntegerMaxNotInteger.TM.json" ], "lang": "none" }, "errors": [ { "condition": "TypeMismatch", - "filename": "SchemaDefinitionIntegerMaxNotInteger.TD.json", + "filename": "SchemaDefinitionIntegerMaxNotInteger.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMaxNotNumeric.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMaxNotNumeric.json index e96207f5ec..88e8ddf142 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMaxNotNumeric.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMaxNotNumeric.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/SchemaDefinitionIntegerMaxNotNumeric.TD.json" ], + "thingFiles": [ "invalidThing/SchemaDefinitionIntegerMaxNotNumeric.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "SchemaDefinitionIntegerMaxNotNumeric.TD.json", + "filename": "SchemaDefinitionIntegerMaxNotNumeric.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinAboveMax.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinAboveMax.json index 4d5b1d5006..f2ec3ccb03 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinAboveMax.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinAboveMax.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionIntegerMinAboveMax.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionIntegerMinAboveMax.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "SchemaDefinitionIntegerMinAboveMax.TD.json", + "filename": "SchemaDefinitionIntegerMinAboveMax.TM.json", "line": 12, "cfLine": 11, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinNotInteger.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinNotInteger.json index ad543c6f11..7c050eb7da 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinNotInteger.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinNotInteger.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionIntegerMinNotInteger.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionIntegerMinNotInteger.TM.json" ], "lang": "none" }, "errors": [ { "condition": "TypeMismatch", - "filename": "SchemaDefinitionIntegerMinNotInteger.TD.json", + "filename": "SchemaDefinitionIntegerMinNotInteger.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinNotNumeric.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinNotNumeric.json index 66622b843c..d1856f7509 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinNotNumeric.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinNotNumeric.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/SchemaDefinitionIntegerMinNotNumeric.TD.json" ], + "thingFiles": [ "invalidThing/SchemaDefinitionIntegerMinNotNumeric.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "SchemaDefinitionIntegerMinNotNumeric.TD.json", + "filename": "SchemaDefinitionIntegerMinNotNumeric.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerReadOnly.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerReadOnly.json index dcc8510e05..a29c2b8cfb 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerReadOnly.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerReadOnly.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionIntegerReadOnly.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionIntegerReadOnly.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionIntegerReadOnly.TD.json", + "filename": "SchemaDefinitionIntegerReadOnly.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerUnsupportedProperty.json index 82327cc33d..89ae70aec3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerUnsupportedProperty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionIntegerUnsupportedProperty.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionIntegerUnsupportedProperty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionIntegerUnsupportedProperty.TD.json", + "filename": "SchemaDefinitionIntegerUnsupportedProperty.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNoType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNoType.json index 0556644fd0..c5be62c74b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNoType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNoType.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesNoType.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesNoType.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", - "filename": "SchemaDefinitionMapAdditionalPropertiesNoType.TD.json", + "filename": "SchemaDefinitionMapAdditionalPropertiesNoType.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNotObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNotObject.json index 97cb7de166..eef21c0e9e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNotObject.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNotObject.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/SchemaDefinitionMapAdditionalPropertiesNotObject.TD.json" ], + "thingFiles": [ "invalidThing/SchemaDefinitionMapAdditionalPropertiesNotObject.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "SchemaDefinitionMapAdditionalPropertiesNotObject.TD.json", + "filename": "SchemaDefinitionMapAdditionalPropertiesNotObject.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesObjectConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesObjectConst.json index a2f072f752..76e7f42335 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesObjectConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesObjectConst.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesObjectConst.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesObjectConst.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionMapAdditionalPropertiesObjectConst.TD.json", + "filename": "SchemaDefinitionMapAdditionalPropertiesObjectConst.TM.json", "line": 18, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesRef.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesRef.json index 9d0865f5b2..55721955f0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesRef.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesRef.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionMapAdditionalPropertiesRef.TD.json", + "filename": "SchemaDefinitionMapAdditionalPropertiesRef.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesStringConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesStringConst.json index e46797431b..efa2a991cf 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesStringConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesStringConst.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesStringConst.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesStringConst.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionMapAdditionalPropertiesStringConst.TD.json", + "filename": "SchemaDefinitionMapAdditionalPropertiesStringConst.TM.json", "line": 13, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNotString.json index 0756476b2a..4d21f13db1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNotString.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNotString.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeNotString.TD.json" ], + "thingFiles": [ "invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeNotString.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "SchemaDefinitionMapAdditionalPropertiesTypeNotString.TD.json", + "filename": "SchemaDefinitionMapAdditionalPropertiesTypeNotString.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNull.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNull.json index 0cad0861b0..0c0ff04686 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNull.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNull.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesTypeNull.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesTypeNull.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "SchemaDefinitionMapAdditionalPropertiesTypeNull.TD.json", + "filename": "SchemaDefinitionMapAdditionalPropertiesTypeNull.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.json index 72e6ced1a8..e8891020bb 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TD.json" ], + "thingFiles": [ "invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TD.json", + "filename": "SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapConst.json index 5b581d2676..861f9dfd9f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapConst.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionMapConst.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionMapConst.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionMapConst.TD.json", + "filename": "SchemaDefinitionMapConst.TM.json", "line": 14, "cfLine": 11, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNoType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNoType.json index 613470d41f..6d3cd814a5 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNoType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNoType.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionNoType.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionNoType.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", - "filename": "SchemaDefinitionNoType.TD.json", + "filename": "SchemaDefinitionNoType.TM.json", "line": 9, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueAboveMax.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueAboveMax.json index a5314a92a0..a598289886 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueAboveMax.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueAboveMax.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionNumberConstValueAboveMax.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionNumberConstValueAboveMax.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "SchemaDefinitionNumberConstValueAboveMax.TD.json", + "filename": "SchemaDefinitionNumberConstValueAboveMax.TM.json", "line": 12, "cfLine": 11, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueBelowMin.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueBelowMin.json index d786dfb665..02e473c7c7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueBelowMin.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueBelowMin.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionNumberConstValueBelowMin.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionNumberConstValueBelowMin.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "SchemaDefinitionNumberConstValueBelowMin.TD.json", + "filename": "SchemaDefinitionNumberConstValueBelowMin.TM.json", "line": 12, "cfLine": 11, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueNotNumeric.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueNotNumeric.json index e164abc925..dcbb6ee33b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueNotNumeric.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueNotNumeric.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionNumberConstValueNotNumeric.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionNumberConstValueNotNumeric.TM.json" ], "lang": "none" }, "errors": [ { "condition": "TypeMismatch", - "filename": "SchemaDefinitionNumberConstValueNotNumeric.TD.json", + "filename": "SchemaDefinitionNumberConstValueNotNumeric.TM.json", "line": 11, "cfLine": 10, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMaxNotNumeric.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMaxNotNumeric.json index d5eb20ba4f..533fee051f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMaxNotNumeric.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMaxNotNumeric.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/SchemaDefinitionNumberMaxNotNumeric.TD.json" ], + "thingFiles": [ "invalidThing/SchemaDefinitionNumberMaxNotNumeric.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "SchemaDefinitionNumberMaxNotNumeric.TD.json", + "filename": "SchemaDefinitionNumberMaxNotNumeric.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMinAboveMax.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMinAboveMax.json index 06cf2c3a99..e1436bbcaa 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMinAboveMax.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMinAboveMax.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionNumberMinAboveMax.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionNumberMinAboveMax.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "SchemaDefinitionNumberMinAboveMax.TD.json", + "filename": "SchemaDefinitionNumberMinAboveMax.TM.json", "line": 12, "cfLine": 11, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMinNotNumeric.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMinNotNumeric.json index 03f9e85439..bdf3578b8b 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMinNotNumeric.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMinNotNumeric.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/SchemaDefinitionNumberMinNotNumeric.TD.json" ], + "thingFiles": [ "invalidThing/SchemaDefinitionNumberMinNotNumeric.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "SchemaDefinitionNumberMinNotNumeric.TD.json", + "filename": "SchemaDefinitionNumberMinNotNumeric.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberReadOnly.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberReadOnly.json index 5b585b51e0..dcbeb410e1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberReadOnly.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberReadOnly.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionNumberReadOnly.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionNumberReadOnly.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionNumberReadOnly.TD.json", + "filename": "SchemaDefinitionNumberReadOnly.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberUnsupportedProperty.json index f319c06760..65226824ad 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberUnsupportedProperty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionNumberUnsupportedProperty.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionNumberUnsupportedProperty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionNumberUnsupportedProperty.TD.json", + "filename": "SchemaDefinitionNumberUnsupportedProperty.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectBothDeterminants.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectBothDeterminants.json index 708b54ea45..df6fc5ad1c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectBothDeterminants.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectBothDeterminants.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectBothDeterminants.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectBothDeterminants.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "SchemaDefinitionObjectBothDeterminants.TD.json", + "filename": "SchemaDefinitionObjectBothDeterminants.TM.json", "line": 11, "cfLine": 16, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstNotObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstNotObject.json index 346ebc8686..60100dbe38 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstNotObject.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstNotObject.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstNotObject.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstNotObject.TM.json" ], "lang": "none" }, "errors": [ { "condition": "TypeMismatch", - "filename": "SchemaDefinitionObjectConstNotObject.TD.json", + "filename": "SchemaDefinitionObjectConstNotObject.TM.json", "line": 16, "cfLine": 10, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanConst.json index 9d64430b53..076e67a8ab 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanConst.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanConst.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanConst.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionObjectConstPropertyBooleanConst.TD.json", + "filename": "SchemaDefinitionObjectConstPropertyBooleanConst.TM.json", "line": 14, "cfLine": 17, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.json index 68e0eb5449..77bbc9bb40 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TM.json" ], "lang": "none" }, "errors": [ { "condition": "TypeMismatch", - "filename": "SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TD.json", + "filename": "SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TM.json", "line": 17, "cfLine": 13, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.json index 884dc58911..7b1216f4c1 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TD.json", + "filename": "SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TM.json", "line": 14, "cfLine": 17, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerAboveMax.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerAboveMax.json index c43f2593df..2eb374f8cd 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerAboveMax.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerAboveMax.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerAboveMax.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerAboveMax.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "SchemaDefinitionObjectConstPropertyIntegerAboveMax.TD.json", + "filename": "SchemaDefinitionObjectConstPropertyIntegerAboveMax.TM.json", "line": 18, "cfLine": 14, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerBelowMin.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerBelowMin.json index 672060c8ad..aca6917bba 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerBelowMin.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerBelowMin.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerBelowMin.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerBelowMin.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "SchemaDefinitionObjectConstPropertyIntegerBelowMin.TD.json", + "filename": "SchemaDefinitionObjectConstPropertyIntegerBelowMin.TM.json", "line": 18, "cfLine": 14, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerConst.json index 6d010ad9d0..0b9250953d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerConst.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerConst.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerConst.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionObjectConstPropertyIntegerConst.TD.json", + "filename": "SchemaDefinitionObjectConstPropertyIntegerConst.TM.json", "line": 14, "cfLine": 17, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotInteger.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotInteger.json index 792624e8fa..b7f7bd9872 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotInteger.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotInteger.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotInteger.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotInteger.TM.json" ], "lang": "none" }, "errors": [ { "condition": "TypeMismatch", - "filename": "SchemaDefinitionObjectConstPropertyIntegerNotInteger.TD.json", + "filename": "SchemaDefinitionObjectConstPropertyIntegerNotInteger.TM.json", "line": 17, "cfLine": 13, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.json index d1973c4413..73f5631e75 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TM.json" ], "lang": "none" }, "errors": [ { "condition": "TypeMismatch", - "filename": "SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TD.json", + "filename": "SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TM.json", "line": 17, "cfLine": 13, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.json index 5b66a19b46..0b1d9436aa 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TD.json", + "filename": "SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TM.json", "line": 14, "cfLine": 17, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNoType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNoType.json index f541f82685..f27cd1443a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNoType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNoType.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyNoType.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyNoType.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", - "filename": "SchemaDefinitionObjectConstPropertyNoType.TD.json", + "filename": "SchemaDefinitionObjectConstPropertyNoType.TM.json", "line": 12, "cfLine": 15, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNoValue.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNoValue.json index 5792fcf1b1..5e7b21b574 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNoValue.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNoValue.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyNoValue.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyNoValue.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ItemNotFound", - "filename": "SchemaDefinitionObjectConstPropertyNoValue.TD.json", + "filename": "SchemaDefinitionObjectConstPropertyNoValue.TM.json", "line": 12, "cfLine": 16, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberAboveMax.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberAboveMax.json index b9d89550d6..00fc2b07e8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberAboveMax.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberAboveMax.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberAboveMax.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberAboveMax.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "SchemaDefinitionObjectConstPropertyNumberAboveMax.TD.json", + "filename": "SchemaDefinitionObjectConstPropertyNumberAboveMax.TM.json", "line": 18, "cfLine": 14, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberBelowMin.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberBelowMin.json index 96e4e8b2c4..f102a03f67 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberBelowMin.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberBelowMin.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberBelowMin.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberBelowMin.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "SchemaDefinitionObjectConstPropertyNumberBelowMin.TD.json", + "filename": "SchemaDefinitionObjectConstPropertyNumberBelowMin.TM.json", "line": 18, "cfLine": 14, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberConst.json index c038e779c6..77d834e9c9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberConst.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberConst.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberConst.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionObjectConstPropertyNumberConst.TD.json", + "filename": "SchemaDefinitionObjectConstPropertyNumberConst.TM.json", "line": 14, "cfLine": 17, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberNotNumeric.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberNotNumeric.json index 1e38a79a24..7ded3adcb3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberNotNumeric.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberNotNumeric.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberNotNumeric.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberNotNumeric.TM.json" ], "lang": "none" }, "errors": [ { "condition": "TypeMismatch", - "filename": "SchemaDefinitionObjectConstPropertyNumberNotNumeric.TD.json", + "filename": "SchemaDefinitionObjectConstPropertyNumberNotNumeric.TM.json", "line": 17, "cfLine": 13, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.json index 1ec8163f20..a3f64039d7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TD.json", + "filename": "SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TM.json", "line": 14, "cfLine": 17, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringConst.json index cdb6e52a1a..ed281d0f78 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringConst.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyStringConst.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyStringConst.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionObjectConstPropertyStringConst.TD.json", + "filename": "SchemaDefinitionObjectConstPropertyStringConst.TM.json", "line": 14, "cfLine": 17, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.json index ab0e20de0f..57cb8bab29 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TD.json", + "filename": "SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TM.json", "line": 14, "cfLine": 17, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringValueNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringValueNotString.json index 33b8c2e5e5..f47aebba34 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringValueNotString.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringValueNotString.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyStringValueNotString.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyStringValueNotString.TM.json" ], "lang": "none" }, "errors": [ { "condition": "TypeMismatch", - "filename": "SchemaDefinitionObjectConstPropertyStringValueNotString.TD.json", + "filename": "SchemaDefinitionObjectConstPropertyStringValueNotString.TM.json", "line": 17, "cfLine": 13, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeArray.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeArray.json index 102d4670da..d2023ae92a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeArray.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeArray.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeArray.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeArray.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "SchemaDefinitionObjectConstPropertyTypeArray.TD.json", + "filename": "SchemaDefinitionObjectConstPropertyTypeArray.TM.json", "line": 13, "cfLine": 19, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeNull.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeNull.json index e87adbdc7a..d72832a618 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeNull.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeNull.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeNull.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeNull.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "SchemaDefinitionObjectConstPropertyTypeNull.TD.json", + "filename": "SchemaDefinitionObjectConstPropertyTypeNull.TM.json", "line": 13, "cfLine": 16, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeObject.json index fd9f6a5168..903f60c937 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeObject.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeObject.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeObject.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeObject.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "SchemaDefinitionObjectConstPropertyTypeObject.TD.json", + "filename": "SchemaDefinitionObjectConstPropertyTypeObject.TM.json", "line": 13, "cfLine": 21, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeUnsupported.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeUnsupported.json index 93631fa8b6..57e491c4bc 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeUnsupported.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeUnsupported.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/SchemaDefinitionObjectConstPropertyTypeUnsupported.TD.json" ], + "thingFiles": [ "invalidThing/SchemaDefinitionObjectConstPropertyTypeUnsupported.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "SchemaDefinitionObjectConstPropertyTypeUnsupported.TD.json", + "filename": "SchemaDefinitionObjectConstPropertyTypeUnsupported.TM.json", "line": 13, "cfLine": 16, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstUnsupportedProperty.json index 085dce9c98..251ac81c5e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstUnsupportedProperty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstUnsupportedProperty.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstUnsupportedProperty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionObjectConstUnsupportedProperty.TD.json", + "filename": "SchemaDefinitionObjectConstUnsupportedProperty.TM.json", "line": 16, "cfLine": 17, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstValueNoSchema.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstValueNoSchema.json index f92b5a1245..c02c8a4a6f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstValueNoSchema.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstValueNoSchema.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstValueNoSchema.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectConstValueNoSchema.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ItemNotFound", - "filename": "SchemaDefinitionObjectConstValueNoSchema.TD.json", + "filename": "SchemaDefinitionObjectConstValueNoSchema.TM.json", "line": 14, "cfLine": 11, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessageNoProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessageNoProperty.json index e726f79f07..49f93590e2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessageNoProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessageNoProperty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectErrorMessageNoProperty.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectErrorMessageNoProperty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ItemNotFound", - "filename": "SchemaDefinitionObjectErrorMessageNoProperty.TD.json", + "filename": "SchemaDefinitionObjectErrorMessageNoProperty.TM.json", "line": 13, "cfLine": 11, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessageNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessageNotString.json index b8dc80e551..ed1c834492 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessageNotString.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessageNotString.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectErrorMessageNotString.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectErrorMessageNotString.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "SchemaDefinitionObjectErrorMessageNotString.TD.json", + "filename": "SchemaDefinitionObjectErrorMessageNotString.TM.json", "line": 16, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessagePropertyNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessagePropertyNotString.json index 59cc8e3dac..d9411ada65 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessagePropertyNotString.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessagePropertyNotString.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectErrorMessagePropertyNotString.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectErrorMessagePropertyNotString.TM.json" ], "lang": "none" }, "errors": [ { "condition": "TypeMismatch", - "filename": "SchemaDefinitionObjectErrorMessagePropertyNotString.TD.json", + "filename": "SchemaDefinitionObjectErrorMessagePropertyNotString.TM.json", "line": 16, "cfLine": 12, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectNoDeterminant.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectNoDeterminant.json index c72f6d3826..f3136ae74e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectNoDeterminant.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectNoDeterminant.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectNoDeterminant.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectNoDeterminant.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", - "filename": "SchemaDefinitionObjectNoDeterminant.TD.json", + "filename": "SchemaDefinitionObjectNoDeterminant.TM.json", "line": 9, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertiesNotObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertiesNotObject.json index 4b62fdcf54..63a7a7dded 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertiesNotObject.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertiesNotObject.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectPropertiesNotObject.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectPropertiesNotObject.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "SchemaDefinitionObjectPropertiesNotObject.TD.json", + "filename": "SchemaDefinitionObjectPropertiesNotObject.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyNoType.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyNoType.json index 09c0c03748..4a8a37c493 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyNoType.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyNoType.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectPropertyNoType.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectPropertyNoType.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", - "filename": "SchemaDefinitionObjectPropertyNoType.TD.json", + "filename": "SchemaDefinitionObjectPropertyNoType.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyObjectConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyObjectConst.json index 8c5fe85b3a..7b235d4d13 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyObjectConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyObjectConst.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectPropertyObjectConst.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectPropertyObjectConst.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionObjectPropertyObjectConst.TD.json", + "filename": "SchemaDefinitionObjectPropertyObjectConst.TM.json", "line": 19, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyRef.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyRef.json index 60ee3c049f..dc2ea06770 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyRef.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyRef.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectPropertyRef.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectPropertyRef.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionObjectPropertyRef.TD.json", + "filename": "SchemaDefinitionObjectPropertyRef.TM.json", "line": 13, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyStringConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyStringConst.json index b8052f953f..050e1dc9ab 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyStringConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyStringConst.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectPropertyStringConst.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectPropertyStringConst.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionObjectPropertyStringConst.TD.json", + "filename": "SchemaDefinitionObjectPropertyStringConst.TM.json", "line": 14, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeNotString.json index 178f6f809c..59cc8f72b4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeNotString.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeNotString.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/SchemaDefinitionObjectPropertyTypeNotString.TD.json" ], + "thingFiles": [ "invalidThing/SchemaDefinitionObjectPropertyTypeNotString.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "SchemaDefinitionObjectPropertyTypeNotString.TD.json", + "filename": "SchemaDefinitionObjectPropertyTypeNotString.TM.json", "line": 13, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeNull.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeNull.json index 8bdd6656e3..da692fdcd3 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeNull.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeNull.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectPropertyTypeNull.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectPropertyTypeNull.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "SchemaDefinitionObjectPropertyTypeNull.TD.json", + "filename": "SchemaDefinitionObjectPropertyTypeNull.TM.json", "line": 13, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeUnsupported.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeUnsupported.json index d9ab7042c9..2bba617ff9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeUnsupported.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeUnsupported.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/SchemaDefinitionObjectPropertyTypeUnsupported.TD.json" ], + "thingFiles": [ "invalidThing/SchemaDefinitionObjectPropertyTypeUnsupported.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "SchemaDefinitionObjectPropertyTypeUnsupported.TD.json", + "filename": "SchemaDefinitionObjectPropertyTypeUnsupported.TM.json", "line": 13, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectRequiredNoProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectRequiredNoProperty.json index 80f0950d56..9cdd01de93 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectRequiredNoProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectRequiredNoProperty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectRequiredNoProperty.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionObjectRequiredNoProperty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ItemNotFound", - "filename": "SchemaDefinitionObjectRequiredNoProperty.TD.json", + "filename": "SchemaDefinitionObjectRequiredNoProperty.TM.json", "line": 13, "cfLine": 11, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectRequiredNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectRequiredNotString.json index 8a1361252d..9580f83465 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectRequiredNotString.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectRequiredNotString.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/SchemaDefinitionObjectRequiredNotString.TD.json" ], + "thingFiles": [ "invalidThing/SchemaDefinitionObjectRequiredNotString.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "SchemaDefinitionObjectRequiredNotString.TD.json", + "filename": "SchemaDefinitionObjectRequiredNotString.TM.json", "line": 16, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionRef.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionRef.json index 2f76daf8d9..7b2659673e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionRef.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionRef.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionRef.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionRef.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionRef.TD.json", + "filename": "SchemaDefinitionRef.TM.json", "line": 10, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstContentEncoding.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstContentEncoding.json index f90f0ac8d3..ceb6d559bf 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstContentEncoding.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstContentEncoding.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringConstContentEncoding.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringConstContentEncoding.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionStringConstContentEncoding.TD.json", + "filename": "SchemaDefinitionStringConstContentEncoding.TM.json", "line": 12, "cfLine": 11, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstFormat.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstFormat.json index 996040167e..f53eae03e7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstFormat.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstFormat.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringConstFormat.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringConstFormat.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionStringConstFormat.TD.json", + "filename": "SchemaDefinitionStringConstFormat.TM.json", "line": 12, "cfLine": 11, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstPattern.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstPattern.json index 86e7ee49a9..de90f7e50d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstPattern.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstPattern.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringConstPattern.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringConstPattern.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionStringConstPattern.TD.json", + "filename": "SchemaDefinitionStringConstPattern.TM.json", "line": 12, "cfLine": 11, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstUnsupportedProperty.json index 94e635a6b1..1c9afa2a97 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstUnsupportedProperty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringConstUnsupportedProperty.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringConstUnsupportedProperty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionStringConstUnsupportedProperty.TD.json", + "filename": "SchemaDefinitionStringConstUnsupportedProperty.TM.json", "line": 12, "cfLine": 11, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstValueNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstValueNotString.json index c1d8f29557..c5718e6b47 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstValueNotString.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstValueNotString.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringConstValueNotString.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringConstValueNotString.TM.json" ], "lang": "none" }, "errors": [ { "condition": "TypeMismatch", - "filename": "SchemaDefinitionStringConstValueNotString.TD.json", + "filename": "SchemaDefinitionStringConstValueNotString.TM.json", "line": 11, "cfLine": 10, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringContentEncodingNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringContentEncodingNotString.json index 94f1f22de2..bad0e5d73e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringContentEncodingNotString.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringContentEncodingNotString.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/SchemaDefinitionStringContentEncodingNotString.TD.json" ], + "thingFiles": [ "invalidThing/SchemaDefinitionStringContentEncodingNotString.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "SchemaDefinitionStringContentEncodingNotString.TD.json", + "filename": "SchemaDefinitionStringContentEncodingNotString.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringContentEncodingUnsupportedValue.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringContentEncodingUnsupportedValue.json index 2c96ccfd20..2b970479a0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringContentEncodingUnsupportedValue.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringContentEncodingUnsupportedValue.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringContentEncodingUnsupportedValue.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringContentEncodingUnsupportedValue.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "SchemaDefinitionStringContentEncodingUnsupportedValue.TD.json", + "filename": "SchemaDefinitionStringContentEncodingUnsupportedValue.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumConst.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumConst.json index af8637f4e9..4162361278 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumConst.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumConst.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringEnumConst.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringEnumConst.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionStringEnumConst.TD.json", + "filename": "SchemaDefinitionStringEnumConst.TM.json", "line": 12, "cfLine": 11, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumContentEncoding.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumContentEncoding.json index f8ef7e835c..f9093bfaf8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumContentEncoding.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumContentEncoding.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringEnumContentEncoding.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringEnumContentEncoding.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionStringEnumContentEncoding.TD.json", + "filename": "SchemaDefinitionStringEnumContentEncoding.TM.json", "line": 12, "cfLine": 11, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumElementInvalid.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumElementInvalid.json index 3a26039392..07870ea913 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumElementInvalid.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumElementInvalid.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringEnumElementInvalid.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringEnumElementInvalid.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "SchemaDefinitionStringEnumElementInvalid.TD.json", + "filename": "SchemaDefinitionStringEnumElementInvalid.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumFormat.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumFormat.json index d51f32fe0a..541d938994 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumFormat.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumFormat.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringEnumFormat.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringEnumFormat.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionStringEnumFormat.TD.json", + "filename": "SchemaDefinitionStringEnumFormat.TM.json", "line": 12, "cfLine": 11, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumPattern.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumPattern.json index 7364369eb6..af87a36653 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumPattern.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumPattern.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringEnumPattern.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringEnumPattern.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionStringEnumPattern.TD.json", + "filename": "SchemaDefinitionStringEnumPattern.TM.json", "line": 12, "cfLine": 11, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumReadOnly.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumReadOnly.json index 801a0bc22d..c42c4a12dd 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumReadOnly.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumReadOnly.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringEnumReadOnly.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringEnumReadOnly.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionStringEnumReadOnly.TD.json", + "filename": "SchemaDefinitionStringEnumReadOnly.TM.json", "line": 12, "cfLine": 11, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumUnsupportedProperty.json index 6fea7999fe..6873e5d627 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumUnsupportedProperty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringEnumUnsupportedProperty.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringEnumUnsupportedProperty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionStringEnumUnsupportedProperty.TD.json", + "filename": "SchemaDefinitionStringEnumUnsupportedProperty.TM.json", "line": 12, "cfLine": 11, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatAndContentEncoding.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatAndContentEncoding.json index 19a10b7880..13c107fbf8 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatAndContentEncoding.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatAndContentEncoding.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringFormatAndContentEncoding.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringFormatAndContentEncoding.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "SchemaDefinitionStringFormatAndContentEncoding.TD.json", + "filename": "SchemaDefinitionStringFormatAndContentEncoding.TM.json", "line": 9, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatAndPattern.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatAndPattern.json index 6c8ead981f..c3a5aa6b33 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatAndPattern.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatAndPattern.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringFormatAndPattern.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringFormatAndPattern.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "SchemaDefinitionStringFormatAndPattern.TD.json", + "filename": "SchemaDefinitionStringFormatAndPattern.TM.json", "line": 9, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatNotString.json index a0a8cf297e..c4549437e4 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatNotString.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatNotString.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/SchemaDefinitionStringFormatNotString.TD.json" ], + "thingFiles": [ "invalidThing/SchemaDefinitionStringFormatNotString.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "SchemaDefinitionStringFormatNotString.TD.json", + "filename": "SchemaDefinitionStringFormatNotString.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatUnsupportedValue.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatUnsupportedValue.json index 0f24b10a9f..7e9a2c10f7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatUnsupportedValue.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatUnsupportedValue.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringFormatUnsupportedValue.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringFormatUnsupportedValue.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "SchemaDefinitionStringFormatUnsupportedValue.TD.json", + "filename": "SchemaDefinitionStringFormatUnsupportedValue.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternAndContentEncoding.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternAndContentEncoding.json index af5049c94a..33188d5131 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternAndContentEncoding.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternAndContentEncoding.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringPatternAndContentEncoding.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringPatternAndContentEncoding.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ValuesInconsistent", - "filename": "SchemaDefinitionStringPatternAndContentEncoding.TD.json", + "filename": "SchemaDefinitionStringPatternAndContentEncoding.TM.json", "line": 9, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternNotDurationOrDecimal.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternNotDurationOrDecimal.json index 5cbdf9c93f..9781596e93 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternNotDurationOrDecimal.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternNotDurationOrDecimal.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringPatternNotDurationOrDecimal.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringPatternNotDurationOrDecimal.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "SchemaDefinitionStringPatternNotDurationOrDecimal.TD.json", + "filename": "SchemaDefinitionStringPatternNotDurationOrDecimal.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternNotString.json index 33947ee560..b6eaa02a84 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternNotString.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternNotString.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/SchemaDefinitionStringPatternNotString.TD.json" ], + "thingFiles": [ "invalidThing/SchemaDefinitionStringPatternNotString.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "SchemaDefinitionStringPatternNotString.TD.json", + "filename": "SchemaDefinitionStringPatternNotString.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternRegexInvalid.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternRegexInvalid.json index 6c9d8efcaa..1b46459503 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternRegexInvalid.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternRegexInvalid.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringPatternRegexInvalid.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringPatternRegexInvalid.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "SchemaDefinitionStringPatternRegexInvalid.TD.json", + "filename": "SchemaDefinitionStringPatternRegexInvalid.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringReadOnly.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringReadOnly.json index 0ac194d80f..e4de991f48 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringReadOnly.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringReadOnly.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringReadOnly.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringReadOnly.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionStringReadOnly.TD.json", + "filename": "SchemaDefinitionStringReadOnly.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringUnsupportedProperty.json index a3a2f1655d..82d8b6f90a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringUnsupportedProperty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringUnsupportedProperty.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionStringUnsupportedProperty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "SchemaDefinitionStringUnsupportedProperty.TD.json", + "filename": "SchemaDefinitionStringUnsupportedProperty.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeNotString.json index 5029c7c4c2..c895f2c119 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeNotString.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeNotString.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/SchemaDefinitionTypeNotString.TD.json" ], + "thingFiles": [ "invalidThing/SchemaDefinitionTypeNotString.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "SchemaDefinitionTypeNotString.TD.json", + "filename": "SchemaDefinitionTypeNotString.TM.json", "line": 10, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeNull.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeNull.json index da907224ec..ce49c1b227 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeNull.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeNull.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/SchemaDefinitionTypeNull.TD.json" ], + "thingFiles": [ "invalidAioBinding/SchemaDefinitionTypeNull.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "SchemaDefinitionTypeNull.TD.json", + "filename": "SchemaDefinitionTypeNull.TM.json", "line": 10, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeUnsupported.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeUnsupported.json index 42c5be998c..a36cda4a39 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeUnsupported.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeUnsupported.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/SchemaDefinitionTypeUnsupported.TD.json" ], + "thingFiles": [ "invalidThing/SchemaDefinitionTypeUnsupported.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "SchemaDefinitionTypeUnsupported.TD.json", + "filename": "SchemaDefinitionTypeUnsupported.TM.json", "line": 10, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ThingUnsupportedProperty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ThingUnsupportedProperty.json index b0e824555f..7ac69610e2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ThingUnsupportedProperty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ThingUnsupportedProperty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/ThingUnsupportedProperty.TD.json" ], + "thingFiles": [ "invalidAioBinding/ThingUnsupportedProperty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "ThingUnsupportedProperty.TD.json", + "filename": "ThingUnsupportedProperty.TM.json", "line": 8, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleEmpty.json index 8a6cee690c..e6cef89a30 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleEmpty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/TitleEmpty.TD.json" ], + "thingFiles": [ "invalidAioBinding/TitleEmpty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyEmpty", - "filename": "TitleEmpty.TD.json", + "filename": "TitleEmpty.TM.json", "line": 7, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleInvalid.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleInvalid.json index b0aca0d3ba..21566a980a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleInvalid.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleInvalid.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/TitleInvalid.TD.json" ], + "thingFiles": [ "invalidAioBinding/TitleInvalid.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "TitleInvalid.TD.json", + "filename": "TitleInvalid.TM.json", "line": 7, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleNotString.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleNotString.json index 3a8b6188b7..9021ce238c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleNotString.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleNotString.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/TitleNotString.TD.json" ], + "thingFiles": [ "invalidThing/TitleNotString.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "TitleNotString.TD.json", + "filename": "TitleNotString.TM.json", "line": 7, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TrailingComma.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TrailingComma.json index fc9afd30c4..d4eca9587e 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TrailingComma.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TrailingComma.json @@ -1,20 +1,20 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidJson/TrailingComma.TD.json" ], + "thingFiles": [ "invalidJson/TrailingComma.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "TrailingComma.TD.json", + "filename": "TrailingComma.TM.json", "line": 11, "cfLine": 0, "crossRef": "" }, { "condition": "JsonInvalid", - "filename": "TrailingComma.TD.json", + "filename": "TrailingComma.TM.json", "line": 15, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TypeEmpty.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TypeEmpty.json index 72183eeeb8..4b0ce99be7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TypeEmpty.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TypeEmpty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/TypeEmpty.TD.json" ], + "thingFiles": [ "invalidThing/TypeEmpty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyEmpty", - "filename": "TypeEmpty.TD.json", + "filename": "TypeEmpty.TM.json", "line": 6, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TypeNotThingModel.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TypeNotThingModel.json index 376be4e1a0..0b90ddba3c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TypeNotThingModel.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TypeNotThingModel.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidThing/TypeNotThingModel.TD.json" ], + "thingFiles": [ "invalidThing/TypeNotThingModel.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyInvalid", - "filename": "TypeNotThingModel.TD.json", + "filename": "TypeNotThingModel.TM.json", "line": 6, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedArray.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedArray.json index 4a0ff7bd73..3709bce8f9 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedArray.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedArray.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidJson/UnclosedArray.TD.json" ], + "thingFiles": [ "invalidJson/UnclosedArray.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "UnclosedArray.TD.json", + "filename": "UnclosedArray.TM.json", "line": 16, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedObject.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedObject.json index 9253aacebb..73cff08d77 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedObject.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedObject.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidJson/UnclosedObject.TD.json" ], + "thingFiles": [ "invalidJson/UnclosedObject.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "UnclosedObject.TD.json", + "filename": "UnclosedObject.TM.json", "line": 15, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnsupportedLanguage.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnsupportedLanguage.json index ddae1dac11..e17f8c1a6a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnsupportedLanguage.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnsupportedLanguage.json @@ -1,7 +1,7 @@ { "success": false, "commandLine": { - "thingFiles": [ "valid/Noop.TD.json" ], + "thingFiles": [ "valid/Noop.TM.json" ], "lang": "haskell" }, "errors": [ diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/LinkNoRel.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/LinkNoRel.json index 68206dfdef..31808ebea2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/LinkNoRel.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/LinkNoRel.json @@ -1,7 +1,7 @@ { "success": true, "commandLine": { - "thingFiles": [ "valid/LinkNoRel.TD.json" ], + "thingFiles": [ "valid/LinkNoRel.TM.json" ], "lang": "none" } } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/LinkOtherRel.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/LinkOtherRel.json index 44419d3c6e..187336280d 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/LinkOtherRel.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/LinkOtherRel.json @@ -1,7 +1,7 @@ { "success": true, "commandLine": { - "thingFiles": [ "valid/LinkOtherRel.TD.json" ], + "thingFiles": [ "valid/LinkOtherRel.TM.json" ], "lang": "none" } } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.json index 09fe1c6b58..32a63c539a 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.json @@ -1,12 +1,12 @@ { "success": true, "commandLine": { - "thingFiles": [ "valid/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TD.json" ], + "thingFiles": [ "valid/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TM.json" ], "lang": "none" }, "warnings": [ { - "filename": "RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TD.json", + "filename": "RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TM.json", "line": 27, "cfLine": 41, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.json index 205dfef164..81bab3539f 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.json @@ -1,12 +1,12 @@ { "success": true, "commandLine": { - "thingFiles": [ "valid/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TD.json" ], + "thingFiles": [ "valid/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TM.json" ], "lang": "none" }, "warnings": [ { - "filename": "RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TD.json", + "filename": "RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TM.json", "line": 32, "cfLine": 47, "crossRef": "" diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/.vscode/settings.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/.vscode/settings.json index b36ab1a995..3e93c0bd92 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/.vscode/settings.json +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/.vscode/settings.json @@ -2,8 +2,8 @@ "json.schemaDownload.enable": true, "json.schemas": [ { - "fileMatch": [ "**/*.TD.json" ], - "url": "../../../schema/aio-td-json-schema.json" + "fileMatch": [ "**/*.TM.json" ], + "url": "../../../schema/aio-tm-json-schema.json" } ] } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeEmpty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeText.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeText.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeText.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeText.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoMatchingSchemaDefinition.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoMatchingSchemaDefinition.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoMatchingSchemaDefinition.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoMatchingSchemaDefinition.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchema.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchema.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchema.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchema.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchemaDefinitions.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchemaDefinitions.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchemaDefinitions.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchemaDefinitions.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSuccess.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSuccess.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSuccess.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSuccess.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionMap.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionMap.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionMap.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionMap.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionNotObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionNotObject.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionNotObject.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionNotObject.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaEmpty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSuccessTrue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSuccessTrue.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSuccessTrue.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSuccessTrue.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseUnsupportedProperty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponsesMultiple.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponsesMultiple.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponsesMultiple.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponsesMultiple.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormContentTypeText.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormContentTypeText.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormContentTypeText.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormContentTypeText.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeEmpty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoMatchingSchemaDefinition.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoMatchingSchemaDefinition.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoMatchingSchemaDefinition.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoMatchingSchemaDefinition.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoSchemaDefinitions.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoSchemaDefinitions.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoSchemaDefinitions.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoSchemaDefinitions.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeSchemaDefinitionNotEnum.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeSchemaDefinitionNotEnum.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeSchemaDefinitionNotEnum.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeSchemaDefinitionNotEnum.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeEmpty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeNotJson.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeNotJson.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeNotJson.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeNotJson.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoContentType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoContentType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoContentType.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoContentType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoMatchingSchemaDefinition.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoMatchingSchemaDefinition.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoMatchingSchemaDefinition.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoMatchingSchemaDefinition.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchema.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchema.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchema.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchema.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchemaDefinitions.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchemaDefinitions.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchemaDefinitions.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchemaDefinitions.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionMap.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionMap.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionMap.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionMap.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionNotObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionNotObject.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionNotObject.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionNotObject.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaEmpty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSuccessTrue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSuccessTrue.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSuccessTrue.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSuccessTrue.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoUnsupportedProperty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfosMultiple.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfosMultiple.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfosMultiple.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfosMultiple.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormOpInvokeDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormOpInvokeDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormOpInvokeDuplicate.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormOpInvokeDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormServiceGroupEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormServiceGroupEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormServiceGroupEmpty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormServiceGroupEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicNoContentType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicNoContentType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicNoContentType.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicNoContentType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenAction.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenAction.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenAction.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenAction.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenConsumerId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenConsumerId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenConsumerId.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenConsumerId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenMaintainerId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenMaintainerId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenMaintainerId.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenMaintainerId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenSenderId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenSenderId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenSenderId.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenSenderId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormUnsupportedProperty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsMultipleContentTypes.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsMultipleContentTypes.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsMultipleContentTypes.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsMultipleContentTypes.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOpInvokeDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOpInvokeDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOpInvokeDuplicate.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOpInvokeDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessAndInvoke.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessAndInvoke.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessAndInvoke.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessAndInvoke.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessDuplicate.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputMap.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputMap.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputMap.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputMap.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNullAndContentTypeJson.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNullAndContentTypeJson.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNullAndContentTypeJson.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNullAndContentTypeJson.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNumber.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNumber.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNumber.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNumber.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeCustom.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeCustom.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeCustom.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeCustom.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeRaw.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeRaw.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeRaw.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeRaw.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectConst.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectErrorMessage.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectErrorMessage.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectErrorMessage.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectErrorMessage.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputString.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionNoForms.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionNoForms.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionNoForms.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionNoForms.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionNoFormsWithTopic.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionNoFormsWithTopic.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionNoFormsWithTopic.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionNoFormsWithTopic.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputMap.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputMap.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputMap.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputMap.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNullAndContentTypeJson.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNullAndContentTypeJson.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNullAndContentTypeJson.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNullAndContentTypeJson.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNumber.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNumber.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNumber.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNumber.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeCustom.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeCustom.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeCustom.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeCustom.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeRaw.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeRaw.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeRaw.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeRaw.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectConst.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectErrorMessage.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectErrorMessage.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectErrorMessage.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectErrorMessage.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputString.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionUnsupportedProperty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongPrefix.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongPrefix.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongPrefix.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongPrefix.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongUri.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongUri.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongUri.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongUri.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextMissingDtv.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextMissingDtv.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextMissingDtv.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextMissingDtv.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventBooleanConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventBooleanConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventBooleanConst.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventBooleanConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormAdditionalResponses.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormAdditionalResponses.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormAdditionalResponses.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormAdditionalResponses.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormContentTypeText.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormContentTypeText.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormContentTypeText.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormContentTypeText.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderCode.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderCode.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderCode.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderCode.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderInfo.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderInfo.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderInfo.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderInfo.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormOpSubDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormOpSubDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormOpSubDuplicate.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormOpSubDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormServiceGroupEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormServiceGroupEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormServiceGroupEmpty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormServiceGroupEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicNoContentType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicNoContentType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicNoContentType.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicNoContentType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenAction.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenAction.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenAction.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenAction.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenConsumerId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenConsumerId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenConsumerId.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenConsumerId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenExecutorId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenExecutorId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenExecutorId.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenExecutorId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenInvokerId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenInvokerId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenInvokerId.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenInvokerId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenMaintainerId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenMaintainerId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenMaintainerId.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenMaintainerId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormUnsupportedProperty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOpSubDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOpSubDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOpSubDuplicate.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOpSubDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessAndSub.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessAndSub.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessAndSub.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessAndSub.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessDuplicate.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventIntegerConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventIntegerConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventIntegerConst.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventIntegerConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNoForms.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNoForms.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNoForms.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNoForms.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNoFormsWithTopicAndNoRootFormSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNoFormsWithTopicAndNoRootFormSubAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNoFormsWithTopicAndNoRootFormSubAll.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNoFormsWithTopicAndNoRootFormSubAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNullAndContentTypeJson.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNullAndContentTypeJson.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNullAndContentTypeJson.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNullAndContentTypeJson.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNumberConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNumberConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNumberConst.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNumberConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeCustom.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeCustom.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeCustom.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeCustom.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeRaw.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeRaw.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeRaw.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeRaw.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectConst.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectErrorMessage.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectErrorMessage.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectErrorMessage.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectErrorMessage.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventStringConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventStringConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventStringConst.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventStringConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventUnsupportedProperty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyHref.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyHref.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyHref.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyHref.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyType.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoHref.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoHref.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoHref.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoHref.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoType.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonJsonFile.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonJsonFile.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonJsonFile.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonJsonFile.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonexistentFile.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonexistentFile.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonexistentFile.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonexistentFile.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkTypeNotJson.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkTypeNotJson.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkTypeNotJson.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkTypeNotJson.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkUnsupportedProperty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/MultipleLinks.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/MultipleLinks.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/MultipleLinks.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/MultipleLinks.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/NoTitle.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/NoTitle.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/NoTitle.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/NoTitle.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyBooleanConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyBooleanConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyBooleanConst.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyBooleanConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeEmpty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeText.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeText.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeText.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeText.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchema.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchema.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchema.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchema.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchemaDefinitions.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchemaDefinitions.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchemaDefinitions.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchemaDefinitions.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSuccess.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSuccess.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSuccess.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSuccess.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionMap.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionMap.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionMap.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionMap.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionNotObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionNotObject.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionNotObject.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionNotObject.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaEmpty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSuccessTrue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSuccessTrue.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSuccessTrue.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSuccessTrue.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseUnsupportedProperty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponsesMultiple.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponsesMultiple.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponsesMultiple.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponsesMultiple.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormContentTypeText.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormContentTypeText.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormContentTypeText.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormContentTypeText.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderCode.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderCode.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderCode.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderCode.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderInfo.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderInfo.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderInfo.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderInfo.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpReadDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpReadDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpReadDuplicate.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpReadDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpWriteDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpWriteDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpWriteDuplicate.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpWriteDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicAndNoRootFormReadAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicAndNoRootFormReadAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicAndNoRootFormReadAll.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicAndNoRootFormReadAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormServiceGroup.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormServiceGroup.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormServiceGroup.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormServiceGroup.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicNoContentType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicNoContentType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicNoContentType.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicNoContentType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenExecutorId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenExecutorId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenExecutorId.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenExecutorId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenInvokerId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenInvokerId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenInvokerId.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenInvokerId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenReadAndWrite.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenReadAndWrite.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenReadAndWrite.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenReadAndWrite.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenSenderId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenSenderId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenSenderId.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenSenderId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormUnsupportedProperty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpReadDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpReadDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpReadDuplicate.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpReadDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteDuplicate.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteNoRead.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteNoRead.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteNoRead.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteNoRead.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessAndRead.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessAndRead.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessAndRead.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessAndRead.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessDuplicate.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyIntegerConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyIntegerConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyIntegerConst.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyIntegerConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyNoForms.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyNoForms.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyNoForms.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyNoForms.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyNumberConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyNumberConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyNumberConst.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyNumberConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectConst.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectErrorMessage.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectErrorMessage.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectErrorMessage.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectErrorMessage.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyStringConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyStringConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyStringConst.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyStringConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyTypeNull.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyTypeNull.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyTypeNull.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyTypeNull.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyUnsupportedProperty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeEmpty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeText.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeText.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeText.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeText.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseNoSuccess.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseNoSuccess.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseNoSuccess.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseNoSuccess.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSchema.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSchema.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSchema.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSchema.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSuccessTrue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSuccessTrue.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSuccessTrue.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSuccessTrue.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseUnsupportedProperty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesAndSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesAndSubAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesAndSubAll.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesAndSubAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesMultiple.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesMultiple.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesMultiple.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesMultiple.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeCustom.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeCustom.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeCustom.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeCustom.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeRaw.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeRaw.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeRaw.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeRaw.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeText.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeText.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeText.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeText.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderCode.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderCode.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderCode.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderCode.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderInfo.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderInfo.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderInfo.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderInfo.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoContentType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoContentType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoContentType.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoContentType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoTopic.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoTopic.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoTopic.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoTopic.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllAndSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllAndSubAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllAndSubAll.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllAndSubAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllDuplicate.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpSubAllDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpSubAllDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpSubAllDuplicate.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpSubAllDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWiteMultiAndSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWiteMultiAndSubAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWiteMultiAndSubAll.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWiteMultiAndSubAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWriteMultiDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWriteMultiDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWriteMultiDuplicate.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWriteMultiDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormReadAllButNoProperties.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormReadAllButNoProperties.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormReadAllButNoProperties.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormReadAllButNoProperties.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupEmpty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupNoSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupNoSubAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupNoSubAll.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupNoSubAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormSubAllButNoEvents.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormSubAllButNoEvents.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormSubAllButNoEvents.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormSubAllButNoEvents.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicEmpty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelEmpty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelInvalid.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelInvalid.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelInvalid.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelInvalid.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicReservedStart.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicReservedStart.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicReservedStart.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicReservedStart.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenActionWhenSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenActionWhenSubAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenActionWhenSubAll.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenActionWhenSubAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenConsumerIdWhenSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenConsumerIdWhenSubAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenConsumerIdWhenSubAll.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenConsumerIdWhenSubAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomEmpty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomInvalid.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomInvalid.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomInvalid.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomInvalid.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenEmpty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenExecutorId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenExecutorId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenExecutorId.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenExecutorId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenInvokerId.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenInvokerId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenInvokerId.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenInvokerId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenMaintainerIdWhenSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenMaintainerIdWhenSubAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenMaintainerIdWhenSubAll.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenMaintainerIdWhenSubAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenReadAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenReadAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenReadAll.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenReadAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenWriteMulti.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenWriteMulti.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenWriteMulti.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenWriteMulti.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenUnrecognized.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenUnrecognized.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenUnrecognized.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenUnrecognized.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormWriteMultiButNoWritableProperties.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormWriteMultiButNoWritableProperties.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormWriteMultiButNoWritableProperties.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormWriteMultiButNoWritableProperties.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpReadAllDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpReadAllDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpReadAllDuplicate.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpReadAllDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpSubAllDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpSubAllDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpSubAllDuplicate.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpSubAllDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiDuplicate.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiDuplicate.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiNoReadAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiNoReadAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiNoReadAll.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiNoReadAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayConst.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsNoType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsNoType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsNoType.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsNoType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsObjectConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsObjectConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsObjectConst.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsObjectConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsRef.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsRef.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsRef.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsRef.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsStringConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsStringConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsStringConst.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsStringConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsTypeNull.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsTypeNull.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsTypeNull.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsTypeNull.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayNoItems.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayNoItems.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayNoItems.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayNoItems.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanConstValueNotBoolean.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanConstValueNotBoolean.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanConstValueNotBoolean.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanConstValueNotBoolean.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanReadOnly.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanReadOnly.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanReadOnly.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanReadOnly.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanUnsupportedProperty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueAboveMax.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueAboveMax.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueAboveMax.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueAboveMax.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueBelowMin.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueBelowMin.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueBelowMin.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueBelowMin.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotInteger.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotInteger.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotInteger.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotInteger.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotNumeric.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotNumeric.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotNumeric.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMaxNotInteger.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMaxNotInteger.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMaxNotInteger.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMaxNotInteger.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinAboveMax.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinAboveMax.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinAboveMax.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinAboveMax.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinNotInteger.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinNotInteger.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinNotInteger.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinNotInteger.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerReadOnly.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerReadOnly.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerReadOnly.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerReadOnly.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerUnsupportedProperty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesNoType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesNoType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesNoType.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesNoType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesObjectConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesObjectConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesObjectConst.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesObjectConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesStringConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesStringConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesStringConst.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesStringConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesTypeNull.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesTypeNull.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesTypeNull.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesTypeNull.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapConst.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNoType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNoType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNoType.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNoType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueAboveMax.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueAboveMax.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueAboveMax.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueAboveMax.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueBelowMin.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueBelowMin.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueBelowMin.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueBelowMin.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueNotNumeric.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueNotNumeric.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueNotNumeric.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberMinAboveMax.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberMinAboveMax.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberMinAboveMax.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberMinAboveMax.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberReadOnly.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberReadOnly.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberReadOnly.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberReadOnly.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberUnsupportedProperty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectBothDeterminants.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectBothDeterminants.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectBothDeterminants.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectBothDeterminants.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstNotObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstNotObject.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstNotObject.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstNotObject.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanConst.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerAboveMax.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerAboveMax.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerAboveMax.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerAboveMax.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerBelowMin.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerBelowMin.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerBelowMin.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerBelowMin.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerConst.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotInteger.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotInteger.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotInteger.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotInteger.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoType.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoValue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoValue.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoValue.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoValue.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberAboveMax.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberAboveMax.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberAboveMax.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberAboveMax.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberBelowMin.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberBelowMin.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberBelowMin.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberBelowMin.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberConst.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberNotNumeric.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberNotNumeric.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberNotNumeric.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringConst.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringValueNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringValueNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringValueNotString.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringValueNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeArray.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeArray.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeArray.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeArray.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeNull.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeNull.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeNull.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeNull.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeObject.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeObject.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeObject.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstUnsupportedProperty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstValueNoSchema.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstValueNoSchema.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstValueNoSchema.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstValueNoSchema.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNoProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNoProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNoProperty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNoProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNotString.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessagePropertyNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessagePropertyNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessagePropertyNotString.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessagePropertyNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectNoDeterminant.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectNoDeterminant.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectNoDeterminant.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectNoDeterminant.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertiesNotObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertiesNotObject.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertiesNotObject.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertiesNotObject.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyNoType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyNoType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyNoType.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyNoType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyObjectConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyObjectConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyObjectConst.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyObjectConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyRef.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyRef.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyRef.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyRef.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyStringConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyStringConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyStringConst.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyStringConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyTypeNull.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyTypeNull.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyTypeNull.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyTypeNull.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectRequiredNoProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectRequiredNoProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectRequiredNoProperty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectRequiredNoProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionRef.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionRef.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionRef.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionRef.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstContentEncoding.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstContentEncoding.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstContentEncoding.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstContentEncoding.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstFormat.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstFormat.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstFormat.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstFormat.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstPattern.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstPattern.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstPattern.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstPattern.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstUnsupportedProperty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstValueNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstValueNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstValueNotString.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstValueNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringContentEncodingUnsupportedValue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringContentEncodingUnsupportedValue.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringContentEncodingUnsupportedValue.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringContentEncodingUnsupportedValue.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumConst.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumConst.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumContentEncoding.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumContentEncoding.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumContentEncoding.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumContentEncoding.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumElementInvalid.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumElementInvalid.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumElementInvalid.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumElementInvalid.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumFormat.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumFormat.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumFormat.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumFormat.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumPattern.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumPattern.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumPattern.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumPattern.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumReadOnly.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumReadOnly.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumReadOnly.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumReadOnly.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumUnsupportedProperty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndContentEncoding.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndContentEncoding.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndContentEncoding.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndContentEncoding.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndPattern.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndPattern.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndPattern.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndPattern.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatUnsupportedValue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatUnsupportedValue.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatUnsupportedValue.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatUnsupportedValue.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternAndContentEncoding.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternAndContentEncoding.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternAndContentEncoding.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternAndContentEncoding.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternNotDurationOrDecimal.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternNotDurationOrDecimal.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternNotDurationOrDecimal.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternNotDurationOrDecimal.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternRegexInvalid.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternRegexInvalid.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternRegexInvalid.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternRegexInvalid.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringReadOnly.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringReadOnly.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringReadOnly.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringReadOnly.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringUnsupportedProperty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionTypeNull.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionTypeNull.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionTypeNull.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionTypeNull.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ThingUnsupportedProperty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ThingUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ThingUnsupportedProperty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ThingUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleEmpty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleInvalid.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleInvalid.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleInvalid.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleInvalid.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ArrayKey.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ArrayKey.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ArrayKey.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ArrayKey.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/BooleanKey.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/BooleanKey.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/BooleanKey.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/BooleanKey.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/DuplicateKey.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/DuplicateKey.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/DuplicateKey.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/DuplicateKey.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingColon.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingColon.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingColon.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingColon.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingComma.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingComma.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingComma.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingComma.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingElement.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingElement.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingElement.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingElement.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingKey.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingKey.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingKey.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingKey.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingValue.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingValue.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingValue.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingValue.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/NumericKey.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/NumericKey.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/NumericKey.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/NumericKey.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ObjectKey.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ObjectKey.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ObjectKey.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ObjectKey.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/TrailingComma.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/TrailingComma.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/TrailingComma.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/TrailingComma.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedArray.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedArray.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedArray.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedArray.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedObject.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedObject.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedObject.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpRead.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpRead.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpRead.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpRead.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpSub.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpSub.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpSub.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpSub.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpWrite.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpWrite.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpWrite.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpWrite.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormsEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormsEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormsEmpty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormsEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextMissingWot.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextMissingWot.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextMissingWot.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextMissingWot.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextWrongType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextWrongType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextWrongType.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextWrongType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpInvoke.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpInvoke.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpInvoke.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpInvoke.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpRead.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpRead.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpRead.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpRead.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpSubAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpSubAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpSubAll.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpSubAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpWrite.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpWrite.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpWrite.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpWrite.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormsEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormsEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormsEmpty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormsEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoContext.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoContext.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoContext.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoContext.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoType.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoType.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpInvoke.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpInvoke.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpInvoke.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpInvoke.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpReadAll.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpReadAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpReadAll.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpReadAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpSub.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpSub.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpSub.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpSub.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpWriteMulti.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpWriteMulti.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpWriteMulti.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpWriteMulti.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormsEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormsEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormsEmpty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormsEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormNoOp.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormNoOp.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormNoOp.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormNoOp.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpArrayEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpArrayEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpArrayEmpty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpArrayEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpElementEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpElementEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpElementEmpty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpElementEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpEmpty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpReadOne.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpReadOne.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpReadOne.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpReadOne.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpSubOne.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpSubOne.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpSubOne.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpSubOne.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpWriteOne.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpWriteOne.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpWriteOne.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpWriteOne.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormsEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormsEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormsEmpty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormsEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsNotObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsNotObject.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsNotObject.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsNotObject.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeNotString.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeUnsupported.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeUnsupported.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeUnsupported.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeUnsupported.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMaxNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMaxNotNumeric.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMaxNotNumeric.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMaxNotNumeric.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMinNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMinNotNumeric.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMinNotNumeric.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMinNotNumeric.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesNotObject.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesNotObject.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesNotObject.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesNotObject.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeNotString.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMaxNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMaxNotNumeric.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMaxNotNumeric.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMaxNotNumeric.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMinNotNumeric.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMinNotNumeric.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMinNotNumeric.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMinNotNumeric.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectConstPropertyTypeUnsupported.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectConstPropertyTypeUnsupported.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectConstPropertyTypeUnsupported.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectConstPropertyTypeUnsupported.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeNotString.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeUnsupported.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeUnsupported.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeUnsupported.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeUnsupported.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectRequiredNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectRequiredNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectRequiredNotString.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectRequiredNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringContentEncodingNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringContentEncodingNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringContentEncodingNotString.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringContentEncodingNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringFormatNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringFormatNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringFormatNotString.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringFormatNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringPatternNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringPatternNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringPatternNotString.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringPatternNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeNotString.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeUnsupported.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeUnsupported.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeUnsupported.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeUnsupported.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TitleNotString.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TitleNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TitleNotString.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TitleNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TypeEmpty.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TypeEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TypeEmpty.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TypeEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TypeNotThingModel.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TypeNotThingModel.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TypeNotThingModel.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TypeNotThingModel.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkNoRel.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkNoRel.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkNoRel.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkNoRel.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkOtherRel.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkOtherRel.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkOtherRel.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkOtherRel.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/Noop.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/Noop.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/Noop.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/Noop.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TD.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TD.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TM.json From cc55bfb55fbee7e180e06c00d490396d725b6da5 Mon Sep 17 00:00:00 2001 From: "John (JD) Douceur" Date: Wed, 7 Jan 2026 16:33:06 -0800 Subject: [PATCH 37/52] rename testing folder from thing-descriptions to thing-models --- .../ProtocolCompilerTester.cs | 4 +-- .../test-cases/success/LinkExtends.json | 7 +++++ .../.vscode/settings.json | 0 ...AdditionalResponseContentTypeEmpty.TM.json | 0 ...mAdditionalResponseContentTypeText.TM.json | 0 ...ResponseNoMatchingSchemaDefinition.TM.json | 0 ...tionFormAdditionalResponseNoSchema.TM.json | 0 ...itionalResponseNoSchemaDefinitions.TM.json | 0 ...ionFormAdditionalResponseNoSuccess.TM.json | 0 ...itionalResponseSchemaDefinitionMap.TM.json | 0 ...lResponseSchemaDefinitionNotObject.TM.json | 0 ...nFormAdditionalResponseSchemaEmpty.TM.json | 0 ...nFormAdditionalResponseSuccessTrue.TM.json | 0 ...itionalResponseUnsupportedProperty.TM.json | 0 ...ionFormAdditionalResponsesMultiple.TM.json | 0 .../ActionFormContentTypeText.TM.json | 0 .../ActionFormHeaderCodeEmpty.TM.json | 0 ...aderCodeNoMatchingSchemaDefinition.TM.json | 0 ...nFormHeaderCodeNoSchemaDefinitions.TM.json | 0 ...mHeaderCodeSchemaDefinitionNotEnum.TM.json | 0 ...tionFormHeaderInfoContentTypeEmpty.TM.json | 0 ...onFormHeaderInfoContentTypeNotJson.TM.json | 0 .../ActionFormHeaderInfoNoContentType.TM.json | 0 ...aderInfoNoMatchingSchemaDefinition.TM.json | 0 .../ActionFormHeaderInfoNoSchema.TM.json | 0 ...nFormHeaderInfoNoSchemaDefinitions.TM.json | 0 ...nFormHeaderInfoSchemaDefinitionMap.TM.json | 0 ...eaderInfoSchemaDefinitionNotObject.TM.json | 0 .../ActionFormHeaderInfoSchemaEmpty.TM.json | 0 .../ActionFormHeaderInfoSuccessTrue.TM.json | 0 ...nFormHeaderInfoUnsupportedProperty.TM.json | 0 .../ActionFormHeaderInfosMultiple.TM.json | 0 .../ActionFormOpInvokeDuplicate.TM.json | 0 .../ActionFormServiceGroupEmpty.TM.json | 0 .../ActionFormTopicNoContentType.TM.json | 0 .../ActionFormTopicTokenAction.TM.json | 0 .../ActionFormTopicTokenConsumerId.TM.json | 0 .../ActionFormTopicTokenMaintainerId.TM.json | 0 .../ActionFormTopicTokenSenderId.TM.json | 0 .../ActionFormUnsupportedProperty.TM.json | 0 .../ActionFormsMultipleContentTypes.TM.json | 0 .../ActionFormsOpInvokeDuplicate.TM.json | 0 .../ActionFormsOplessAndInvoke.TM.json | 0 .../ActionFormsOplessDuplicate.TM.json | 0 .../invalidAioBinding/ActionInputMap.TM.json | 0 .../ActionInputNullAndContentTypeJson.TM.json | 0 .../ActionInputNumber.TM.json | 0 ...ionInputObjectAndContentTypeCustom.TM.json | 0 ...ActionInputObjectAndContentTypeRaw.TM.json | 0 .../ActionInputObjectConst.TM.json | 0 .../ActionInputObjectErrorMessage.TM.json | 0 .../ActionInputString.TM.json | 0 .../invalidAioBinding/ActionNoForms.TM.json | 0 .../ActionNoFormsWithTopic.TM.json | 0 .../invalidAioBinding/ActionOutputMap.TM.json | 0 ...ActionOutputNullAndContentTypeJson.TM.json | 0 .../ActionOutputNumber.TM.json | 0 ...onOutputObjectAndContentTypeCustom.TM.json | 0 ...ctionOutputObjectAndContentTypeRaw.TM.json | 0 .../ActionOutputObjectConst.TM.json | 0 .../ActionOutputObjectErrorMessage.TM.json | 0 .../ActionOutputString.TM.json | 0 .../ActionUnsupportedProperty.TM.json | 0 .../ContextDtvWrongPrefix.TM.json | 0 .../ContextDtvWrongUri.TM.json | 0 .../ContextMissingDtv.TM.json | 0 .../EventBooleanConst.TM.json | 0 .../EventFormAdditionalResponses.TM.json | 0 .../EventFormContentTypeText.TM.json | 0 .../EventFormHeaderCode.TM.json | 0 .../EventFormHeaderInfo.TM.json | 0 .../EventFormOpSubDuplicate.TM.json | 0 .../EventFormServiceGroupEmpty.TM.json | 0 .../EventFormTopicNoContentType.TM.json | 0 .../EventFormTopicTokenAction.TM.json | 0 .../EventFormTopicTokenConsumerId.TM.json | 0 .../EventFormTopicTokenExecutorId.TM.json | 0 .../EventFormTopicTokenInvokerId.TM.json | 0 .../EventFormTopicTokenMaintainerId.TM.json | 0 .../EventFormUnsupportedProperty.TM.json | 0 .../EventFormsOpSubDuplicate.TM.json | 0 .../EventFormsOplessAndSub.TM.json | 0 .../EventFormsOplessDuplicate.TM.json | 0 .../EventIntegerConst.TM.json | 0 .../invalidAioBinding/EventNoForms.TM.json | 0 ...oFormsWithTopicAndNoRootFormSubAll.TM.json | 0 .../EventNullAndContentTypeJson.TM.json | 0 .../EventNumberConst.TM.json | 0 .../EventObjectAndContentTypeCustom.TM.json | 0 .../EventObjectAndContentTypeRaw.TM.json | 0 .../EventObjectConst.TM.json | 0 .../EventObjectErrorMessage.TM.json | 0 .../EventStringConst.TM.json | 0 .../EventUnsupportedProperty.TM.json | 0 .../invalidAioBinding/LinkEmptyHref.TM.json | 0 .../invalidAioBinding/LinkEmptyType.TM.json | 0 .../invalidAioBinding/LinkNoHref.TM.json | 0 .../invalidAioBinding/LinkNoType.TM.json | 0 .../invalidAioBinding/LinkNonJsonFile.TM.json | 0 .../LinkNonexistentFile.TM.json | 0 .../invalidAioBinding/LinkTypeNotJson.TM.json | 0 .../LinkUnsupportedProperty.TM.json | 0 .../invalidAioBinding/MultipleLinks.TM.json | 0 .../invalidAioBinding/NoTitle.TM.json | 0 .../PropertyBooleanConst.TM.json | 0 ...AdditionalResponseContentTypeEmpty.TM.json | 0 ...mAdditionalResponseContentTypeText.TM.json | 0 ...ResponseNoMatchingSchemaDefinition.TM.json | 0 ...ertyFormAdditionalResponseNoSchema.TM.json | 0 ...itionalResponseNoSchemaDefinitions.TM.json | 0 ...rtyFormAdditionalResponseNoSuccess.TM.json | 0 ...itionalResponseSchemaDefinitionMap.TM.json | 0 ...lResponseSchemaDefinitionNotObject.TM.json | 0 ...yFormAdditionalResponseSchemaEmpty.TM.json | 0 ...yFormAdditionalResponseSuccessTrue.TM.json | 0 ...itionalResponseUnsupportedProperty.TM.json | 0 ...rtyFormAdditionalResponsesMultiple.TM.json | 0 .../PropertyFormContentTypeText.TM.json | 0 .../PropertyFormHeaderCode.TM.json | 0 .../PropertyFormHeaderInfo.TM.json | 0 .../PropertyFormOpReadDuplicate.TM.json | 0 .../PropertyFormOpWriteDuplicate.TM.json | 0 ...mReadAllWithoutAdditionalResponses.TM.json | 0 ...ssWithoutTopicAndNoRootFormReadAll.TM.json | 0 ...mReadAllWithoutAdditionalResponses.TM.json | 0 ...adWithoutTopicAndNoRootFormReadAll.TM.json | 0 ...icWriteWithTopicAndRootFormReadAll.TM.json | 0 .../PropertyFormServiceGroup.TM.json | 0 .../PropertyFormTopicNoContentType.TM.json | 0 .../PropertyFormTopicTokenExecutorId.TM.json | 0 .../PropertyFormTopicTokenInvokerId.TM.json | 0 ...TokenNoActionWhenNoOpAndNoReadOnly.TM.json | 0 ...enNoActionWhenNoOpAndReadOnlyFalse.TM.json | 0 ...TopicTokenNoActionWhenReadAndWrite.TM.json | 0 .../PropertyFormTopicTokenSenderId.TM.json | 0 .../PropertyFormUnsupportedProperty.TM.json | 0 ...iteMultiWithoutAdditionalResponses.TM.json | 0 ...ithoutTopicAndNoRootFormWriteMulti.TM.json | 0 .../PropertyFormsOpReadDuplicate.TM.json | 0 .../PropertyFormsOpWriteDuplicate.TM.json | 0 .../PropertyFormsOpWriteNoRead.TM.json | 0 .../PropertyFormsOplessAndRead.TM.json | 0 .../PropertyFormsOplessDuplicate.TM.json | 0 .../PropertyIntegerConst.TM.json | 0 .../invalidAioBinding/PropertyNoForms.TM.json | 0 .../PropertyNumberConst.TM.json | 0 .../PropertyObjectConst.TM.json | 0 .../PropertyObjectErrorMessage.TM.json | 0 .../PropertyStringConst.TM.json | 0 .../PropertyTypeNull.TM.json | 0 .../PropertyUnsupportedProperty.TM.json | 0 ...AdditionalResponseContentTypeEmpty.TM.json | 0 ...mAdditionalResponseContentTypeText.TM.json | 0 ...ootFormAdditionalResponseNoSuccess.TM.json | 0 .../RootFormAdditionalResponseSchema.TM.json | 0 ...tFormAdditionalResponseSuccessTrue.TM.json | 0 ...itionalResponseUnsupportedProperty.TM.json | 0 ...otFormAdditionalResponsesAndSubAll.TM.json | 0 ...ootFormAdditionalResponsesMultiple.TM.json | 0 .../RootFormContentTypeCustom.TM.json | 0 .../RootFormContentTypeRaw.TM.json | 0 .../RootFormContentTypeText.TM.json | 0 .../RootFormHeaderCode.TM.json | 0 .../RootFormHeaderInfo.TM.json | 0 .../RootFormNoContentType.TM.json | 0 .../invalidAioBinding/RootFormNoTopic.TM.json | 0 .../RootFormOpReadAllAndSubAll.TM.json | 0 .../RootFormOpReadAllDuplicate.TM.json | 0 .../RootFormOpSubAllDuplicate.TM.json | 0 .../RootFormOpWiteMultiAndSubAll.TM.json | 0 .../RootFormOpWriteMultiDuplicate.TM.json | 0 .../RootFormReadAllButNoProperties.TM.json | 0 .../RootFormServiceGroupEmpty.TM.json | 0 .../RootFormServiceGroupNoSubAll.TM.json | 0 .../RootFormSubAllButNoEvents.TM.json | 0 .../RootFormTopicEmpty.TM.json | 0 .../RootFormTopicLevelEmpty.TM.json | 0 .../RootFormTopicLevelInvalid.TM.json | 0 .../RootFormTopicReservedStart.TM.json | 0 ...RootFormTopicTokenActionWhenSubAll.TM.json | 0 ...FormTopicTokenConsumerIdWhenSubAll.TM.json | 0 .../RootFormTopicTokenCustomEmpty.TM.json | 0 .../RootFormTopicTokenCustomInvalid.TM.json | 0 .../RootFormTopicTokenEmpty.TM.json | 0 .../RootFormTopicTokenExecutorId.TM.json | 0 .../RootFormTopicTokenInvokerId.TM.json | 0 ...rmTopicTokenMaintainerIdWhenSubAll.TM.json | 0 ...enNoActionWhenReadAllAndWriteMulti.TM.json | 0 ...tFormTopicTokenSenderIdWhenReadAll.TM.json | 0 ...rmTopicTokenSenderIdWhenWriteMulti.TM.json | 0 .../RootFormTopicTokenUnrecognized.TM.json | 0 ...mWriteMultiButNoWritableProperties.TM.json | 0 .../RootFormsOpReadAllDuplicate.TM.json | 0 .../RootFormsOpSubAllDuplicate.TM.json | 0 .../RootFormsOpWriteMultiDuplicate.TM.json | 0 .../RootFormsOpWriteMultiNoReadAll.TM.json | 0 .../SchemaDefinitionArrayConst.TM.json | 0 .../SchemaDefinitionArrayItemsNoType.TM.json | 0 ...emaDefinitionArrayItemsObjectConst.TM.json | 0 .../SchemaDefinitionArrayItemsRef.TM.json | 0 ...emaDefinitionArrayItemsStringConst.TM.json | 0 ...SchemaDefinitionArrayItemsTypeNull.TM.json | 0 .../SchemaDefinitionArrayNoItems.TM.json | 0 ...initionBooleanConstValueNotBoolean.TM.json | 0 .../SchemaDefinitionBooleanReadOnly.TM.json | 0 ...finitionBooleanUnsupportedProperty.TM.json | 0 ...efinitionIntegerConstValueAboveMax.TM.json | 0 ...efinitionIntegerConstValueBelowMin.TM.json | 0 ...initionIntegerConstValueNotInteger.TM.json | 0 ...initionIntegerConstValueNotNumeric.TM.json | 0 ...hemaDefinitionIntegerMaxNotInteger.TM.json | 0 ...SchemaDefinitionIntegerMinAboveMax.TM.json | 0 ...hemaDefinitionIntegerMinNotInteger.TM.json | 0 .../SchemaDefinitionIntegerReadOnly.TM.json | 0 ...finitionIntegerUnsupportedProperty.TM.json | 0 ...itionMapAdditionalPropertiesNoType.TM.json | 0 ...MapAdditionalPropertiesObjectConst.TM.json | 0 ...finitionMapAdditionalPropertiesRef.TM.json | 0 ...MapAdditionalPropertiesStringConst.TM.json | 0 ...ionMapAdditionalPropertiesTypeNull.TM.json | 0 .../SchemaDefinitionMapConst.TM.json | 0 .../SchemaDefinitionNoType.TM.json | 0 ...DefinitionNumberConstValueAboveMax.TM.json | 0 ...DefinitionNumberConstValueBelowMin.TM.json | 0 ...finitionNumberConstValueNotNumeric.TM.json | 0 .../SchemaDefinitionNumberMinAboveMax.TM.json | 0 .../SchemaDefinitionNumberReadOnly.TM.json | 0 ...efinitionNumberUnsupportedProperty.TM.json | 0 ...maDefinitionObjectBothDeterminants.TM.json | 0 ...hemaDefinitionObjectConstNotObject.TM.json | 0 ...ionObjectConstPropertyBooleanConst.TM.json | 0 ...jectConstPropertyBooleanNotBoolean.TM.json | 0 ...PropertyBooleanUnsupportedProperty.TM.json | 0 ...ObjectConstPropertyIntegerAboveMax.TM.json | 0 ...ObjectConstPropertyIntegerBelowMin.TM.json | 0 ...ionObjectConstPropertyIntegerConst.TM.json | 0 ...jectConstPropertyIntegerNotInteger.TM.json | 0 ...jectConstPropertyIntegerNotNumeric.TM.json | 0 ...PropertyIntegerUnsupportedProperty.TM.json | 0 ...efinitionObjectConstPropertyNoType.TM.json | 0 ...finitionObjectConstPropertyNoValue.TM.json | 0 ...nObjectConstPropertyNumberAboveMax.TM.json | 0 ...nObjectConstPropertyNumberBelowMin.TM.json | 0 ...tionObjectConstPropertyNumberConst.TM.json | 0 ...bjectConstPropertyNumberNotNumeric.TM.json | 0 ...tPropertyNumberUnsupportedProperty.TM.json | 0 ...tionObjectConstPropertyStringConst.TM.json | 0 ...tPropertyStringUnsupportedProperty.TM.json | 0 ...tConstPropertyStringValueNotString.TM.json | 0 ...nitionObjectConstPropertyTypeArray.TM.json | 0 ...initionObjectConstPropertyTypeNull.TM.json | 0 ...itionObjectConstPropertyTypeObject.TM.json | 0 ...tionObjectConstUnsupportedProperty.TM.json | 0 ...DefinitionObjectConstValueNoSchema.TM.json | 0 ...nitionObjectErrorMessageNoProperty.TM.json | 0 ...initionObjectErrorMessageNotString.TM.json | 0 ...bjectErrorMessagePropertyNotString.TM.json | 0 ...chemaDefinitionObjectNoDeterminant.TM.json | 0 ...efinitionObjectPropertiesNotObject.TM.json | 0 ...hemaDefinitionObjectPropertyNoType.TM.json | 0 ...efinitionObjectPropertyObjectConst.TM.json | 0 .../SchemaDefinitionObjectPropertyRef.TM.json | 0 ...efinitionObjectPropertyStringConst.TM.json | 0 ...maDefinitionObjectPropertyTypeNull.TM.json | 0 ...DefinitionObjectRequiredNoProperty.TM.json | 0 .../SchemaDefinitionRef.TM.json | 0 ...finitionStringConstContentEncoding.TM.json | 0 .../SchemaDefinitionStringConstFormat.TM.json | 0 ...SchemaDefinitionStringConstPattern.TM.json | 0 ...tionStringConstUnsupportedProperty.TM.json | 0 ...efinitionStringConstValueNotString.TM.json | 0 ...ingContentEncodingUnsupportedValue.TM.json | 0 .../SchemaDefinitionStringEnumConst.TM.json | 0 ...efinitionStringEnumContentEncoding.TM.json | 0 ...DefinitionStringEnumElementInvalid.TM.json | 0 .../SchemaDefinitionStringEnumFormat.TM.json | 0 .../SchemaDefinitionStringEnumPattern.TM.json | 0 ...SchemaDefinitionStringEnumReadOnly.TM.json | 0 ...itionStringEnumUnsupportedProperty.TM.json | 0 ...tionStringFormatAndContentEncoding.TM.json | 0 ...maDefinitionStringFormatAndPattern.TM.json | 0 ...nitionStringFormatUnsupportedValue.TM.json | 0 ...ionStringPatternAndContentEncoding.TM.json | 0 ...nStringPatternNotDurationOrDecimal.TM.json | 0 ...efinitionStringPatternRegexInvalid.TM.json | 0 .../SchemaDefinitionStringReadOnly.TM.json | 0 ...efinitionStringUnsupportedProperty.TM.json | 0 .../SchemaDefinitionTypeNull.TM.json | 0 .../ThingUnsupportedProperty.TM.json | 0 .../invalidAioBinding/TitleEmpty.TM.json | 0 .../invalidAioBinding/TitleInvalid.TM.json | 0 .../invalidJson/ArrayKey.TM.json | 0 .../invalidJson/BooleanKey.TM.json | 0 .../invalidJson/DuplicateKey.TM.json | 0 .../invalidJson/MissingColon.TM.json | 0 .../invalidJson/MissingComma.TM.json | 0 .../invalidJson/MissingElement.TM.json | 0 .../invalidJson/MissingKey.TM.json | 0 .../invalidJson/MissingValue.TM.json | 0 .../invalidJson/NumericKey.TM.json | 0 .../invalidJson/ObjectKey.TM.json | 0 .../invalidJson/TrailingComma.TM.json | 0 .../invalidJson/UnclosedArray.TM.json | 0 .../invalidJson/UnclosedObject.TM.json | 0 .../invalidThing/ActionFormOpRead.TM.json | 0 .../invalidThing/ActionFormOpSub.TM.json | 0 .../invalidThing/ActionFormOpWrite.TM.json | 0 .../invalidThing/ActionFormsEmpty.TM.json | 0 .../invalidThing/ContextMissingWot.TM.json | 0 .../invalidThing/ContextWrongType.TM.json | 0 .../invalidThing/EventFormOpInvoke.TM.json | 0 .../invalidThing/EventFormOpRead.TM.json | 0 .../invalidThing/EventFormOpSubAll.TM.json | 0 .../invalidThing/EventFormOpWrite.TM.json | 0 .../invalidThing/EventFormsEmpty.TM.json | 0 .../invalidThing/NoContext.TM.json | 0 .../invalidThing/NoType.TM.json | 0 .../invalidThing/PropertyFormOpInvoke.TM.json | 0 .../PropertyFormOpReadAll.TM.json | 0 .../invalidThing/PropertyFormOpSub.TM.json | 0 .../PropertyFormOpWriteMulti.TM.json | 0 .../invalidThing/PropertyFormsEmpty.TM.json | 0 .../invalidThing/RootFormNoOp.TM.json | 0 .../invalidThing/RootFormOpArrayEmpty.TM.json | 0 .../RootFormOpElementEmpty.TM.json | 0 .../invalidThing/RootFormOpEmpty.TM.json | 0 .../invalidThing/RootFormOpReadOne.TM.json | 0 .../invalidThing/RootFormOpSubOne.TM.json | 0 .../invalidThing/RootFormOpWriteOne.TM.json | 0 .../invalidThing/RootFormsEmpty.TM.json | 0 ...chemaDefinitionArrayItemsNotObject.TM.json | 0 ...aDefinitionArrayItemsTypeNotString.TM.json | 0 ...efinitionArrayItemsTypeUnsupported.TM.json | 0 ...hemaDefinitionIntegerMaxNotNumeric.TM.json | 0 ...hemaDefinitionIntegerMinNotNumeric.TM.json | 0 ...onMapAdditionalPropertiesNotObject.TM.json | 0 ...pAdditionalPropertiesTypeNotString.TM.json | 0 ...dditionalPropertiesTypeUnsupported.TM.json | 0 ...chemaDefinitionNumberMaxNotNumeric.TM.json | 0 ...chemaDefinitionNumberMinNotNumeric.TM.json | 0 ...ObjectConstPropertyTypeUnsupported.TM.json | 0 ...initionObjectPropertyTypeNotString.TM.json | 0 ...itionObjectPropertyTypeUnsupported.TM.json | 0 ...aDefinitionObjectRequiredNotString.TM.json | 0 ...tionStringContentEncodingNotString.TM.json | 0 ...emaDefinitionStringFormatNotString.TM.json | 0 ...maDefinitionStringPatternNotString.TM.json | 0 .../SchemaDefinitionTypeNotString.TM.json | 0 .../SchemaDefinitionTypeUnsupported.TM.json | 0 .../invalidThing/TitleNotString.TM.json | 0 .../invalidThing/TypeEmpty.TM.json | 0 .../invalidThing/TypeNotThingModel.TM.json | 0 .../thing-models/valid/LinkExtends.TM.json | 30 +++++++++++++++++++ .../valid/LinkNoRel.TM.json | 0 .../valid/LinkOtherRel.TM.json | 0 .../valid/Noop.TM.json | 0 ...eadablePropertyAdditionalResponses.TM.json | 0 ...ritablePropertyAdditionalResponses.TM.json | 0 358 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/LinkExtends.json rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/.vscode/settings.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormAdditionalResponseContentTypeEmpty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormAdditionalResponseContentTypeText.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormAdditionalResponseNoMatchingSchemaDefinition.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormAdditionalResponseNoSchema.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormAdditionalResponseNoSchemaDefinitions.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormAdditionalResponseNoSuccess.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionMap.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionNotObject.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormAdditionalResponseSchemaEmpty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormAdditionalResponseSuccessTrue.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormAdditionalResponseUnsupportedProperty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormAdditionalResponsesMultiple.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormContentTypeText.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormHeaderCodeEmpty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormHeaderCodeNoMatchingSchemaDefinition.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormHeaderCodeNoSchemaDefinitions.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormHeaderCodeSchemaDefinitionNotEnum.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormHeaderInfoContentTypeEmpty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormHeaderInfoContentTypeNotJson.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormHeaderInfoNoContentType.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormHeaderInfoNoMatchingSchemaDefinition.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormHeaderInfoNoSchema.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormHeaderInfoNoSchemaDefinitions.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionMap.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionNotObject.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormHeaderInfoSchemaEmpty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormHeaderInfoSuccessTrue.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormHeaderInfoUnsupportedProperty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormHeaderInfosMultiple.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormOpInvokeDuplicate.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormServiceGroupEmpty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormTopicNoContentType.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormTopicTokenAction.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormTopicTokenConsumerId.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormTopicTokenMaintainerId.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormTopicTokenSenderId.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormUnsupportedProperty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormsMultipleContentTypes.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormsOpInvokeDuplicate.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormsOplessAndInvoke.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionFormsOplessDuplicate.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionInputMap.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionInputNullAndContentTypeJson.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionInputNumber.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionInputObjectAndContentTypeCustom.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionInputObjectAndContentTypeRaw.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionInputObjectConst.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionInputObjectErrorMessage.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionInputString.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionNoForms.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionNoFormsWithTopic.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionOutputMap.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionOutputNullAndContentTypeJson.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionOutputNumber.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionOutputObjectAndContentTypeCustom.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionOutputObjectAndContentTypeRaw.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionOutputObjectConst.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionOutputObjectErrorMessage.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionOutputString.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ActionUnsupportedProperty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ContextDtvWrongPrefix.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ContextDtvWrongUri.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ContextMissingDtv.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/EventBooleanConst.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/EventFormAdditionalResponses.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/EventFormContentTypeText.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/EventFormHeaderCode.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/EventFormHeaderInfo.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/EventFormOpSubDuplicate.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/EventFormServiceGroupEmpty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/EventFormTopicNoContentType.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/EventFormTopicTokenAction.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/EventFormTopicTokenConsumerId.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/EventFormTopicTokenExecutorId.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/EventFormTopicTokenInvokerId.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/EventFormTopicTokenMaintainerId.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/EventFormUnsupportedProperty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/EventFormsOpSubDuplicate.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/EventFormsOplessAndSub.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/EventFormsOplessDuplicate.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/EventIntegerConst.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/EventNoForms.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/EventNoFormsWithTopicAndNoRootFormSubAll.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/EventNullAndContentTypeJson.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/EventNumberConst.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/EventObjectAndContentTypeCustom.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/EventObjectAndContentTypeRaw.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/EventObjectConst.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/EventObjectErrorMessage.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/EventStringConst.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/EventUnsupportedProperty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/LinkEmptyHref.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/LinkEmptyType.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/LinkNoHref.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/LinkNoType.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/LinkNonJsonFile.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/LinkNonexistentFile.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/LinkTypeNotJson.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/LinkUnsupportedProperty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/MultipleLinks.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/NoTitle.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyBooleanConst.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormAdditionalResponseContentTypeEmpty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormAdditionalResponseContentTypeText.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormAdditionalResponseNoSchema.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormAdditionalResponseNoSchemaDefinitions.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormAdditionalResponseNoSuccess.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionMap.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionNotObject.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormAdditionalResponseSchemaEmpty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormAdditionalResponseSuccessTrue.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormAdditionalResponseUnsupportedProperty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormAdditionalResponsesMultiple.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormContentTypeText.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormHeaderCode.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormHeaderInfo.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormOpReadDuplicate.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormOpWriteDuplicate.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormReadWithoutTopicAndNoRootFormReadAll.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormServiceGroup.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormTopicNoContentType.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormTopicTokenExecutorId.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormTopicTokenInvokerId.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormTopicTokenNoActionWhenReadAndWrite.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormTopicTokenSenderId.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormUnsupportedProperty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormsOpReadDuplicate.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormsOpWriteDuplicate.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormsOpWriteNoRead.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormsOplessAndRead.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyFormsOplessDuplicate.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyIntegerConst.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyNoForms.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyNumberConst.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyObjectConst.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyObjectErrorMessage.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyStringConst.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyTypeNull.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/PropertyUnsupportedProperty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormAdditionalResponseContentTypeEmpty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormAdditionalResponseContentTypeText.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormAdditionalResponseNoSuccess.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormAdditionalResponseSchema.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormAdditionalResponseSuccessTrue.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormAdditionalResponseUnsupportedProperty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormAdditionalResponsesAndSubAll.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormAdditionalResponsesMultiple.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormContentTypeCustom.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormContentTypeRaw.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormContentTypeText.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormHeaderCode.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormHeaderInfo.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormNoContentType.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormNoTopic.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormOpReadAllAndSubAll.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormOpReadAllDuplicate.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormOpSubAllDuplicate.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormOpWiteMultiAndSubAll.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormOpWriteMultiDuplicate.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormReadAllButNoProperties.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormServiceGroupEmpty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormServiceGroupNoSubAll.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormSubAllButNoEvents.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormTopicEmpty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormTopicLevelEmpty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormTopicLevelInvalid.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormTopicReservedStart.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormTopicTokenActionWhenSubAll.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormTopicTokenConsumerIdWhenSubAll.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormTopicTokenCustomEmpty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormTopicTokenCustomInvalid.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormTopicTokenEmpty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormTopicTokenExecutorId.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormTopicTokenInvokerId.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormTopicTokenMaintainerIdWhenSubAll.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormTopicTokenSenderIdWhenReadAll.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormTopicTokenSenderIdWhenWriteMulti.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormTopicTokenUnrecognized.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormWriteMultiButNoWritableProperties.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormsOpReadAllDuplicate.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormsOpSubAllDuplicate.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormsOpWriteMultiDuplicate.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/RootFormsOpWriteMultiNoReadAll.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionArrayConst.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionArrayItemsNoType.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionArrayItemsObjectConst.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionArrayItemsRef.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionArrayItemsStringConst.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionArrayItemsTypeNull.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionArrayNoItems.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionBooleanConstValueNotBoolean.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionBooleanReadOnly.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionBooleanUnsupportedProperty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionIntegerConstValueAboveMax.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionIntegerConstValueBelowMin.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionIntegerConstValueNotInteger.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionIntegerConstValueNotNumeric.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionIntegerMaxNotInteger.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionIntegerMinAboveMax.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionIntegerMinNotInteger.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionIntegerReadOnly.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionIntegerUnsupportedProperty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesNoType.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesObjectConst.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesStringConst.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesTypeNull.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionMapConst.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionNoType.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionNumberConstValueAboveMax.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionNumberConstValueBelowMin.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionNumberConstValueNotNumeric.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionNumberMinAboveMax.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionNumberReadOnly.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionNumberUnsupportedProperty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectBothDeterminants.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectConstNotObject.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanConst.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerAboveMax.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerBelowMin.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerConst.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotInteger.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoType.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoValue.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberAboveMax.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberBelowMin.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberConst.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberNotNumeric.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringConst.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringValueNotString.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeArray.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeNull.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeObject.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectConstUnsupportedProperty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectConstValueNoSchema.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectErrorMessageNoProperty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectErrorMessageNotString.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectErrorMessagePropertyNotString.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectNoDeterminant.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectPropertiesNotObject.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectPropertyNoType.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectPropertyObjectConst.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectPropertyRef.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectPropertyStringConst.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectPropertyTypeNull.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionObjectRequiredNoProperty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionRef.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionStringConstContentEncoding.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionStringConstFormat.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionStringConstPattern.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionStringConstUnsupportedProperty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionStringConstValueNotString.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionStringContentEncodingUnsupportedValue.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionStringEnumConst.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionStringEnumContentEncoding.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionStringEnumElementInvalid.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionStringEnumFormat.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionStringEnumPattern.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionStringEnumReadOnly.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionStringEnumUnsupportedProperty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionStringFormatAndContentEncoding.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionStringFormatAndPattern.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionStringFormatUnsupportedValue.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionStringPatternAndContentEncoding.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionStringPatternNotDurationOrDecimal.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionStringPatternRegexInvalid.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionStringReadOnly.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionStringUnsupportedProperty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/SchemaDefinitionTypeNull.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/ThingUnsupportedProperty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/TitleEmpty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidAioBinding/TitleInvalid.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidJson/ArrayKey.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidJson/BooleanKey.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidJson/DuplicateKey.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidJson/MissingColon.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidJson/MissingComma.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidJson/MissingElement.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidJson/MissingKey.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidJson/MissingValue.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidJson/NumericKey.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidJson/ObjectKey.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidJson/TrailingComma.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidJson/UnclosedArray.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidJson/UnclosedObject.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/ActionFormOpRead.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/ActionFormOpSub.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/ActionFormOpWrite.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/ActionFormsEmpty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/ContextMissingWot.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/ContextWrongType.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/EventFormOpInvoke.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/EventFormOpRead.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/EventFormOpSubAll.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/EventFormOpWrite.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/EventFormsEmpty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/NoContext.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/NoType.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/PropertyFormOpInvoke.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/PropertyFormOpReadAll.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/PropertyFormOpSub.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/PropertyFormOpWriteMulti.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/PropertyFormsEmpty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/RootFormNoOp.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/RootFormOpArrayEmpty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/RootFormOpElementEmpty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/RootFormOpEmpty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/RootFormOpReadOne.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/RootFormOpSubOne.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/RootFormOpWriteOne.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/RootFormsEmpty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/SchemaDefinitionArrayItemsNotObject.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/SchemaDefinitionArrayItemsTypeNotString.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/SchemaDefinitionArrayItemsTypeUnsupported.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/SchemaDefinitionIntegerMaxNotNumeric.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/SchemaDefinitionIntegerMinNotNumeric.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/SchemaDefinitionMapAdditionalPropertiesNotObject.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeNotString.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/SchemaDefinitionNumberMaxNotNumeric.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/SchemaDefinitionNumberMinNotNumeric.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/SchemaDefinitionObjectConstPropertyTypeUnsupported.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/SchemaDefinitionObjectPropertyTypeNotString.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/SchemaDefinitionObjectPropertyTypeUnsupported.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/SchemaDefinitionObjectRequiredNotString.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/SchemaDefinitionStringContentEncodingNotString.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/SchemaDefinitionStringFormatNotString.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/SchemaDefinitionStringPatternNotString.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/SchemaDefinitionTypeNotString.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/SchemaDefinitionTypeUnsupported.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/TitleNotString.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/TypeEmpty.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/invalidThing/TypeNotThingModel.TM.json (100%) create mode 100644 codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/valid/LinkExtends.TM.json rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/valid/LinkNoRel.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/valid/LinkOtherRel.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/valid/Noop.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/valid/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TM.json (100%) rename codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/{thing-descriptions => thing-models}/valid/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TM.json (100%) diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/ProtocolCompilerTester.cs b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/ProtocolCompilerTester.cs index 40797e96e7..3c821c11c7 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/ProtocolCompilerTester.cs +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/ProtocolCompilerTester.cs @@ -13,7 +13,7 @@ public class ProtocolCompilerTester private const string testCasesPath = $"{basePath}/test-cases"; private const string successCasesPath = $"{testCasesPath}/success"; private const string failureCasesPath = $"{testCasesPath}/failure"; - private const string tdPath = $"{basePath}/thing-descriptions"; + private const string tmPath = $"{basePath}/thing-models"; private const string schemasPath = $"{basePath}/schemas"; private const string namerPath = $"{basePath}/name-config"; private const string sandboxPath = $"{basePath}/sandbox"; @@ -190,7 +190,7 @@ private static OptionContainer GetOptionContainer(string testCaseName, TestComma Assert.Fail($"Test case '{testCaseName}' specifies absolute path for working directory, which is not supported in test."); } - FileInfo[] thingFiles = commandLine.ThingFiles.Select(tf => new FileInfo(Path.GetFullPath($"{tdPath}/{tf}"))).ToArray(); + FileInfo[] thingFiles = commandLine.ThingFiles.Select(tf => new FileInfo(Path.GetFullPath($"{tmPath}/{tf}"))).ToArray(); string[] schemaFiles = commandLine.SchemaFiles.Select(tf => Path.GetFullPath($"{schemasPath}/{tf}")).ToArray(); FileInfo? typeNamerFile = commandLine.TypeNamerFile != null ? new FileInfo(Path.GetFullPath($"{namerPath}/{commandLine.TypeNamerFile}")) : null; DirectoryInfo outputDir = new DirectoryInfo(commandLine.OutputDir != null ? Path.GetFullPath($"{testCaseSandboxPath}/{commandLine.OutputDir}") : $"{testCaseSandboxPath}/{CommandPerformer.DefaultOutDir}"); diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/LinkExtends.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/LinkExtends.json new file mode 100644 index 0000000000..d8a5c10f3d --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/LinkExtends.json @@ -0,0 +1,7 @@ +{ + "success": true, + "commandLine": { + "thingFiles": [ "valid/LinkExtends.TM.json" ], + "lang": "none" + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/.vscode/settings.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/.vscode/settings.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/.vscode/settings.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/.vscode/settings.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeEmpty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseContentTypeEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeEmpty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseContentTypeEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeText.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseContentTypeText.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseContentTypeText.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseContentTypeText.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoMatchingSchemaDefinition.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseNoMatchingSchemaDefinition.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoMatchingSchemaDefinition.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseNoMatchingSchemaDefinition.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchema.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseNoSchema.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchema.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseNoSchema.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchemaDefinitions.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseNoSchemaDefinitions.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSchemaDefinitions.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseNoSchemaDefinitions.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSuccess.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseNoSuccess.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseNoSuccess.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseNoSuccess.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionMap.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionMap.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionMap.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionMap.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionNotObject.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionNotObject.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionNotObject.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionNotObject.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaEmpty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseSchemaEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSchemaEmpty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseSchemaEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSuccessTrue.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseSuccessTrue.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseSuccessTrue.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseSuccessTrue.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseUnsupportedProperty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponseUnsupportedProperty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponsesMultiple.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponsesMultiple.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormAdditionalResponsesMultiple.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponsesMultiple.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormContentTypeText.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormContentTypeText.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormContentTypeText.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormContentTypeText.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeEmpty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderCodeEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeEmpty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderCodeEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoMatchingSchemaDefinition.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderCodeNoMatchingSchemaDefinition.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoMatchingSchemaDefinition.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderCodeNoMatchingSchemaDefinition.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoSchemaDefinitions.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderCodeNoSchemaDefinitions.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeNoSchemaDefinitions.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderCodeNoSchemaDefinitions.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeSchemaDefinitionNotEnum.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderCodeSchemaDefinitionNotEnum.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderCodeSchemaDefinitionNotEnum.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderCodeSchemaDefinitionNotEnum.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeEmpty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoContentTypeEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeEmpty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoContentTypeEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeNotJson.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoContentTypeNotJson.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoContentTypeNotJson.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoContentTypeNotJson.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoContentType.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoNoContentType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoContentType.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoNoContentType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoMatchingSchemaDefinition.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoNoMatchingSchemaDefinition.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoMatchingSchemaDefinition.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoNoMatchingSchemaDefinition.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchema.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoNoSchema.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchema.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoNoSchema.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchemaDefinitions.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoNoSchemaDefinitions.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoNoSchemaDefinitions.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoNoSchemaDefinitions.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionMap.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionMap.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionMap.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionMap.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionNotObject.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionNotObject.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionNotObject.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionNotObject.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaEmpty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoSchemaEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSchemaEmpty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoSchemaEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSuccessTrue.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoSuccessTrue.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoSuccessTrue.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoSuccessTrue.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoUnsupportedProperty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfoUnsupportedProperty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfosMultiple.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfosMultiple.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormHeaderInfosMultiple.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfosMultiple.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormOpInvokeDuplicate.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormOpInvokeDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormOpInvokeDuplicate.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormOpInvokeDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormServiceGroupEmpty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormServiceGroupEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormServiceGroupEmpty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormServiceGroupEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicNoContentType.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormTopicNoContentType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicNoContentType.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormTopicNoContentType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenAction.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormTopicTokenAction.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenAction.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormTopicTokenAction.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenConsumerId.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormTopicTokenConsumerId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenConsumerId.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormTopicTokenConsumerId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenMaintainerId.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormTopicTokenMaintainerId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenMaintainerId.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormTopicTokenMaintainerId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenSenderId.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormTopicTokenSenderId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormTopicTokenSenderId.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormTopicTokenSenderId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormUnsupportedProperty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormUnsupportedProperty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsMultipleContentTypes.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormsMultipleContentTypes.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsMultipleContentTypes.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormsMultipleContentTypes.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOpInvokeDuplicate.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormsOpInvokeDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOpInvokeDuplicate.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormsOpInvokeDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessAndInvoke.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormsOplessAndInvoke.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessAndInvoke.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormsOplessAndInvoke.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessDuplicate.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormsOplessDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionFormsOplessDuplicate.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormsOplessDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputMap.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputMap.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputMap.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputMap.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNullAndContentTypeJson.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputNullAndContentTypeJson.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNullAndContentTypeJson.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputNullAndContentTypeJson.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNumber.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputNumber.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputNumber.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputNumber.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeCustom.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputObjectAndContentTypeCustom.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeCustom.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputObjectAndContentTypeCustom.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeRaw.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputObjectAndContentTypeRaw.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectAndContentTypeRaw.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputObjectAndContentTypeRaw.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectConst.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputObjectConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectConst.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputObjectConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectErrorMessage.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputObjectErrorMessage.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputObjectErrorMessage.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputObjectErrorMessage.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputString.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionInputString.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionNoForms.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionNoForms.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionNoForms.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionNoForms.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionNoFormsWithTopic.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionNoFormsWithTopic.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionNoFormsWithTopic.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionNoFormsWithTopic.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputMap.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputMap.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputMap.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputMap.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNullAndContentTypeJson.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputNullAndContentTypeJson.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNullAndContentTypeJson.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputNullAndContentTypeJson.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNumber.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputNumber.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputNumber.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputNumber.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeCustom.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputObjectAndContentTypeCustom.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeCustom.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputObjectAndContentTypeCustom.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeRaw.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputObjectAndContentTypeRaw.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectAndContentTypeRaw.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputObjectAndContentTypeRaw.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectConst.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputObjectConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectConst.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputObjectConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectErrorMessage.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputObjectErrorMessage.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputObjectErrorMessage.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputObjectErrorMessage.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputString.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionOutputString.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionUnsupportedProperty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ActionUnsupportedProperty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongPrefix.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ContextDtvWrongPrefix.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongPrefix.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ContextDtvWrongPrefix.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongUri.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ContextDtvWrongUri.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextDtvWrongUri.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ContextDtvWrongUri.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextMissingDtv.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ContextMissingDtv.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ContextMissingDtv.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ContextMissingDtv.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventBooleanConst.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventBooleanConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventBooleanConst.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventBooleanConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormAdditionalResponses.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormAdditionalResponses.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormAdditionalResponses.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormAdditionalResponses.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormContentTypeText.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormContentTypeText.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormContentTypeText.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormContentTypeText.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderCode.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormHeaderCode.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderCode.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormHeaderCode.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderInfo.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormHeaderInfo.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormHeaderInfo.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormHeaderInfo.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormOpSubDuplicate.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormOpSubDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormOpSubDuplicate.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormOpSubDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormServiceGroupEmpty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormServiceGroupEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormServiceGroupEmpty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormServiceGroupEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicNoContentType.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormTopicNoContentType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicNoContentType.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormTopicNoContentType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenAction.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormTopicTokenAction.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenAction.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormTopicTokenAction.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenConsumerId.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormTopicTokenConsumerId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenConsumerId.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormTopicTokenConsumerId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenExecutorId.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormTopicTokenExecutorId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenExecutorId.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormTopicTokenExecutorId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenInvokerId.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormTopicTokenInvokerId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenInvokerId.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormTopicTokenInvokerId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenMaintainerId.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormTopicTokenMaintainerId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormTopicTokenMaintainerId.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormTopicTokenMaintainerId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormUnsupportedProperty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormUnsupportedProperty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOpSubDuplicate.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormsOpSubDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOpSubDuplicate.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormsOpSubDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessAndSub.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormsOplessAndSub.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessAndSub.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormsOplessAndSub.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessDuplicate.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormsOplessDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventFormsOplessDuplicate.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormsOplessDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventIntegerConst.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventIntegerConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventIntegerConst.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventIntegerConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNoForms.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventNoForms.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNoForms.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventNoForms.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNoFormsWithTopicAndNoRootFormSubAll.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventNoFormsWithTopicAndNoRootFormSubAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNoFormsWithTopicAndNoRootFormSubAll.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventNoFormsWithTopicAndNoRootFormSubAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNullAndContentTypeJson.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventNullAndContentTypeJson.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNullAndContentTypeJson.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventNullAndContentTypeJson.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNumberConst.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventNumberConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventNumberConst.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventNumberConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeCustom.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventObjectAndContentTypeCustom.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeCustom.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventObjectAndContentTypeCustom.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeRaw.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventObjectAndContentTypeRaw.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectAndContentTypeRaw.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventObjectAndContentTypeRaw.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectConst.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventObjectConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectConst.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventObjectConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectErrorMessage.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventObjectErrorMessage.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventObjectErrorMessage.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventObjectErrorMessage.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventStringConst.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventStringConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventStringConst.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventStringConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventUnsupportedProperty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/EventUnsupportedProperty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyHref.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkEmptyHref.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyHref.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkEmptyHref.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyType.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkEmptyType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkEmptyType.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkEmptyType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoHref.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkNoHref.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoHref.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkNoHref.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoType.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkNoType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNoType.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkNoType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonJsonFile.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkNonJsonFile.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonJsonFile.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkNonJsonFile.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonexistentFile.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkNonexistentFile.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkNonexistentFile.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkNonexistentFile.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkTypeNotJson.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkTypeNotJson.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkTypeNotJson.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkTypeNotJson.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkUnsupportedProperty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/LinkUnsupportedProperty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/MultipleLinks.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/MultipleLinks.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/MultipleLinks.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/MultipleLinks.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/NoTitle.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/NoTitle.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/NoTitle.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/NoTitle.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyBooleanConst.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyBooleanConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyBooleanConst.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyBooleanConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeEmpty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseContentTypeEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeEmpty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseContentTypeEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeText.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseContentTypeText.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseContentTypeText.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseContentTypeText.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchema.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseNoSchema.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchema.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseNoSchema.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchemaDefinitions.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseNoSchemaDefinitions.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSchemaDefinitions.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseNoSchemaDefinitions.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSuccess.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseNoSuccess.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseNoSuccess.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseNoSuccess.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionMap.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionMap.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionMap.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionMap.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionNotObject.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionNotObject.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionNotObject.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionNotObject.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaEmpty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseSchemaEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSchemaEmpty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseSchemaEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSuccessTrue.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseSuccessTrue.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseSuccessTrue.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseSuccessTrue.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseUnsupportedProperty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponseUnsupportedProperty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponsesMultiple.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponsesMultiple.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormAdditionalResponsesMultiple.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponsesMultiple.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormContentTypeText.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormContentTypeText.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormContentTypeText.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormContentTypeText.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderCode.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormHeaderCode.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderCode.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormHeaderCode.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderInfo.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormHeaderInfo.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormHeaderInfo.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormHeaderInfo.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpReadDuplicate.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormOpReadDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpReadDuplicate.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormOpReadDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpWriteDuplicate.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormOpWriteDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOpWriteDuplicate.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormOpWriteDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicAndNoRootFormReadAll.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormReadWithoutTopicAndNoRootFormReadAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicAndNoRootFormReadAll.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormReadWithoutTopicAndNoRootFormReadAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormServiceGroup.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormServiceGroup.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormServiceGroup.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormServiceGroup.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicNoContentType.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormTopicNoContentType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicNoContentType.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormTopicNoContentType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenExecutorId.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormTopicTokenExecutorId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenExecutorId.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormTopicTokenExecutorId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenInvokerId.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormTopicTokenInvokerId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenInvokerId.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormTopicTokenInvokerId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenReadAndWrite.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormTopicTokenNoActionWhenReadAndWrite.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenNoActionWhenReadAndWrite.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormTopicTokenNoActionWhenReadAndWrite.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenSenderId.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormTopicTokenSenderId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormTopicTokenSenderId.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormTopicTokenSenderId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormUnsupportedProperty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormUnsupportedProperty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpReadDuplicate.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormsOpReadDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpReadDuplicate.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormsOpReadDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteDuplicate.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormsOpWriteDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteDuplicate.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormsOpWriteDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteNoRead.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormsOpWriteNoRead.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOpWriteNoRead.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormsOpWriteNoRead.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessAndRead.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormsOplessAndRead.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessAndRead.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormsOplessAndRead.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessDuplicate.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormsOplessDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyFormsOplessDuplicate.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormsOplessDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyIntegerConst.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyIntegerConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyIntegerConst.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyIntegerConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyNoForms.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyNoForms.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyNoForms.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyNoForms.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyNumberConst.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyNumberConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyNumberConst.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyNumberConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectConst.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyObjectConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectConst.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyObjectConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectErrorMessage.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyObjectErrorMessage.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyObjectErrorMessage.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyObjectErrorMessage.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyStringConst.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyStringConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyStringConst.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyStringConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyTypeNull.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyTypeNull.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyTypeNull.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyTypeNull.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyUnsupportedProperty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/PropertyUnsupportedProperty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeEmpty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponseContentTypeEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeEmpty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponseContentTypeEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeText.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponseContentTypeText.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseContentTypeText.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponseContentTypeText.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseNoSuccess.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponseNoSuccess.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseNoSuccess.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponseNoSuccess.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSchema.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponseSchema.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSchema.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponseSchema.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSuccessTrue.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponseSuccessTrue.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseSuccessTrue.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponseSuccessTrue.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseUnsupportedProperty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponseUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponseUnsupportedProperty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponseUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesAndSubAll.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponsesAndSubAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesAndSubAll.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponsesAndSubAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesMultiple.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponsesMultiple.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormAdditionalResponsesMultiple.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponsesMultiple.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeCustom.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormContentTypeCustom.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeCustom.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormContentTypeCustom.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeRaw.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormContentTypeRaw.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeRaw.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormContentTypeRaw.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeText.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormContentTypeText.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormContentTypeText.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormContentTypeText.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderCode.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormHeaderCode.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderCode.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormHeaderCode.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderInfo.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormHeaderInfo.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormHeaderInfo.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormHeaderInfo.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoContentType.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormNoContentType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoContentType.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormNoContentType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoTopic.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormNoTopic.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormNoTopic.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormNoTopic.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllAndSubAll.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormOpReadAllAndSubAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllAndSubAll.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormOpReadAllAndSubAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllDuplicate.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormOpReadAllDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpReadAllDuplicate.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormOpReadAllDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpSubAllDuplicate.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormOpSubAllDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpSubAllDuplicate.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormOpSubAllDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWiteMultiAndSubAll.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormOpWiteMultiAndSubAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWiteMultiAndSubAll.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormOpWiteMultiAndSubAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWriteMultiDuplicate.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormOpWriteMultiDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormOpWriteMultiDuplicate.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormOpWriteMultiDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormReadAllButNoProperties.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormReadAllButNoProperties.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormReadAllButNoProperties.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormReadAllButNoProperties.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupEmpty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormServiceGroupEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupEmpty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormServiceGroupEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupNoSubAll.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormServiceGroupNoSubAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormServiceGroupNoSubAll.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormServiceGroupNoSubAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormSubAllButNoEvents.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormSubAllButNoEvents.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormSubAllButNoEvents.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormSubAllButNoEvents.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicEmpty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicEmpty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelEmpty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicLevelEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelEmpty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicLevelEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelInvalid.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicLevelInvalid.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicLevelInvalid.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicLevelInvalid.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicReservedStart.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicReservedStart.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicReservedStart.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicReservedStart.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenActionWhenSubAll.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenActionWhenSubAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenActionWhenSubAll.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenActionWhenSubAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenConsumerIdWhenSubAll.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenConsumerIdWhenSubAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenConsumerIdWhenSubAll.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenConsumerIdWhenSubAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomEmpty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenCustomEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomEmpty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenCustomEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomInvalid.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenCustomInvalid.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenCustomInvalid.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenCustomInvalid.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenEmpty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenEmpty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenExecutorId.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenExecutorId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenExecutorId.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenExecutorId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenInvokerId.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenInvokerId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenInvokerId.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenInvokerId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenMaintainerIdWhenSubAll.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenMaintainerIdWhenSubAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenMaintainerIdWhenSubAll.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenMaintainerIdWhenSubAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenReadAll.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenSenderIdWhenReadAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenReadAll.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenSenderIdWhenReadAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenWriteMulti.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenSenderIdWhenWriteMulti.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenSenderIdWhenWriteMulti.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenSenderIdWhenWriteMulti.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenUnrecognized.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenUnrecognized.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormTopicTokenUnrecognized.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenUnrecognized.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormWriteMultiButNoWritableProperties.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormWriteMultiButNoWritableProperties.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormWriteMultiButNoWritableProperties.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormWriteMultiButNoWritableProperties.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpReadAllDuplicate.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormsOpReadAllDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpReadAllDuplicate.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormsOpReadAllDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpSubAllDuplicate.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormsOpSubAllDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpSubAllDuplicate.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormsOpSubAllDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiDuplicate.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormsOpWriteMultiDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiDuplicate.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormsOpWriteMultiDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiNoReadAll.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormsOpWriteMultiNoReadAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/RootFormsOpWriteMultiNoReadAll.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormsOpWriteMultiNoReadAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayConst.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionArrayConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayConst.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionArrayConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsNoType.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsNoType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsNoType.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsNoType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsObjectConst.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsObjectConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsObjectConst.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsObjectConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsRef.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsRef.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsRef.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsRef.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsStringConst.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsStringConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsStringConst.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsStringConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsTypeNull.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsTypeNull.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayItemsTypeNull.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsTypeNull.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayNoItems.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionArrayNoItems.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionArrayNoItems.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionArrayNoItems.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanConstValueNotBoolean.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionBooleanConstValueNotBoolean.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanConstValueNotBoolean.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionBooleanConstValueNotBoolean.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanReadOnly.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionBooleanReadOnly.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanReadOnly.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionBooleanReadOnly.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanUnsupportedProperty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionBooleanUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionBooleanUnsupportedProperty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionBooleanUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueAboveMax.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerConstValueAboveMax.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueAboveMax.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerConstValueAboveMax.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueBelowMin.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerConstValueBelowMin.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueBelowMin.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerConstValueBelowMin.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotInteger.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerConstValueNotInteger.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotInteger.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerConstValueNotInteger.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotNumeric.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerConstValueNotNumeric.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerConstValueNotNumeric.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerConstValueNotNumeric.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMaxNotInteger.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerMaxNotInteger.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMaxNotInteger.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerMaxNotInteger.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinAboveMax.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerMinAboveMax.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinAboveMax.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerMinAboveMax.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinNotInteger.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerMinNotInteger.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerMinNotInteger.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerMinNotInteger.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerReadOnly.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerReadOnly.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerReadOnly.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerReadOnly.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerUnsupportedProperty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionIntegerUnsupportedProperty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesNoType.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesNoType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesNoType.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesNoType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesObjectConst.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesObjectConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesObjectConst.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesObjectConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesStringConst.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesStringConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesStringConst.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesStringConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesTypeNull.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesTypeNull.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesTypeNull.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesTypeNull.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapConst.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionMapConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionMapConst.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionMapConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNoType.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionNoType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNoType.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionNoType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueAboveMax.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionNumberConstValueAboveMax.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueAboveMax.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionNumberConstValueAboveMax.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueBelowMin.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionNumberConstValueBelowMin.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueBelowMin.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionNumberConstValueBelowMin.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueNotNumeric.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionNumberConstValueNotNumeric.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberConstValueNotNumeric.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionNumberConstValueNotNumeric.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberMinAboveMax.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionNumberMinAboveMax.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberMinAboveMax.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionNumberMinAboveMax.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberReadOnly.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionNumberReadOnly.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberReadOnly.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionNumberReadOnly.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberUnsupportedProperty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionNumberUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionNumberUnsupportedProperty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionNumberUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectBothDeterminants.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectBothDeterminants.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectBothDeterminants.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectBothDeterminants.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstNotObject.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstNotObject.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstNotObject.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstNotObject.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanConst.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanConst.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerAboveMax.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerAboveMax.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerAboveMax.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerAboveMax.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerBelowMin.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerBelowMin.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerBelowMin.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerBelowMin.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerConst.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerConst.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotInteger.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotInteger.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotInteger.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotInteger.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoType.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoType.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoValue.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoValue.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoValue.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoValue.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberAboveMax.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberAboveMax.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberAboveMax.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberAboveMax.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberBelowMin.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberBelowMin.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberBelowMin.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberBelowMin.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberConst.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberConst.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberNotNumeric.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberNotNumeric.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberNotNumeric.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberNotNumeric.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringConst.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringConst.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringValueNotString.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringValueNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringValueNotString.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringValueNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeArray.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeArray.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeArray.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeArray.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeNull.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeNull.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeNull.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeNull.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeObject.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeObject.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeObject.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeObject.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstUnsupportedProperty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstUnsupportedProperty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstValueNoSchema.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstValueNoSchema.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectConstValueNoSchema.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstValueNoSchema.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNoProperty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectErrorMessageNoProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNoProperty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectErrorMessageNoProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNotString.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectErrorMessageNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessageNotString.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectErrorMessageNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessagePropertyNotString.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectErrorMessagePropertyNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectErrorMessagePropertyNotString.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectErrorMessagePropertyNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectNoDeterminant.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectNoDeterminant.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectNoDeterminant.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectNoDeterminant.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertiesNotObject.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertiesNotObject.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertiesNotObject.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertiesNotObject.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyNoType.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyNoType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyNoType.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyNoType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyObjectConst.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyObjectConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyObjectConst.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyObjectConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyRef.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyRef.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyRef.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyRef.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyStringConst.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyStringConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyStringConst.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyStringConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyTypeNull.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyTypeNull.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectPropertyTypeNull.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyTypeNull.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectRequiredNoProperty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectRequiredNoProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionObjectRequiredNoProperty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectRequiredNoProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionRef.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionRef.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionRef.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionRef.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstContentEncoding.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringConstContentEncoding.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstContentEncoding.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringConstContentEncoding.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstFormat.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringConstFormat.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstFormat.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringConstFormat.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstPattern.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringConstPattern.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstPattern.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringConstPattern.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstUnsupportedProperty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringConstUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstUnsupportedProperty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringConstUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstValueNotString.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringConstValueNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringConstValueNotString.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringConstValueNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringContentEncodingUnsupportedValue.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringContentEncodingUnsupportedValue.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringContentEncodingUnsupportedValue.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringContentEncodingUnsupportedValue.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumConst.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringEnumConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumConst.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringEnumConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumContentEncoding.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringEnumContentEncoding.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumContentEncoding.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringEnumContentEncoding.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumElementInvalid.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringEnumElementInvalid.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumElementInvalid.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringEnumElementInvalid.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumFormat.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringEnumFormat.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumFormat.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringEnumFormat.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumPattern.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringEnumPattern.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumPattern.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringEnumPattern.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumReadOnly.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringEnumReadOnly.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumReadOnly.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringEnumReadOnly.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumUnsupportedProperty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringEnumUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringEnumUnsupportedProperty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringEnumUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndContentEncoding.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringFormatAndContentEncoding.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndContentEncoding.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringFormatAndContentEncoding.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndPattern.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringFormatAndPattern.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatAndPattern.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringFormatAndPattern.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatUnsupportedValue.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringFormatUnsupportedValue.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringFormatUnsupportedValue.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringFormatUnsupportedValue.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternAndContentEncoding.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringPatternAndContentEncoding.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternAndContentEncoding.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringPatternAndContentEncoding.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternNotDurationOrDecimal.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringPatternNotDurationOrDecimal.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternNotDurationOrDecimal.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringPatternNotDurationOrDecimal.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternRegexInvalid.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringPatternRegexInvalid.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringPatternRegexInvalid.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringPatternRegexInvalid.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringReadOnly.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringReadOnly.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringReadOnly.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringReadOnly.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringUnsupportedProperty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionStringUnsupportedProperty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionTypeNull.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionTypeNull.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/SchemaDefinitionTypeNull.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionTypeNull.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ThingUnsupportedProperty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ThingUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/ThingUnsupportedProperty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ThingUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleEmpty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/TitleEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleEmpty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/TitleEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleInvalid.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/TitleInvalid.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidAioBinding/TitleInvalid.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/TitleInvalid.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ArrayKey.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/ArrayKey.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ArrayKey.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/ArrayKey.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/BooleanKey.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/BooleanKey.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/BooleanKey.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/BooleanKey.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/DuplicateKey.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/DuplicateKey.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/DuplicateKey.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/DuplicateKey.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingColon.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/MissingColon.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingColon.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/MissingColon.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingComma.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/MissingComma.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingComma.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/MissingComma.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingElement.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/MissingElement.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingElement.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/MissingElement.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingKey.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/MissingKey.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingKey.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/MissingKey.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingValue.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/MissingValue.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/MissingValue.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/MissingValue.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/NumericKey.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/NumericKey.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/NumericKey.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/NumericKey.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ObjectKey.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/ObjectKey.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/ObjectKey.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/ObjectKey.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/TrailingComma.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/TrailingComma.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/TrailingComma.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/TrailingComma.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedArray.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/UnclosedArray.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedArray.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/UnclosedArray.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedObject.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/UnclosedObject.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidJson/UnclosedObject.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/UnclosedObject.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpRead.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/ActionFormOpRead.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpRead.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/ActionFormOpRead.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpSub.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/ActionFormOpSub.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpSub.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/ActionFormOpSub.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpWrite.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/ActionFormOpWrite.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormOpWrite.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/ActionFormOpWrite.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormsEmpty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/ActionFormsEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ActionFormsEmpty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/ActionFormsEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextMissingWot.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/ContextMissingWot.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextMissingWot.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/ContextMissingWot.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextWrongType.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/ContextWrongType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/ContextWrongType.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/ContextWrongType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpInvoke.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/EventFormOpInvoke.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpInvoke.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/EventFormOpInvoke.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpRead.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/EventFormOpRead.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpRead.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/EventFormOpRead.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpSubAll.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/EventFormOpSubAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpSubAll.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/EventFormOpSubAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpWrite.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/EventFormOpWrite.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormOpWrite.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/EventFormOpWrite.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormsEmpty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/EventFormsEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/EventFormsEmpty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/EventFormsEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoContext.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/NoContext.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoContext.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/NoContext.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoType.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/NoType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/NoType.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/NoType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpInvoke.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/PropertyFormOpInvoke.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpInvoke.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/PropertyFormOpInvoke.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpReadAll.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/PropertyFormOpReadAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpReadAll.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/PropertyFormOpReadAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpSub.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/PropertyFormOpSub.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpSub.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/PropertyFormOpSub.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpWriteMulti.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/PropertyFormOpWriteMulti.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormOpWriteMulti.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/PropertyFormOpWriteMulti.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormsEmpty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/PropertyFormsEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/PropertyFormsEmpty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/PropertyFormsEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormNoOp.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormNoOp.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormNoOp.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormNoOp.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpArrayEmpty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormOpArrayEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpArrayEmpty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormOpArrayEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpElementEmpty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormOpElementEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpElementEmpty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormOpElementEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpEmpty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormOpEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpEmpty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormOpEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpReadOne.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormOpReadOne.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpReadOne.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormOpReadOne.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpSubOne.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormOpSubOne.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpSubOne.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormOpSubOne.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpWriteOne.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormOpWriteOne.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormOpWriteOne.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormOpWriteOne.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormsEmpty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormsEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/RootFormsEmpty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormsEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsNotObject.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionArrayItemsNotObject.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsNotObject.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionArrayItemsNotObject.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeNotString.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionArrayItemsTypeNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeNotString.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionArrayItemsTypeNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeUnsupported.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionArrayItemsTypeUnsupported.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionArrayItemsTypeUnsupported.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionArrayItemsTypeUnsupported.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMaxNotNumeric.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionIntegerMaxNotNumeric.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMaxNotNumeric.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionIntegerMaxNotNumeric.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMinNotNumeric.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionIntegerMinNotNumeric.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionIntegerMinNotNumeric.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionIntegerMinNotNumeric.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesNotObject.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionMapAdditionalPropertiesNotObject.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesNotObject.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionMapAdditionalPropertiesNotObject.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeNotString.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeNotString.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMaxNotNumeric.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionNumberMaxNotNumeric.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMaxNotNumeric.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionNumberMaxNotNumeric.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMinNotNumeric.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionNumberMinNotNumeric.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionNumberMinNotNumeric.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionNumberMinNotNumeric.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectConstPropertyTypeUnsupported.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionObjectConstPropertyTypeUnsupported.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectConstPropertyTypeUnsupported.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionObjectConstPropertyTypeUnsupported.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeNotString.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionObjectPropertyTypeNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeNotString.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionObjectPropertyTypeNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeUnsupported.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionObjectPropertyTypeUnsupported.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectPropertyTypeUnsupported.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionObjectPropertyTypeUnsupported.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectRequiredNotString.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionObjectRequiredNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionObjectRequiredNotString.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionObjectRequiredNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringContentEncodingNotString.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionStringContentEncodingNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringContentEncodingNotString.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionStringContentEncodingNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringFormatNotString.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionStringFormatNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringFormatNotString.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionStringFormatNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringPatternNotString.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionStringPatternNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionStringPatternNotString.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionStringPatternNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeNotString.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionTypeNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeNotString.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionTypeNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeUnsupported.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionTypeUnsupported.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/SchemaDefinitionTypeUnsupported.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionTypeUnsupported.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TitleNotString.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/TitleNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TitleNotString.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/TitleNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TypeEmpty.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/TypeEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TypeEmpty.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/TypeEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TypeNotThingModel.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/TypeNotThingModel.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/invalidThing/TypeNotThingModel.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/TypeNotThingModel.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/valid/LinkExtends.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/valid/LinkExtends.TM.json new file mode 100644 index 0000000000..a4fee4721e --- /dev/null +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/valid/LinkExtends.TM.json @@ -0,0 +1,30 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "links": [ + { + "rel": "tm:extends", + "href": "http://example.com/BasicOnOffTM", + "type": "application/tm+json" + } + ], + "actions": { + "noop": { + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/TestThing/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkNoRel.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/valid/LinkNoRel.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkNoRel.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/valid/LinkNoRel.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkOtherRel.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/valid/LinkOtherRel.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/LinkOtherRel.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/valid/LinkOtherRel.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/Noop.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/valid/Noop.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/Noop.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/valid/Noop.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/valid/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/valid/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TM.json b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/valid/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-descriptions/valid/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TM.json rename to codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/valid/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TM.json From c98fc95529fba87860dd41da4cf0a536afd94615 Mon Sep 17 00:00:00 2001 From: "John (JD) Douceur" Date: Fri, 9 Jan 2026 07:25:22 -0800 Subject: [PATCH 38/52] support DTMI resolution in Dtdl2Wot --- .../Dtdl2Wot/Interface/code/InterfaceThing.cs | 13 +- codegen2/src/Dtdl2Wot/Program.cs | 26 +++- codegen2/src/Dtdl2Wot/Resolver.cs | 127 ++++++++++++++++++ 3 files changed, 159 insertions(+), 7 deletions(-) create mode 100644 codegen2/src/Dtdl2Wot/Resolver.cs diff --git a/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs b/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs index ee7f27fa41..7114c705c7 100644 --- a/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs +++ b/codegen2/src/Dtdl2Wot/Interface/code/InterfaceThing.cs @@ -65,7 +65,18 @@ public InterfaceThing(IReadOnlyDictionary modelDict, Dtmi in this.errorSchemas[new CodeName(errorField.Schema.Id).AsGiven] = errorField.Schema; } - this.namespacedEnums = modelDict.Values.Where(e => e.EntityKind == DTEntityKind.Enum).Select(e => (DTEnumInfo)e).Where(e => !EnumThingSchema.CanExpressAsEnum(e)).ToDictionary(e => new CodeName(e.Id).AsGiven, e => e); + this.namespacedEnums = new(); + foreach (DTEntityInfo dTEntity in modelDict.Values) + { + if (dTEntity.EntityKind == DTEntityKind.Enum) + { + DTEnumInfo dtEnum = (DTEnumInfo)dTEntity; + if (!EnumThingSchema.CanExpressAsEnum(dtEnum)) + { + this.namespacedEnums[new CodeName(dtEnum.Id).AsGiven] = dtEnum; + } + } + } this.thingDescriber = new ThingDescriber(mqttVersion); } diff --git a/codegen2/src/Dtdl2Wot/Program.cs b/codegen2/src/Dtdl2Wot/Program.cs index 7b71276199..96b9052e62 100644 --- a/codegen2/src/Dtdl2Wot/Program.cs +++ b/codegen2/src/Dtdl2Wot/Program.cs @@ -18,6 +18,7 @@ static int Main(string[] args) Console.WriteLine("Converts a DTDL model file to a WoT Thing Description."); Console.WriteLine(" Path to the input DTDL model file."); Console.WriteLine(" Path to the output folder for the generated Thing Description."); + Console.WriteLine(" [resolverFilePath] Optional path to a JSON file that defines DTMI resolution rules."); Console.WriteLine(" [schemaNamesFilePath] Optional path to a JSON file that defines schema naming rules."); Console.WriteLine(" If not specified, default path is 'SchemaNames.json' in the output folder."); Console.WriteLine(" If file does not exist, one will be created (using specified or default path)."); @@ -26,7 +27,8 @@ static int Main(string[] args) FileInfo inputFile = new FileInfo(args[0]); DirectoryInfo outputDirectory = new DirectoryInfo(args[1]); - FileInfo schemaNamesFile = new FileInfo(args.Length > 2 ? args[2] : Path.Combine(outputDirectory.FullName, "SchemaNames.json")); + string resolverFilePath = args.Length > 2 ? args[2] : string.Empty; + FileInfo schemaNamesFile = new FileInfo(args.Length > 3 ? args[3] : Path.Combine(outputDirectory.FullName, "SchemaNames.json")); string modelText = inputFile.OpenText().ReadToEnd(); @@ -38,17 +40,29 @@ static int Main(string[] args) }; ParsingOptions parsingOptions = new(); + if (!string.IsNullOrEmpty(resolverFilePath) && File.Exists(resolverFilePath)) + { + parsingOptions.DtmiResolver = new Resolver(resolverFilePath).Resolve; + } parsingOptions.ExtensionLimitContexts = new List { new Dtmi("dtmi:dtdl:limits:onvif"), new Dtmi("dtmi:dtdl:limits:aio") }; var modelParser = new ModelParser(parsingOptions); IReadOnlyDictionary model = modelParser.Parse(modelText, parseLocator); - DTInterfaceInfo dtInterface = (DTInterfaceInfo)model.Values.FirstOrDefault(e => e.EntityKind == DTEntityKind.Interface && e.SupplementalTypes.Any(t => DtdlMqttExtensionValues.MqttAdjunctTypeRegex.IsMatch(t.AbsoluteUri)))!; - Dtmi mqttTypeId = dtInterface.SupplementalTypes.First(t => DtdlMqttExtensionValues.MqttAdjunctTypeRegex.IsMatch(t.AbsoluteUri)); - int mqttVersion = int.Parse(DtdlMqttExtensionValues.MqttAdjunctTypeRegex.Match(mqttTypeId.AbsoluteUri).Groups[1].Captures[0].Value); + foreach (DTEntityInfo dtEntity in model.Values) + { + if (dtEntity.EntityKind == DTEntityKind.Interface && dtEntity.SupplementalTypes.Any(t => DtdlMqttExtensionValues.MqttAdjunctTypeRegex.IsMatch(t.AbsoluteUri))) + { + DTInterfaceInfo dtInterface = (DTInterfaceInfo)dtEntity; + Dtmi mqttTypeId = dtInterface.SupplementalTypes.First(t => DtdlMqttExtensionValues.MqttAdjunctTypeRegex.IsMatch(t.AbsoluteUri)); + int mqttVersion = int.Parse(DtdlMqttExtensionValues.MqttAdjunctTypeRegex.Match(mqttTypeId.AbsoluteUri).Groups[1].Captures[0].Value); - ThingGenerator thingGenerator = new ThingGenerator(model, dtInterface.Id, mqttVersion); + ThingGenerator thingGenerator = new ThingGenerator(model, dtInterface.Id, mqttVersion); + + thingGenerator.GenerateThing(outputDirectory, schemaNamesFile); + } + } if (!schemaNamesFile.Exists) { @@ -59,7 +73,7 @@ static int Main(string[] args) Console.WriteLine($" generated {schemaNamesFile.FullName}"); } - return thingGenerator.GenerateThing(outputDirectory, schemaNamesFile) ? 0 : 1; + return 0; } } } diff --git a/codegen2/src/Dtdl2Wot/Resolver.cs b/codegen2/src/Dtdl2Wot/Resolver.cs new file mode 100644 index 0000000000..cad4db2aca --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Resolver.cs @@ -0,0 +1,127 @@ +namespace Dtdl2Wot +{ + using System; + using System.Collections.Generic; + using System.IO; + using System.Linq; + using System.Text.Json; + using System.Text.RegularExpressions; + using System.Threading; + using DTDLParser; + + public class Resolver + { + private const string RegexKey = "regex"; + private const string PathKey = "path"; + private const string WildcardKey = "wild"; + private const string TokenRegexPattern = @"\{(\d+)\}"; + + private static readonly Regex tokenRegex = new Regex(TokenRegexPattern, RegexOptions.Compiled); + + private readonly string configPath; + private readonly Regex dtmiRegex; + private readonly string pathTemplate; + private readonly string? wildcard; + + public Resolver(string configPath) + { + this.configPath = configPath; + + if (!File.Exists(configPath)) + { + throw new Exception($"Resolver config file {configPath} not found"); + } + + using (StreamReader configReader = File.OpenText(configPath)) + { + using (JsonDocument configDoc = JsonDocument.Parse(configReader.ReadToEnd())) + { + if (!configDoc.RootElement.TryGetProperty(RegexKey, out JsonElement regexElt)) + { + throw new Exception($"Resolver config file {configPath} missing '{RegexKey}' property"); + } + + dtmiRegex = new Regex(regexElt.GetString()!); + + if (!configDoc.RootElement.TryGetProperty(PathKey, out JsonElement pathElt)) + { + throw new Exception($"Resolver config file {configPath} missing '{PathKey}' property"); + } + + pathTemplate = pathElt.GetString()!; + + if (configDoc.RootElement.TryGetProperty(WildcardKey, out JsonElement wildcardElt)) + { + wildcard = wildcardElt.GetString(); + } + } + } + } + + public IEnumerable Resolve(IReadOnlyCollection dtmis) + { + var refJsonTexts = new List(); + HashSet modelFilePaths = new (); + + foreach (Dtmi dtmi in dtmis) + { + Match dtmiMatch = dtmiRegex.Match(dtmi.AbsoluteUri); + if (dtmiMatch.Success) + { + string path = pathTemplate; + foreach (Match tokenMatch in tokenRegex.Matches(pathTemplate)) + { + int groupIndex = int.Parse(tokenMatch.Groups[1].Captures[0].Value); + path = path.Replace($"{{{groupIndex}}}", dtmiMatch.Groups[groupIndex].Captures[0].Value); + } + + string relativePath = Path.Combine(Path.GetDirectoryName(configPath)!, path); + string modelFolderPath = Path.GetDirectoryName(relativePath) ?? "."; + string modelFileName = Path.GetFileName(relativePath) ?? "*.json"; + string modelFilePath; + + if (wildcard != null) + { + string? parentFolderPath = Path.GetDirectoryName(modelFolderPath); + if (parentFolderPath != null) + { + string leafFolderName = Path.GetFileName(modelFolderPath); + modelFolderPath = Directory.GetDirectories(parentFolderPath, leafFolderName.Replace('_', '*')).FirstOrDefault(d => Path.GetFileName(d).Length == leafFolderName.Length) ?? modelFolderPath; + } + + modelFilePath = Directory.GetFiles(modelFolderPath, modelFileName.Replace('_', '*')).FirstOrDefault(d => Path.GetFileName(d).Length == modelFileName.Length) ?? Path.Combine(modelFolderPath, modelFileName); + } + else + { + modelFilePath = Path.Combine(modelFolderPath, modelFileName); + } + + if (File.Exists(modelFilePath) && !modelFilePaths.Contains(modelFilePath)) + { + string jsonText = File.ReadAllText(modelFilePath); + refJsonTexts.Add(jsonText); + modelFilePaths.Add(modelFilePath); + } + } + } + + return refJsonTexts; + } + +#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously +#pragma warning disable CS8425 // 'CancellationToken' is not decorated with the 'EnumeratorCancellation' attribute, so the cancellation token parameter from the generated 'IAsyncEnumerable<>.GetAsyncEnumerator' will be unconsumed + public async IAsyncEnumerable ResolveAsync(IReadOnlyCollection dtmis, CancellationToken _) + { + IEnumerable values = Resolve(dtmis); + if (values != null) + { + foreach (string value in values) + { + yield return value; + } + } + } +#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously +#pragma warning restore CS8425 // 'CancellationToken' is not decorated with the 'EnumeratorCancellation' attribute, so the cancellation token parameter from the generated 'IAsyncEnumerable<>.GetAsyncEnumerator' will be unconsumed + } +} From 5fdaff68abdb4971d008b65baf16b44196d9b6b2 Mon Sep 17 00:00:00 2001 From: "John (JD) Douceur" Date: Mon, 12 Jan 2026 13:40:53 -0800 Subject: [PATCH 39/52] add test cases and change test folder hierarchy --- .../ErrorLog.cs | 51 +++++++++---- .../ErrorReporter.cs | 9 ++- .../CommandPerformer.cs | 5 ++ .../ActionSchemaGenerator.cs | 39 ++++++++-- .../EventSchemaGenerator.cs | 22 ++++-- .../PropertySchemaGenerator.cs | 73 +++++++++++++------ .../SchemaGenerator.cs | 29 ++++---- .../ProtocolCompilerTester.cs | 4 +- .../name-rules/DefaultSchemaNames.json | 0 .../schemas/PokeInputArguments.schema.json | 6 ++ .../schemas/PokeInputArguments.schema.json | 6 ++ .../schemas/PeekOutputArguments.schema.json | 6 ++ .../schemas/PeekOutputArguments.schema.json | 6 ++ .../schemas/AnObjectSchema.schema.json | 13 ++++ .../schemas/DoitInputArguments.schema.json | 6 ++ .../schemas/AlertEvent.schema.json | 14 ++++ .../schemas/AlphaProperty.schema.json | 14 ++++ .../schemas/AlphaProperty.schema.json | 14 ++++ .../AlphaWriteResponseSchema.schema.json | 13 ++++ .../schemas/Error.schema.json | 12 +++ .../schemas/PropertyCollection.schema.json | 17 +++++ .../PropertyCollectionReadError.schema.json | 9 +++ .../schemas/AlphaProperty.schema.json | 14 ++++ .../AlphaReadResponseSchema.schema.json | 18 +++++ .../schemas/Error.schema.json | 12 +++ .../schemas/PropertyCollection.schema.json | 14 ++++ .../PropertyCollectionWriteError.schema.json | 9 +++ .../schemas/PropertyUpdate.schema.json | 13 ++++ .../schemas/json-schemas/AStringSchema.json | 5 ++ .../json-schemas/AnObjectSchema.json | 0 .../json-schemas/AnotherObjectSchema.json | 11 +++ .../test-cases/SampleTest.json | 0 ...chemaNamesObjectsDifferentFieldValues.json | 23 ++++++ ...cateSchemaNamesObjectsDifferentFields.json | 23 ++++++ ...ormAdditionalResponseContentTypeEmpty.json | 0 ...FormAdditionalResponseContentTypeText.json | 0 ...nalResponseNoMatchingSchemaDefinition.json | 0 .../ActionFormAdditionalResponseNoSchema.json | 0 ...AdditionalResponseNoSchemaDefinitions.json | 0 ...ActionFormAdditionalResponseNoSuccess.json | 0 ...AdditionalResponseSchemaDefinitionMap.json | 0 ...onalResponseSchemaDefinitionNotObject.json | 0 ...tionFormAdditionalResponseSchemaEmpty.json | 0 ...tionFormAdditionalResponseSuccessTrue.json | 0 ...AdditionalResponseUnsupportedProperty.json | 0 ...ActionFormAdditionalResponsesMultiple.json | 0 .../failure/ActionFormContentTypeText.json | 0 .../failure/ActionFormHeaderCodeEmpty.json | 0 ...mHeaderCodeNoMatchingSchemaDefinition.json | 0 ...tionFormHeaderCodeNoSchemaDefinitions.json | 0 ...FormHeaderCodeSchemaDefinitionNotEnum.json | 0 .../ActionFormHeaderInfoContentTypeEmpty.json | 0 ...ctionFormHeaderInfoContentTypeNotJson.json | 0 .../ActionFormHeaderInfoNoContentType.json | 0 ...mHeaderInfoNoMatchingSchemaDefinition.json | 0 .../failure/ActionFormHeaderInfoNoSchema.json | 0 ...tionFormHeaderInfoNoSchemaDefinitions.json | 0 ...tionFormHeaderInfoSchemaDefinitionMap.json | 0 ...rmHeaderInfoSchemaDefinitionNotObject.json | 0 .../ActionFormHeaderInfoSchemaEmpty.json | 0 .../ActionFormHeaderInfoSuccessTrue.json | 0 ...tionFormHeaderInfoUnsupportedProperty.json | 0 .../ActionFormHeaderInfosMultiple.json | 0 .../failure/ActionFormOpInvokeDuplicate.json | 0 .../test-cases/failure/ActionFormOpRead.json | 0 .../test-cases/failure/ActionFormOpSub.json | 0 .../test-cases/failure/ActionFormOpWrite.json | 0 .../failure/ActionFormServiceGroupEmpty.json | 0 .../failure/ActionFormTopicNoContentType.json | 0 .../failure/ActionFormTopicTokenAction.json | 0 .../ActionFormTopicTokenConsumerId.json | 0 .../ActionFormTopicTokenMaintainerId.json | 0 .../failure/ActionFormTopicTokenSenderId.json | 0 .../ActionFormUnsupportedProperty.json | 0 .../test-cases/failure/ActionFormsEmpty.json | 0 .../ActionFormsMultipleContentTypes.json | 0 .../failure/ActionFormsOpInvokeDuplicate.json | 0 .../failure/ActionFormsOplessAndInvoke.json | 0 .../failure/ActionFormsOplessDuplicate.json | 0 .../test-cases/failure/ActionInputMap.json | 0 .../ActionInputNullAndContentTypeJson.json | 0 .../test-cases/failure/ActionInputNumber.json | 0 ...ActionInputObjectAndContentTypeCustom.json | 0 .../ActionInputObjectAndContentTypeRaw.json | 0 .../failure/ActionInputObjectConst.json | 0 .../ActionInputObjectErrorMessage.json | 0 .../failure/ActionInputRefNotFound.json | 16 ++++ .../failure/ActionInputRefString.json | 17 +++++ .../test-cases/failure/ActionInputString.json | 0 .../test-cases/failure/ActionNoForms.json | 0 .../failure/ActionNoFormsWithTopic.json | 0 .../test-cases/failure/ActionOutputMap.json | 0 .../ActionOutputNullAndContentTypeJson.json | 0 .../failure/ActionOutputNumber.json | 0 ...ctionOutputObjectAndContentTypeCustom.json | 0 .../ActionOutputObjectAndContentTypeRaw.json | 0 .../failure/ActionOutputObjectConst.json | 0 .../ActionOutputObjectErrorMessage.json | 0 .../failure/ActionOutputRefNotFound.json | 16 ++++ .../failure/ActionOutputRefString.json | 17 +++++ .../failure/ActionOutputString.json | 0 .../failure/ActionUnsupportedProperty.json | 0 .../failure/ActionsTopicDuplication.json | 23 ++++++ .../test-cases/failure/ArrayKey.json | 0 .../test-cases/failure/BooleanKey.json | 0 .../failure/ContextDtvWrongPrefix.json | 0 .../failure/ContextDtvWrongUri.json | 0 .../test-cases/failure/ContextMissingDtv.json | 0 .../test-cases/failure/ContextMissingWot.json | 0 .../test-cases/failure/ContextWrongType.json | 0 ...ateGeneratedNameAcrossThingsInOneFile.json | 23 ++++++ ...teGeneratedNameAcrossThingsInTwoFiles.json | 23 ++++++ .../test-cases/failure/DuplicateKey.json | 0 ...plicateThingNameAcrossThingsInOneFile.json | 23 ++++++ ...licateThingNameAcrossThingsInTwoFiles.json | 23 ++++++ ...licatedGeneratedNameAcrossJsonSchemas.json | 23 ++++++ ...eneratedNameBetweenThingAndJsonSchema.json | 24 ++++++ .../test-cases/failure/EventBooleanConst.json | 0 ...entDuplicateSchemaNamesDifferentTypes.json | 23 ++++++ ...licateSchemaNamesEnumsDifferentValues.json | 16 ++++ ...chemaNamesObjectsDifferentFieldValues.json | 23 ++++++ ...cateSchemaNamesObjectsDifferentFields.json | 23 ++++++ .../failure/EventFormAdditionalResponses.json | 0 .../failure/EventFormContentTypeText.json | 0 .../failure/EventFormHeaderCode.json | 0 .../failure/EventFormHeaderInfo.json | 0 .../test-cases/failure/EventFormOpInvoke.json | 0 .../test-cases/failure/EventFormOpRead.json | 0 .../test-cases/failure/EventFormOpSubAll.json | 0 .../failure/EventFormOpSubDuplicate.json | 0 .../test-cases/failure/EventFormOpWrite.json | 0 .../failure/EventFormServiceGroupEmpty.json | 0 .../failure/EventFormTopicNoContentType.json | 0 .../failure/EventFormTopicTokenAction.json | 0 .../EventFormTopicTokenConsumerId.json | 0 .../EventFormTopicTokenExecutorId.json | 0 .../failure/EventFormTopicTokenInvokerId.json | 0 .../EventFormTopicTokenMaintainerId.json | 0 .../failure/EventFormUnsupportedProperty.json | 0 .../test-cases/failure/EventFormsEmpty.json | 0 .../failure/EventFormsOpSubDuplicate.json | 0 .../failure/EventFormsOplessAndSub.json | 0 .../failure/EventFormsOplessDuplicate.json | 0 .../test-cases/failure/EventIntegerConst.json | 0 .../test-cases/failure/EventNoForms.json | 0 ...ntNoFormsWithTopicAndNoRootFormSubAll.json | 0 .../failure/EventNullAndContentTypeJson.json | 0 .../test-cases/failure/EventNumberConst.json | 0 .../EventObjectAndContentTypeCustom.json | 0 .../failure/EventObjectAndContentTypeRaw.json | 0 .../test-cases/failure/EventObjectConst.json | 0 .../failure/EventObjectErrorMessage.json | 0 .../test-cases/failure/EventRefNotFound.json | 16 ++++ .../test-cases/failure/EventStringConst.json | 0 .../failure/EventUnsupportedProperty.json | 0 .../failure/EventsTopicDuplication.json | 23 ++++++ .../test-cases/failure/LinkEmptyHref.json | 0 .../test-cases/failure/LinkEmptyType.json | 0 .../test-cases/failure/LinkNoHref.json | 0 .../test-cases/failure/LinkNoType.json | 0 .../test-cases/failure/LinkNonJsonFile.json | 0 .../failure/LinkNonexistentFile.json | 0 .../test-cases/failure/LinkTypeNotJson.json | 0 .../failure/LinkUnsupportedProperty.json | 0 .../test-cases/failure/MissingColon.json | 0 .../test-cases/failure/MissingComma.json | 0 .../test-cases/failure/MissingElement.json | 0 .../test-cases/failure/MissingKey.json | 0 .../test-cases/failure/MissingValue.json | 0 .../test-cases/failure/MultipleLinks.json | 0 .../test-cases/failure/NoClientOrServer.json | 0 .../test-cases/failure/NoContext.json | 0 .../test-cases/failure/NoThingOrSchema.json | 0 .../test-cases/failure/NoTitle.json | 0 .../test-cases/failure/NoType.json | 0 .../test-cases/failure/NonexistentThing.json | 0 .../test-cases/failure/NumericKey.json | 0 .../test-cases/failure/ObjectKey.json | 0 .../PropertiesReadTopicDuplication.json | 44 +++++++++++ .../PropertiesWriteTopicDuplication.json | 30 ++++++++ .../failure/PropertyBooleanConst.json | 0 ...rtyDuplicateSchemaNamesDifferentTypes.json | 23 ++++++ ...licateSchemaNamesEnumsDifferentValues.json | 16 ++++ ...chemaNamesObjectsDifferentFieldValues.json | 23 ++++++ ...cateSchemaNamesObjectsDifferentFields.json | 23 ++++++ ...ormAdditionalResponseContentTypeEmpty.json | 0 ...FormAdditionalResponseContentTypeText.json | 0 ...nalResponseNoMatchingSchemaDefinition.json | 0 ...ropertyFormAdditionalResponseNoSchema.json | 0 ...AdditionalResponseNoSchemaDefinitions.json | 0 ...opertyFormAdditionalResponseNoSuccess.json | 0 ...AdditionalResponseSchemaDefinitionMap.json | 0 ...onalResponseSchemaDefinitionNotObject.json | 0 ...ertyFormAdditionalResponseSchemaEmpty.json | 0 ...ertyFormAdditionalResponseSuccessTrue.json | 0 ...AdditionalResponseUnsupportedProperty.json | 0 ...opertyFormAdditionalResponsesMultiple.json | 0 .../failure/PropertyFormContentTypeText.json | 0 .../failure/PropertyFormHeaderCode.json | 0 .../failure/PropertyFormHeaderInfo.json | 0 .../failure/PropertyFormOpInvoke.json | 0 .../failure/PropertyFormOpReadAll.json | 0 .../failure/PropertyFormOpReadDuplicate.json | 0 .../test-cases/failure/PropertyFormOpSub.json | 0 .../failure/PropertyFormOpWriteDuplicate.json | 0 .../failure/PropertyFormOpWriteMulti.json | 0 ...FormReadAllWithoutAdditionalResponses.json | 0 ...plessWithoutTopicAndNoRootFormReadAll.json | 0 ...FormReadAllWithoutAdditionalResponses.json | 0 ...mReadWithoutTopicAndNoRootFormReadAll.json | 0 ...TopicWriteWithTopicAndRootFormReadAll.json | 0 .../failure/PropertyFormServiceGroup.json | 0 .../PropertyFormTopicNoContentType.json | 0 .../PropertyFormTopicTokenExecutorId.json | 0 .../PropertyFormTopicTokenInvokerId.json | 0 ...picTokenNoActionWhenNoOpAndNoReadOnly.json | 0 ...TokenNoActionWhenNoOpAndReadOnlyFalse.json | 0 ...ormTopicTokenNoActionWhenReadAndWrite.json | 0 .../PropertyFormTopicTokenSenderId.json | 0 .../PropertyFormUnsupportedProperty.json | 0 ...mWriteMultiWithoutAdditionalResponses.json | 0 ...teWithoutTopicAndNoRootFormWriteMulti.json | 0 .../failure/PropertyFormsEmpty.json | 0 .../failure/PropertyFormsOpReadDuplicate.json | 0 .../PropertyFormsOpWriteDuplicate.json | 0 .../failure/PropertyFormsOpWriteNoRead.json | 0 .../failure/PropertyFormsOplessAndRead.json | 0 .../failure/PropertyFormsOplessDuplicate.json | 0 .../failure/PropertyIntegerConst.json | 0 .../test-cases/failure/PropertyNoForms.json | 0 .../failure/PropertyNumberConst.json | 0 .../failure/PropertyObjectConst.json | 0 .../failure/PropertyObjectErrorMessage.json | 0 .../failure/PropertyRefNotFound.json | 16 ++++ .../failure/PropertyStringConst.json | 0 .../test-cases/failure/PropertyTypeNull.json | 0 .../failure/PropertyUnsupportedProperty.json | 0 ...ormAdditionalResponseContentTypeEmpty.json | 0 ...FormAdditionalResponseContentTypeText.json | 0 .../RootFormAdditionalResponseNoSuccess.json | 0 .../RootFormAdditionalResponseSchema.json | 0 ...RootFormAdditionalResponseSuccessTrue.json | 0 ...AdditionalResponseUnsupportedProperty.json | 0 .../RootFormAdditionalResponsesAndSubAll.json | 0 .../RootFormAdditionalResponsesMultiple.json | 0 .../failure/RootFormContentTypeCustom.json | 0 .../failure/RootFormContentTypeRaw.json | 0 .../failure/RootFormContentTypeText.json | 0 .../failure/RootFormHeaderCode.json | 0 .../failure/RootFormHeaderInfo.json | 0 .../failure/RootFormNoContentType.json | 0 .../test-cases/failure/RootFormNoOp.json | 0 .../test-cases/failure/RootFormNoTopic.json | 0 .../failure/RootFormOpArrayEmpty.json | 0 .../failure/RootFormOpElementEmpty.json | 0 .../test-cases/failure/RootFormOpEmpty.json | 0 .../failure/RootFormOpReadAllAndSubAll.json | 0 .../failure/RootFormOpReadAllDuplicate.json | 0 .../test-cases/failure/RootFormOpReadOne.json | 0 .../failure/RootFormOpSubAllDuplicate.json | 0 .../test-cases/failure/RootFormOpSubOne.json | 0 .../failure/RootFormOpWiteMultiAndSubAll.json | 0 .../RootFormOpWriteMultiDuplicate.json | 0 .../failure/RootFormOpWriteOne.json | 0 .../RootFormReadAllButNoProperties.json | 0 .../failure/RootFormServiceGroupEmpty.json | 0 .../failure/RootFormServiceGroupNoSubAll.json | 0 .../failure/RootFormSubAllButNoEvents.json | 0 .../failure/RootFormTopicEmpty.json | 0 .../failure/RootFormTopicLevelEmpty.json | 0 .../failure/RootFormTopicLevelInvalid.json | 0 .../failure/RootFormTopicReservedStart.json | 0 .../RootFormTopicTokenActionWhenSubAll.json | 0 ...ootFormTopicTokenConsumerIdWhenSubAll.json | 0 .../RootFormTopicTokenCustomEmpty.json | 0 .../RootFormTopicTokenCustomInvalid.json | 0 .../failure/RootFormTopicTokenEmpty.json | 0 .../failure/RootFormTopicTokenExecutorId.json | 0 .../failure/RootFormTopicTokenInvokerId.json | 0 ...tFormTopicTokenMaintainerIdWhenSubAll.json | 0 ...TokenNoActionWhenReadAllAndWriteMulti.json | 0 ...RootFormTopicTokenSenderIdWhenReadAll.json | 0 ...tFormTopicTokenSenderIdWhenWriteMulti.json | 0 .../RootFormTopicTokenUnrecognized.json | 0 ...FormWriteMultiButNoWritableProperties.json | 0 .../test-cases/failure/RootFormsEmpty.json | 0 .../failure/RootFormsOpReadAllDuplicate.json | 0 .../failure/RootFormsOpSubAllDuplicate.json | 0 .../RootFormsOpWriteMultiDuplicate.json | 0 .../RootFormsOpWriteMultiNoReadAll.json | 0 .../failure/SchemaDefinitionArrayConst.json | 0 .../SchemaDefinitionArrayItemsNoType.json | 0 .../SchemaDefinitionArrayItemsNotObject.json | 0 ...SchemaDefinitionArrayItemsObjectConst.json | 0 .../SchemaDefinitionArrayItemsRef.json | 0 ...SchemaDefinitionArrayItemsStringConst.json | 0 ...hemaDefinitionArrayItemsTypeNotString.json | 0 .../SchemaDefinitionArrayItemsTypeNull.json | 0 ...maDefinitionArrayItemsTypeUnsupported.json | 0 .../failure/SchemaDefinitionArrayNoItems.json | 0 ...DefinitionBooleanConstValueNotBoolean.json | 0 .../SchemaDefinitionBooleanReadOnly.json | 0 ...aDefinitionBooleanUnsupportedProperty.json | 0 ...maDefinitionIntegerConstValueAboveMax.json | 0 ...maDefinitionIntegerConstValueBelowMin.json | 0 ...DefinitionIntegerConstValueNotInteger.json | 0 ...DefinitionIntegerConstValueNotNumeric.json | 0 .../SchemaDefinitionIntegerMaxNotInteger.json | 0 .../SchemaDefinitionIntegerMaxNotNumeric.json | 0 .../SchemaDefinitionIntegerMinAboveMax.json | 0 .../SchemaDefinitionIntegerMinNotInteger.json | 0 .../SchemaDefinitionIntegerMinNotNumeric.json | 0 .../SchemaDefinitionIntegerReadOnly.json | 0 ...aDefinitionIntegerUnsupportedProperty.json | 0 ...finitionMapAdditionalPropertiesNoType.json | 0 ...itionMapAdditionalPropertiesNotObject.json | 0 ...ionMapAdditionalPropertiesObjectConst.json | 0 ...aDefinitionMapAdditionalPropertiesRef.json | 0 ...ionMapAdditionalPropertiesStringConst.json | 0 ...nMapAdditionalPropertiesTypeNotString.json | 0 ...nitionMapAdditionalPropertiesTypeNull.json | 0 ...apAdditionalPropertiesTypeUnsupported.json | 0 .../failure/SchemaDefinitionMapConst.json | 0 .../failure/SchemaDefinitionNoType.json | 0 ...emaDefinitionNumberConstValueAboveMax.json | 0 ...emaDefinitionNumberConstValueBelowMin.json | 0 ...aDefinitionNumberConstValueNotNumeric.json | 0 .../SchemaDefinitionNumberMaxNotNumeric.json | 0 .../SchemaDefinitionNumberMinAboveMax.json | 0 .../SchemaDefinitionNumberMinNotNumeric.json | 0 .../SchemaDefinitionNumberReadOnly.json | 0 ...maDefinitionNumberUnsupportedProperty.json | 0 ...chemaDefinitionObjectBothDeterminants.json | 0 .../SchemaDefinitionObjectConstNotObject.json | 0 ...nitionObjectConstPropertyBooleanConst.json | 0 ...nObjectConstPropertyBooleanNotBoolean.json | 0 ...nstPropertyBooleanUnsupportedProperty.json | 0 ...ionObjectConstPropertyIntegerAboveMax.json | 0 ...ionObjectConstPropertyIntegerBelowMin.json | 0 ...nitionObjectConstPropertyIntegerConst.json | 0 ...nObjectConstPropertyIntegerNotInteger.json | 0 ...nObjectConstPropertyIntegerNotNumeric.json | 0 ...nstPropertyIntegerUnsupportedProperty.json | 0 ...maDefinitionObjectConstPropertyNoType.json | 0 ...aDefinitionObjectConstPropertyNoValue.json | 0 ...tionObjectConstPropertyNumberAboveMax.json | 0 ...tionObjectConstPropertyNumberBelowMin.json | 0 ...initionObjectConstPropertyNumberConst.json | 0 ...onObjectConstPropertyNumberNotNumeric.json | 0 ...onstPropertyNumberUnsupportedProperty.json | 0 ...initionObjectConstPropertyStringConst.json | 0 ...onstPropertyStringUnsupportedProperty.json | 0 ...jectConstPropertyStringValueNotString.json | 0 ...efinitionObjectConstPropertyTypeArray.json | 0 ...DefinitionObjectConstPropertyTypeNull.json | 0 ...finitionObjectConstPropertyTypeObject.json | 0 ...ionObjectConstPropertyTypeUnsupported.json | 0 ...initionObjectConstUnsupportedProperty.json | 0 ...emaDefinitionObjectConstValueNoSchema.json | 0 ...efinitionObjectErrorMessageNoProperty.json | 0 ...DefinitionObjectErrorMessageNotString.json | 0 ...onObjectErrorMessagePropertyNotString.json | 0 .../SchemaDefinitionObjectNoDeterminant.json | 0 ...maDefinitionObjectPropertiesNotObject.json | 0 .../SchemaDefinitionObjectPropertyNoType.json | 0 ...maDefinitionObjectPropertyObjectConst.json | 0 .../SchemaDefinitionObjectPropertyRef.json | 0 ...maDefinitionObjectPropertyStringConst.json | 0 ...DefinitionObjectPropertyTypeNotString.json | 0 ...chemaDefinitionObjectPropertyTypeNull.json | 0 ...finitionObjectPropertyTypeUnsupported.json | 0 ...emaDefinitionObjectRequiredNoProperty.json | 0 ...hemaDefinitionObjectRequiredNotString.json | 0 .../failure/SchemaDefinitionRef.json | 0 ...aDefinitionStringConstContentEncoding.json | 0 .../SchemaDefinitionStringConstFormat.json | 0 .../SchemaDefinitionStringConstPattern.json | 0 ...initionStringConstUnsupportedProperty.json | 0 ...maDefinitionStringConstValueNotString.json | 0 ...initionStringContentEncodingNotString.json | 0 ...StringContentEncodingUnsupportedValue.json | 0 .../SchemaDefinitionStringEnumConst.json | 0 ...maDefinitionStringEnumContentEncoding.json | 0 ...emaDefinitionStringEnumElementInvalid.json | 0 .../SchemaDefinitionStringEnumFormat.json | 0 .../SchemaDefinitionStringEnumPattern.json | 0 .../SchemaDefinitionStringEnumReadOnly.json | 0 ...finitionStringEnumUnsupportedProperty.json | 0 ...initionStringFormatAndContentEncoding.json | 0 ...chemaDefinitionStringFormatAndPattern.json | 0 ...SchemaDefinitionStringFormatNotString.json | 0 ...efinitionStringFormatUnsupportedValue.json | 0 ...nitionStringPatternAndContentEncoding.json | 0 ...tionStringPatternNotDurationOrDecimal.json | 0 ...chemaDefinitionStringPatternNotString.json | 0 ...maDefinitionStringPatternRegexInvalid.json | 0 .../SchemaDefinitionStringReadOnly.json | 0 ...maDefinitionStringUnsupportedProperty.json | 0 .../SchemaDefinitionTypeNotString.json | 0 .../failure/SchemaDefinitionTypeNull.json | 0 .../SchemaDefinitionTypeUnsupported.json | 0 .../failure/ThingUnsupportedProperty.json | 0 .../test-cases/failure/TitleEmpty.json | 0 .../test-cases/failure/TitleInvalid.json | 0 .../test-cases/failure/TitleNotString.json | 0 .../test-cases/failure/TrailingComma.json | 0 .../test-cases/failure/TypeEmpty.json | 0 .../test-cases/failure/TypeNotThingModel.json | 0 .../test-cases/failure/UnclosedArray.json | 0 .../test-cases/failure/UnclosedObject.json | 0 .../failure/UnsupportedLanguage.json | 0 .../test-cases/success/LinkExtends.json | 0 .../test-cases/success/LinkNoRel.json | 0 .../test-cases/success/LinkOtherRel.json | 0 ...NoReadablePropertyAdditionalResponses.json | 0 ...NoWritablePropertyAdditionalResponses.json | 0 .../thing-models/.vscode/settings.json | 0 ...maNamesObjectsDifferentFieldValues.TM.json | 41 +++++++++++ ...eSchemaNamesObjectsDifferentFields.TM.json | 41 +++++++++++ ...AdditionalResponseContentTypeEmpty.TM.json | 0 ...mAdditionalResponseContentTypeText.TM.json | 0 ...ResponseNoMatchingSchemaDefinition.TM.json | 0 ...tionFormAdditionalResponseNoSchema.TM.json | 0 ...itionalResponseNoSchemaDefinitions.TM.json | 0 ...ionFormAdditionalResponseNoSuccess.TM.json | 0 ...itionalResponseSchemaDefinitionMap.TM.json | 0 ...lResponseSchemaDefinitionNotObject.TM.json | 0 ...nFormAdditionalResponseSchemaEmpty.TM.json | 0 ...nFormAdditionalResponseSuccessTrue.TM.json | 0 ...itionalResponseUnsupportedProperty.TM.json | 0 ...ionFormAdditionalResponsesMultiple.TM.json | 0 .../ActionFormContentTypeText.TM.json | 0 .../ActionFormHeaderCodeEmpty.TM.json | 0 ...aderCodeNoMatchingSchemaDefinition.TM.json | 0 ...nFormHeaderCodeNoSchemaDefinitions.TM.json | 0 ...mHeaderCodeSchemaDefinitionNotEnum.TM.json | 0 ...tionFormHeaderInfoContentTypeEmpty.TM.json | 0 ...onFormHeaderInfoContentTypeNotJson.TM.json | 0 .../ActionFormHeaderInfoNoContentType.TM.json | 0 ...aderInfoNoMatchingSchemaDefinition.TM.json | 0 .../ActionFormHeaderInfoNoSchema.TM.json | 0 ...nFormHeaderInfoNoSchemaDefinitions.TM.json | 0 ...nFormHeaderInfoSchemaDefinitionMap.TM.json | 0 ...eaderInfoSchemaDefinitionNotObject.TM.json | 0 .../ActionFormHeaderInfoSchemaEmpty.TM.json | 0 .../ActionFormHeaderInfoSuccessTrue.TM.json | 0 ...nFormHeaderInfoUnsupportedProperty.TM.json | 0 .../ActionFormHeaderInfosMultiple.TM.json | 0 .../ActionFormOpInvokeDuplicate.TM.json | 0 .../ActionFormServiceGroupEmpty.TM.json | 0 .../ActionFormTopicNoContentType.TM.json | 0 .../ActionFormTopicTokenAction.TM.json | 0 .../ActionFormTopicTokenConsumerId.TM.json | 0 .../ActionFormTopicTokenMaintainerId.TM.json | 0 .../ActionFormTopicTokenSenderId.TM.json | 0 .../ActionFormUnsupportedProperty.TM.json | 0 .../ActionFormsMultipleContentTypes.TM.json | 0 .../ActionFormsOpInvokeDuplicate.TM.json | 0 .../ActionFormsOplessAndInvoke.TM.json | 0 .../ActionFormsOplessDuplicate.TM.json | 0 .../invalidAioBinding/ActionInputMap.TM.json | 0 .../ActionInputNullAndContentTypeJson.TM.json | 0 .../ActionInputNumber.TM.json | 0 ...ionInputObjectAndContentTypeCustom.TM.json | 0 ...ActionInputObjectAndContentTypeRaw.TM.json | 0 .../ActionInputObjectConst.TM.json | 0 .../ActionInputObjectErrorMessage.TM.json | 0 .../ActionInputRefNotFound.TM.json | 26 +++++++ .../ActionInputRefString.TM.json | 26 +++++++ .../ActionInputString.TM.json | 0 .../invalidAioBinding/ActionNoForms.TM.json | 0 .../ActionNoFormsWithTopic.TM.json | 0 .../invalidAioBinding/ActionOutputMap.TM.json | 0 ...ActionOutputNullAndContentTypeJson.TM.json | 0 .../ActionOutputNumber.TM.json | 0 ...onOutputObjectAndContentTypeCustom.TM.json | 0 ...ctionOutputObjectAndContentTypeRaw.TM.json | 0 .../ActionOutputObjectConst.TM.json | 0 .../ActionOutputObjectErrorMessage.TM.json | 0 .../ActionOutputRefNotFound.TM.json | 26 +++++++ .../ActionOutputRefString.TM.json | 26 +++++++ .../ActionOutputString.TM.json | 0 .../ActionUnsupportedProperty.TM.json | 0 .../ActionsTopicDuplication.TM.json | 31 ++++++++ .../ContextDtvWrongPrefix.TM.json | 0 .../ContextDtvWrongUri.TM.json | 0 .../ContextMissingDtv.TM.json | 0 ...GeneratedNameAcrossThingsInOneFile.TM.json | 58 +++++++++++++++ ...cateThingNameAcrossThingsInOneFile.TM.json | 46 ++++++++++++ ...ratedNameBetweenThingAndJsonSchema.TM.json | 35 +++++++++ .../EventBooleanConst.TM.json | 0 ...DuplicateSchemaNamesDifferentTypes.TM.json | 49 +++++++++++++ ...ateSchemaNamesEnumsDifferentValues.TM.json | 49 +++++++++++++ ...maNamesObjectsDifferentFieldValues.TM.json | 50 +++++++++++++ ...eSchemaNamesObjectsDifferentFields.TM.json | 50 +++++++++++++ .../EventFormAdditionalResponses.TM.json | 0 .../EventFormContentTypeText.TM.json | 0 .../EventFormHeaderCode.TM.json | 0 .../EventFormHeaderInfo.TM.json | 0 .../EventFormOpSubDuplicate.TM.json | 0 .../EventFormServiceGroupEmpty.TM.json | 0 .../EventFormTopicNoContentType.TM.json | 0 .../EventFormTopicTokenAction.TM.json | 0 .../EventFormTopicTokenConsumerId.TM.json | 0 .../EventFormTopicTokenExecutorId.TM.json | 0 .../EventFormTopicTokenInvokerId.TM.json | 0 .../EventFormTopicTokenMaintainerId.TM.json | 0 .../EventFormUnsupportedProperty.TM.json | 0 .../EventFormsOpSubDuplicate.TM.json | 0 .../EventFormsOplessAndSub.TM.json | 0 .../EventFormsOplessDuplicate.TM.json | 0 .../EventIntegerConst.TM.json | 0 .../invalidAioBinding/EventNoForms.TM.json | 0 ...oFormsWithTopicAndNoRootFormSubAll.TM.json | 0 .../EventNullAndContentTypeJson.TM.json | 0 .../EventNumberConst.TM.json | 0 .../EventObjectAndContentTypeCustom.TM.json | 0 .../EventObjectAndContentTypeRaw.TM.json | 0 .../EventObjectConst.TM.json | 0 .../EventObjectErrorMessage.TM.json | 0 .../EventRefNotFound.TM.json | 26 +++++++ .../EventStringConst.TM.json | 0 .../EventUnsupportedProperty.TM.json | 0 .../EventsTopicDuplication.TM.json | 37 ++++++++++ .../invalidAioBinding/LinkEmptyHref.TM.json | 0 .../invalidAioBinding/LinkEmptyType.TM.json | 0 .../invalidAioBinding/LinkNoHref.TM.json | 0 .../invalidAioBinding/LinkNoType.TM.json | 0 .../invalidAioBinding/LinkNonJsonFile.TM.json | 2 +- .../LinkNonexistentFile.TM.json | 0 .../invalidAioBinding/LinkTypeNotJson.TM.json | 0 .../LinkUnsupportedProperty.TM.json | 0 .../invalidAioBinding/MultipleLinks.TM.json | 0 .../invalidAioBinding/NoTitle.TM.json | 0 .../PropertiesReadTopicDuplication.TM.json | 69 ++++++++++++++++++ .../PropertiesWriteTopicDuplication.TM.json | 53 ++++++++++++++ .../PropertyBooleanConst.TM.json | 0 ...DuplicateSchemaNamesDifferentTypes.TM.json | 45 ++++++++++++ ...ateSchemaNamesEnumsDifferentValues.TM.json | 45 ++++++++++++ ...maNamesObjectsDifferentFieldValues.TM.json | 46 ++++++++++++ ...eSchemaNamesObjectsDifferentFields.TM.json | 46 ++++++++++++ ...AdditionalResponseContentTypeEmpty.TM.json | 0 ...mAdditionalResponseContentTypeText.TM.json | 0 ...ResponseNoMatchingSchemaDefinition.TM.json | 0 ...ertyFormAdditionalResponseNoSchema.TM.json | 0 ...itionalResponseNoSchemaDefinitions.TM.json | 0 ...rtyFormAdditionalResponseNoSuccess.TM.json | 0 ...itionalResponseSchemaDefinitionMap.TM.json | 0 ...lResponseSchemaDefinitionNotObject.TM.json | 0 ...yFormAdditionalResponseSchemaEmpty.TM.json | 0 ...yFormAdditionalResponseSuccessTrue.TM.json | 0 ...itionalResponseUnsupportedProperty.TM.json | 0 ...rtyFormAdditionalResponsesMultiple.TM.json | 0 .../PropertyFormContentTypeText.TM.json | 0 .../PropertyFormHeaderCode.TM.json | 0 .../PropertyFormHeaderInfo.TM.json | 0 .../PropertyFormOpReadDuplicate.TM.json | 0 .../PropertyFormOpWriteDuplicate.TM.json | 0 ...mReadAllWithoutAdditionalResponses.TM.json | 0 ...ssWithoutTopicAndNoRootFormReadAll.TM.json | 0 ...mReadAllWithoutAdditionalResponses.TM.json | 0 ...adWithoutTopicAndNoRootFormReadAll.TM.json | 0 ...icWriteWithTopicAndRootFormReadAll.TM.json | 0 .../PropertyFormServiceGroup.TM.json | 0 .../PropertyFormTopicNoContentType.TM.json | 0 .../PropertyFormTopicTokenExecutorId.TM.json | 0 .../PropertyFormTopicTokenInvokerId.TM.json | 0 ...TokenNoActionWhenNoOpAndNoReadOnly.TM.json | 0 ...enNoActionWhenNoOpAndReadOnlyFalse.TM.json | 0 ...TopicTokenNoActionWhenReadAndWrite.TM.json | 0 .../PropertyFormTopicTokenSenderId.TM.json | 0 .../PropertyFormUnsupportedProperty.TM.json | 0 ...iteMultiWithoutAdditionalResponses.TM.json | 0 ...ithoutTopicAndNoRootFormWriteMulti.TM.json | 0 .../PropertyFormsOpReadDuplicate.TM.json | 0 .../PropertyFormsOpWriteDuplicate.TM.json | 0 .../PropertyFormsOpWriteNoRead.TM.json | 0 .../PropertyFormsOplessAndRead.TM.json | 0 .../PropertyFormsOplessDuplicate.TM.json | 0 .../PropertyIntegerConst.TM.json | 0 .../invalidAioBinding/PropertyNoForms.TM.json | 0 .../PropertyNumberConst.TM.json | 0 .../PropertyObjectConst.TM.json | 0 .../PropertyObjectErrorMessage.TM.json | 0 .../PropertyRefNotFound.TM.json | 24 ++++++ .../PropertyStringConst.TM.json | 0 .../PropertyTypeNull.TM.json | 0 .../PropertyUnsupportedProperty.TM.json | 0 ...AdditionalResponseContentTypeEmpty.TM.json | 0 ...mAdditionalResponseContentTypeText.TM.json | 0 ...ootFormAdditionalResponseNoSuccess.TM.json | 0 .../RootFormAdditionalResponseSchema.TM.json | 0 ...tFormAdditionalResponseSuccessTrue.TM.json | 0 ...itionalResponseUnsupportedProperty.TM.json | 0 ...otFormAdditionalResponsesAndSubAll.TM.json | 0 ...ootFormAdditionalResponsesMultiple.TM.json | 0 .../RootFormContentTypeCustom.TM.json | 0 .../RootFormContentTypeRaw.TM.json | 0 .../RootFormContentTypeText.TM.json | 0 .../RootFormHeaderCode.TM.json | 0 .../RootFormHeaderInfo.TM.json | 0 .../RootFormNoContentType.TM.json | 0 .../invalidAioBinding/RootFormNoTopic.TM.json | 0 .../RootFormOpReadAllAndSubAll.TM.json | 0 .../RootFormOpReadAllDuplicate.TM.json | 0 .../RootFormOpSubAllDuplicate.TM.json | 0 .../RootFormOpWiteMultiAndSubAll.TM.json | 0 .../RootFormOpWriteMultiDuplicate.TM.json | 0 .../RootFormReadAllButNoProperties.TM.json | 0 .../RootFormServiceGroupEmpty.TM.json | 0 .../RootFormServiceGroupNoSubAll.TM.json | 0 .../RootFormSubAllButNoEvents.TM.json | 0 .../RootFormTopicEmpty.TM.json | 0 .../RootFormTopicLevelEmpty.TM.json | 0 .../RootFormTopicLevelInvalid.TM.json | 0 .../RootFormTopicReservedStart.TM.json | 0 ...RootFormTopicTokenActionWhenSubAll.TM.json | 0 ...FormTopicTokenConsumerIdWhenSubAll.TM.json | 0 .../RootFormTopicTokenCustomEmpty.TM.json | 0 .../RootFormTopicTokenCustomInvalid.TM.json | 0 .../RootFormTopicTokenEmpty.TM.json | 0 .../RootFormTopicTokenExecutorId.TM.json | 0 .../RootFormTopicTokenInvokerId.TM.json | 0 ...rmTopicTokenMaintainerIdWhenSubAll.TM.json | 0 ...enNoActionWhenReadAllAndWriteMulti.TM.json | 0 ...tFormTopicTokenSenderIdWhenReadAll.TM.json | 0 ...rmTopicTokenSenderIdWhenWriteMulti.TM.json | 0 .../RootFormTopicTokenUnrecognized.TM.json | 0 ...mWriteMultiButNoWritableProperties.TM.json | 0 .../RootFormsOpReadAllDuplicate.TM.json | 0 .../RootFormsOpSubAllDuplicate.TM.json | 0 .../RootFormsOpWriteMultiDuplicate.TM.json | 0 .../RootFormsOpWriteMultiNoReadAll.TM.json | 0 .../SchemaDefinitionArrayConst.TM.json | 0 .../SchemaDefinitionArrayItemsNoType.TM.json | 0 ...emaDefinitionArrayItemsObjectConst.TM.json | 0 .../SchemaDefinitionArrayItemsRef.TM.json | 2 +- ...emaDefinitionArrayItemsStringConst.TM.json | 0 ...SchemaDefinitionArrayItemsTypeNull.TM.json | 0 .../SchemaDefinitionArrayNoItems.TM.json | 0 ...initionBooleanConstValueNotBoolean.TM.json | 0 .../SchemaDefinitionBooleanReadOnly.TM.json | 0 ...finitionBooleanUnsupportedProperty.TM.json | 0 ...efinitionIntegerConstValueAboveMax.TM.json | 0 ...efinitionIntegerConstValueBelowMin.TM.json | 0 ...initionIntegerConstValueNotInteger.TM.json | 0 ...initionIntegerConstValueNotNumeric.TM.json | 0 ...hemaDefinitionIntegerMaxNotInteger.TM.json | 0 ...SchemaDefinitionIntegerMinAboveMax.TM.json | 0 ...hemaDefinitionIntegerMinNotInteger.TM.json | 0 .../SchemaDefinitionIntegerReadOnly.TM.json | 0 ...finitionIntegerUnsupportedProperty.TM.json | 0 ...itionMapAdditionalPropertiesNoType.TM.json | 0 ...MapAdditionalPropertiesObjectConst.TM.json | 0 ...finitionMapAdditionalPropertiesRef.TM.json | 2 +- ...MapAdditionalPropertiesStringConst.TM.json | 0 ...ionMapAdditionalPropertiesTypeNull.TM.json | 0 .../SchemaDefinitionMapConst.TM.json | 0 .../SchemaDefinitionNoType.TM.json | 0 ...DefinitionNumberConstValueAboveMax.TM.json | 0 ...DefinitionNumberConstValueBelowMin.TM.json | 0 ...finitionNumberConstValueNotNumeric.TM.json | 0 .../SchemaDefinitionNumberMinAboveMax.TM.json | 0 .../SchemaDefinitionNumberReadOnly.TM.json | 0 ...efinitionNumberUnsupportedProperty.TM.json | 0 ...maDefinitionObjectBothDeterminants.TM.json | 0 ...hemaDefinitionObjectConstNotObject.TM.json | 0 ...ionObjectConstPropertyBooleanConst.TM.json | 0 ...jectConstPropertyBooleanNotBoolean.TM.json | 0 ...PropertyBooleanUnsupportedProperty.TM.json | 0 ...ObjectConstPropertyIntegerAboveMax.TM.json | 0 ...ObjectConstPropertyIntegerBelowMin.TM.json | 0 ...ionObjectConstPropertyIntegerConst.TM.json | 0 ...jectConstPropertyIntegerNotInteger.TM.json | 0 ...jectConstPropertyIntegerNotNumeric.TM.json | 0 ...PropertyIntegerUnsupportedProperty.TM.json | 0 ...efinitionObjectConstPropertyNoType.TM.json | 0 ...finitionObjectConstPropertyNoValue.TM.json | 0 ...nObjectConstPropertyNumberAboveMax.TM.json | 0 ...nObjectConstPropertyNumberBelowMin.TM.json | 0 ...tionObjectConstPropertyNumberConst.TM.json | 0 ...bjectConstPropertyNumberNotNumeric.TM.json | 0 ...tPropertyNumberUnsupportedProperty.TM.json | 0 ...tionObjectConstPropertyStringConst.TM.json | 0 ...tPropertyStringUnsupportedProperty.TM.json | 0 ...tConstPropertyStringValueNotString.TM.json | 0 ...nitionObjectConstPropertyTypeArray.TM.json | 0 ...initionObjectConstPropertyTypeNull.TM.json | 0 ...itionObjectConstPropertyTypeObject.TM.json | 0 ...tionObjectConstUnsupportedProperty.TM.json | 0 ...DefinitionObjectConstValueNoSchema.TM.json | 0 ...nitionObjectErrorMessageNoProperty.TM.json | 0 ...initionObjectErrorMessageNotString.TM.json | 0 ...bjectErrorMessagePropertyNotString.TM.json | 0 ...chemaDefinitionObjectNoDeterminant.TM.json | 0 ...efinitionObjectPropertiesNotObject.TM.json | 0 ...hemaDefinitionObjectPropertyNoType.TM.json | 0 ...efinitionObjectPropertyObjectConst.TM.json | 0 .../SchemaDefinitionObjectPropertyRef.TM.json | 2 +- ...efinitionObjectPropertyStringConst.TM.json | 0 ...maDefinitionObjectPropertyTypeNull.TM.json | 0 ...DefinitionObjectRequiredNoProperty.TM.json | 0 .../SchemaDefinitionRef.TM.json | 2 +- ...finitionStringConstContentEncoding.TM.json | 0 .../SchemaDefinitionStringConstFormat.TM.json | 0 ...SchemaDefinitionStringConstPattern.TM.json | 0 ...tionStringConstUnsupportedProperty.TM.json | 0 ...efinitionStringConstValueNotString.TM.json | 0 ...ingContentEncodingUnsupportedValue.TM.json | 0 .../SchemaDefinitionStringEnumConst.TM.json | 0 ...efinitionStringEnumContentEncoding.TM.json | 0 ...DefinitionStringEnumElementInvalid.TM.json | 0 .../SchemaDefinitionStringEnumFormat.TM.json | 0 .../SchemaDefinitionStringEnumPattern.TM.json | 0 ...SchemaDefinitionStringEnumReadOnly.TM.json | 0 ...itionStringEnumUnsupportedProperty.TM.json | 0 ...tionStringFormatAndContentEncoding.TM.json | 0 ...maDefinitionStringFormatAndPattern.TM.json | 0 ...nitionStringFormatUnsupportedValue.TM.json | 0 ...ionStringPatternAndContentEncoding.TM.json | 0 ...nStringPatternNotDurationOrDecimal.TM.json | 0 ...efinitionStringPatternRegexInvalid.TM.json | 0 .../SchemaDefinitionStringReadOnly.TM.json | 0 ...efinitionStringUnsupportedProperty.TM.json | 0 .../SchemaDefinitionTypeNull.TM.json | 0 .../ThingUnsupportedProperty.TM.json | 0 .../invalidAioBinding/TitleEmpty.TM.json | 0 .../invalidAioBinding/TitleInvalid.TM.json | 0 .../thing-models/invalidJson/ArrayKey.TM.json | 0 .../invalidJson/BooleanKey.TM.json | 0 .../invalidJson/DuplicateKey.TM.json | 0 .../invalidJson/MissingColon.TM.json | 0 .../invalidJson/MissingComma.TM.json | 0 .../invalidJson/MissingElement.TM.json | 0 .../invalidJson/MissingKey.TM.json | 0 .../invalidJson/MissingValue.TM.json | 0 .../invalidJson/NumericKey.TM.json | 0 .../invalidJson/ObjectKey.TM.json | 0 .../invalidJson/TrailingComma.TM.json | 0 .../invalidJson/UnclosedArray.TM.json | 0 .../invalidJson/UnclosedObject.TM.json | 0 .../invalidThing/ActionFormOpRead.TM.json | 0 .../invalidThing/ActionFormOpSub.TM.json | 0 .../invalidThing/ActionFormOpWrite.TM.json | 0 .../invalidThing/ActionFormsEmpty.TM.json | 0 .../invalidThing/ContextMissingWot.TM.json | 0 .../invalidThing/ContextWrongType.TM.json | 0 .../invalidThing/EventFormOpInvoke.TM.json | 0 .../invalidThing/EventFormOpRead.TM.json | 0 .../invalidThing/EventFormOpSubAll.TM.json | 0 .../invalidThing/EventFormOpWrite.TM.json | 0 .../invalidThing/EventFormsEmpty.TM.json | 0 .../invalidThing/NoContext.TM.json | 0 .../thing-models/invalidThing/NoType.TM.json | 0 .../invalidThing/PropertyFormOpInvoke.TM.json | 0 .../PropertyFormOpReadAll.TM.json | 0 .../invalidThing/PropertyFormOpSub.TM.json | 0 .../PropertyFormOpWriteMulti.TM.json | 0 .../invalidThing/PropertyFormsEmpty.TM.json | 0 .../invalidThing/RootFormNoOp.TM.json | 0 .../invalidThing/RootFormOpArrayEmpty.TM.json | 0 .../RootFormOpElementEmpty.TM.json | 0 .../invalidThing/RootFormOpEmpty.TM.json | 0 .../invalidThing/RootFormOpReadOne.TM.json | 0 .../invalidThing/RootFormOpSubOne.TM.json | 0 .../invalidThing/RootFormOpWriteOne.TM.json | 0 .../invalidThing/RootFormsEmpty.TM.json | 0 ...chemaDefinitionArrayItemsNotObject.TM.json | 0 ...aDefinitionArrayItemsTypeNotString.TM.json | 0 ...efinitionArrayItemsTypeUnsupported.TM.json | 0 ...hemaDefinitionIntegerMaxNotNumeric.TM.json | 0 ...hemaDefinitionIntegerMinNotNumeric.TM.json | 0 ...onMapAdditionalPropertiesNotObject.TM.json | 0 ...pAdditionalPropertiesTypeNotString.TM.json | 0 ...dditionalPropertiesTypeUnsupported.TM.json | 0 ...chemaDefinitionNumberMaxNotNumeric.TM.json | 0 ...chemaDefinitionNumberMinNotNumeric.TM.json | 0 ...ObjectConstPropertyTypeUnsupported.TM.json | 0 ...initionObjectPropertyTypeNotString.TM.json | 0 ...itionObjectPropertyTypeUnsupported.TM.json | 0 ...aDefinitionObjectRequiredNotString.TM.json | 0 ...tionStringContentEncodingNotString.TM.json | 0 ...emaDefinitionStringFormatNotString.TM.json | 0 ...maDefinitionStringPatternNotString.TM.json | 0 .../SchemaDefinitionTypeNotString.TM.json | 0 .../SchemaDefinitionTypeUnsupported.TM.json | 0 .../invalidThing/TitleNotString.TM.json | 0 .../invalidThing/TypeEmpty.TM.json | 0 .../invalidThing/TypeNotThingModel.TM.json | 0 .../thing-models/valid/LinkExtends.TM.json | 0 .../thing-models/valid/LinkNoRel.TM.json | 0 .../thing-models/valid/LinkOtherRel.TM.json | 0 .../thing-models/valid/Noop.TM.json | 0 ...eadablePropertyAdditionalResponses.TM.json | 0 ...ritablePropertyAdditionalResponses.TM.json | 0 .../valid/ThingOneNamedMyThing.TM.json | 22 ++++++ ...ngOneWithGeneratedNameMyPropSchema.TM.json | 28 +++++++ .../valid/ThingTwoNamedMyThing.TM.json | 22 ++++++ ...ngTwoWithGeneratedNameMyPropSchema.TM.json | 28 +++++++ 799 files changed, 2020 insertions(+), 72 deletions(-) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/name-rules/DefaultSchemaNames.json (100%) create mode 100644 codegen2/test/sandbox/ActionInputRefNotFound/schemas/PokeInputArguments.schema.json create mode 100644 codegen2/test/sandbox/ActionInputRefString/schemas/PokeInputArguments.schema.json create mode 100644 codegen2/test/sandbox/ActionOutputRefNotFound/schemas/PeekOutputArguments.schema.json create mode 100644 codegen2/test/sandbox/ActionOutputRefString/schemas/PeekOutputArguments.schema.json create mode 100644 codegen2/test/sandbox/DuplicatedGeneratedNameBetweenThingAndJsonSchema/schemas/AnObjectSchema.schema.json create mode 100644 codegen2/test/sandbox/DuplicatedGeneratedNameBetweenThingAndJsonSchema/schemas/DoitInputArguments.schema.json create mode 100644 codegen2/test/sandbox/EventRefNotFound/schemas/AlertEvent.schema.json create mode 100644 codegen2/test/sandbox/PropertyRefNotFound/schemas/AlphaProperty.schema.json create mode 100644 codegen2/test/sandbox/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses/schemas/AlphaProperty.schema.json create mode 100644 codegen2/test/sandbox/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses/schemas/AlphaWriteResponseSchema.schema.json create mode 100644 codegen2/test/sandbox/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses/schemas/Error.schema.json create mode 100644 codegen2/test/sandbox/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses/schemas/PropertyCollection.schema.json create mode 100644 codegen2/test/sandbox/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses/schemas/PropertyCollectionReadError.schema.json create mode 100644 codegen2/test/sandbox/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses/schemas/AlphaProperty.schema.json create mode 100644 codegen2/test/sandbox/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses/schemas/AlphaReadResponseSchema.schema.json create mode 100644 codegen2/test/sandbox/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses/schemas/Error.schema.json create mode 100644 codegen2/test/sandbox/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses/schemas/PropertyCollection.schema.json create mode 100644 codegen2/test/sandbox/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses/schemas/PropertyCollectionWriteError.schema.json create mode 100644 codegen2/test/sandbox/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses/schemas/PropertyUpdate.schema.json create mode 100644 codegen2/test/schemas/json-schemas/AStringSchema.json rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => schemas}/json-schemas/AnObjectSchema.json (100%) create mode 100644 codegen2/test/schemas/json-schemas/AnotherObjectSchema.json rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/SampleTest.json (100%) create mode 100644 codegen2/test/test-cases/failure/ActionDuplicateSchemaNamesObjectsDifferentFieldValues.json create mode 100644 codegen2/test/test-cases/failure/ActionDuplicateSchemaNamesObjectsDifferentFields.json rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormAdditionalResponseContentTypeEmpty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormAdditionalResponseContentTypeText.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormAdditionalResponseNoMatchingSchemaDefinition.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormAdditionalResponseNoSchema.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormAdditionalResponseNoSchemaDefinitions.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormAdditionalResponseNoSuccess.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionMap.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionNotObject.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormAdditionalResponseSchemaEmpty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormAdditionalResponseSuccessTrue.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormAdditionalResponseUnsupportedProperty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormAdditionalResponsesMultiple.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormContentTypeText.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormHeaderCodeEmpty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormHeaderCodeNoMatchingSchemaDefinition.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormHeaderCodeNoSchemaDefinitions.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormHeaderCodeSchemaDefinitionNotEnum.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormHeaderInfoContentTypeEmpty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormHeaderInfoContentTypeNotJson.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormHeaderInfoNoContentType.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormHeaderInfoNoMatchingSchemaDefinition.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormHeaderInfoNoSchema.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormHeaderInfoNoSchemaDefinitions.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionMap.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionNotObject.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormHeaderInfoSchemaEmpty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormHeaderInfoSuccessTrue.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormHeaderInfoUnsupportedProperty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormHeaderInfosMultiple.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormOpInvokeDuplicate.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormOpRead.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormOpSub.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormOpWrite.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormServiceGroupEmpty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormTopicNoContentType.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormTopicTokenAction.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormTopicTokenConsumerId.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormTopicTokenMaintainerId.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormTopicTokenSenderId.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormUnsupportedProperty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormsEmpty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormsMultipleContentTypes.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormsOpInvokeDuplicate.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormsOplessAndInvoke.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionFormsOplessDuplicate.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionInputMap.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionInputNullAndContentTypeJson.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionInputNumber.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionInputObjectAndContentTypeCustom.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionInputObjectAndContentTypeRaw.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionInputObjectConst.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionInputObjectErrorMessage.json (100%) create mode 100644 codegen2/test/test-cases/failure/ActionInputRefNotFound.json create mode 100644 codegen2/test/test-cases/failure/ActionInputRefString.json rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionInputString.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionNoForms.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionNoFormsWithTopic.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionOutputMap.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionOutputNullAndContentTypeJson.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionOutputNumber.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionOutputObjectAndContentTypeCustom.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionOutputObjectAndContentTypeRaw.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionOutputObjectConst.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionOutputObjectErrorMessage.json (100%) create mode 100644 codegen2/test/test-cases/failure/ActionOutputRefNotFound.json create mode 100644 codegen2/test/test-cases/failure/ActionOutputRefString.json rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionOutputString.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ActionUnsupportedProperty.json (100%) create mode 100644 codegen2/test/test-cases/failure/ActionsTopicDuplication.json rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ArrayKey.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/BooleanKey.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ContextDtvWrongPrefix.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ContextDtvWrongUri.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ContextMissingDtv.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ContextMissingWot.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ContextWrongType.json (100%) create mode 100644 codegen2/test/test-cases/failure/DuplicateGeneratedNameAcrossThingsInOneFile.json create mode 100644 codegen2/test/test-cases/failure/DuplicateGeneratedNameAcrossThingsInTwoFiles.json rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/DuplicateKey.json (100%) create mode 100644 codegen2/test/test-cases/failure/DuplicateThingNameAcrossThingsInOneFile.json create mode 100644 codegen2/test/test-cases/failure/DuplicateThingNameAcrossThingsInTwoFiles.json create mode 100644 codegen2/test/test-cases/failure/DuplicatedGeneratedNameAcrossJsonSchemas.json create mode 100644 codegen2/test/test-cases/failure/DuplicatedGeneratedNameBetweenThingAndJsonSchema.json rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventBooleanConst.json (100%) create mode 100644 codegen2/test/test-cases/failure/EventDuplicateSchemaNamesDifferentTypes.json create mode 100644 codegen2/test/test-cases/failure/EventDuplicateSchemaNamesEnumsDifferentValues.json create mode 100644 codegen2/test/test-cases/failure/EventDuplicateSchemaNamesObjectsDifferentFieldValues.json create mode 100644 codegen2/test/test-cases/failure/EventDuplicateSchemaNamesObjectsDifferentFields.json rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventFormAdditionalResponses.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventFormContentTypeText.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventFormHeaderCode.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventFormHeaderInfo.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventFormOpInvoke.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventFormOpRead.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventFormOpSubAll.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventFormOpSubDuplicate.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventFormOpWrite.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventFormServiceGroupEmpty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventFormTopicNoContentType.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventFormTopicTokenAction.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventFormTopicTokenConsumerId.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventFormTopicTokenExecutorId.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventFormTopicTokenInvokerId.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventFormTopicTokenMaintainerId.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventFormUnsupportedProperty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventFormsEmpty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventFormsOpSubDuplicate.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventFormsOplessAndSub.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventFormsOplessDuplicate.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventIntegerConst.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventNoForms.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventNoFormsWithTopicAndNoRootFormSubAll.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventNullAndContentTypeJson.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventNumberConst.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventObjectAndContentTypeCustom.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventObjectAndContentTypeRaw.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventObjectConst.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventObjectErrorMessage.json (100%) create mode 100644 codegen2/test/test-cases/failure/EventRefNotFound.json rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventStringConst.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/EventUnsupportedProperty.json (100%) create mode 100644 codegen2/test/test-cases/failure/EventsTopicDuplication.json rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/LinkEmptyHref.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/LinkEmptyType.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/LinkNoHref.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/LinkNoType.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/LinkNonJsonFile.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/LinkNonexistentFile.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/LinkTypeNotJson.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/LinkUnsupportedProperty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/MissingColon.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/MissingComma.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/MissingElement.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/MissingKey.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/MissingValue.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/MultipleLinks.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/NoClientOrServer.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/NoContext.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/NoThingOrSchema.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/NoTitle.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/NoType.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/NonexistentThing.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/NumericKey.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ObjectKey.json (100%) create mode 100644 codegen2/test/test-cases/failure/PropertiesReadTopicDuplication.json create mode 100644 codegen2/test/test-cases/failure/PropertiesWriteTopicDuplication.json rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyBooleanConst.json (100%) create mode 100644 codegen2/test/test-cases/failure/PropertyDuplicateSchemaNamesDifferentTypes.json create mode 100644 codegen2/test/test-cases/failure/PropertyDuplicateSchemaNamesEnumsDifferentValues.json create mode 100644 codegen2/test/test-cases/failure/PropertyDuplicateSchemaNamesObjectsDifferentFieldValues.json create mode 100644 codegen2/test/test-cases/failure/PropertyDuplicateSchemaNamesObjectsDifferentFields.json rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormAdditionalResponseContentTypeEmpty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormAdditionalResponseContentTypeText.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormAdditionalResponseNoSchema.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormAdditionalResponseNoSchemaDefinitions.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormAdditionalResponseNoSuccess.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionMap.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionNotObject.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormAdditionalResponseSchemaEmpty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormAdditionalResponseSuccessTrue.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormAdditionalResponseUnsupportedProperty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormAdditionalResponsesMultiple.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormContentTypeText.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormHeaderCode.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormHeaderInfo.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormOpInvoke.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormOpReadAll.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormOpReadDuplicate.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormOpSub.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormOpWriteDuplicate.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormOpWriteMulti.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormReadWithoutTopicAndNoRootFormReadAll.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormServiceGroup.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormTopicNoContentType.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormTopicTokenExecutorId.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormTopicTokenInvokerId.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormTopicTokenNoActionWhenReadAndWrite.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormTopicTokenSenderId.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormUnsupportedProperty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormsEmpty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormsOpReadDuplicate.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormsOpWriteDuplicate.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormsOpWriteNoRead.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormsOplessAndRead.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyFormsOplessDuplicate.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyIntegerConst.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyNoForms.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyNumberConst.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyObjectConst.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyObjectErrorMessage.json (100%) create mode 100644 codegen2/test/test-cases/failure/PropertyRefNotFound.json rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyStringConst.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyTypeNull.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/PropertyUnsupportedProperty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormAdditionalResponseContentTypeEmpty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormAdditionalResponseContentTypeText.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormAdditionalResponseNoSuccess.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormAdditionalResponseSchema.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormAdditionalResponseSuccessTrue.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormAdditionalResponseUnsupportedProperty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormAdditionalResponsesAndSubAll.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormAdditionalResponsesMultiple.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormContentTypeCustom.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormContentTypeRaw.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormContentTypeText.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormHeaderCode.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormHeaderInfo.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormNoContentType.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormNoOp.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormNoTopic.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormOpArrayEmpty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormOpElementEmpty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormOpEmpty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormOpReadAllAndSubAll.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormOpReadAllDuplicate.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormOpReadOne.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormOpSubAllDuplicate.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormOpSubOne.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormOpWiteMultiAndSubAll.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormOpWriteMultiDuplicate.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormOpWriteOne.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormReadAllButNoProperties.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormServiceGroupEmpty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormServiceGroupNoSubAll.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormSubAllButNoEvents.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormTopicEmpty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormTopicLevelEmpty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormTopicLevelInvalid.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormTopicReservedStart.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormTopicTokenActionWhenSubAll.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormTopicTokenConsumerIdWhenSubAll.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormTopicTokenCustomEmpty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormTopicTokenCustomInvalid.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormTopicTokenEmpty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormTopicTokenExecutorId.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormTopicTokenInvokerId.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormTopicTokenMaintainerIdWhenSubAll.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormTopicTokenSenderIdWhenReadAll.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormTopicTokenSenderIdWhenWriteMulti.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormTopicTokenUnrecognized.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormWriteMultiButNoWritableProperties.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormsEmpty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormsOpReadAllDuplicate.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormsOpSubAllDuplicate.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormsOpWriteMultiDuplicate.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/RootFormsOpWriteMultiNoReadAll.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionArrayConst.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionArrayItemsNoType.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionArrayItemsNotObject.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionArrayItemsObjectConst.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionArrayItemsRef.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionArrayItemsStringConst.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionArrayItemsTypeNotString.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionArrayItemsTypeNull.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionArrayItemsTypeUnsupported.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionArrayNoItems.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionBooleanConstValueNotBoolean.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionBooleanReadOnly.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionBooleanUnsupportedProperty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionIntegerConstValueAboveMax.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionIntegerConstValueBelowMin.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionIntegerConstValueNotInteger.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionIntegerConstValueNotNumeric.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionIntegerMaxNotInteger.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionIntegerMaxNotNumeric.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionIntegerMinAboveMax.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionIntegerMinNotInteger.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionIntegerMinNotNumeric.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionIntegerReadOnly.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionIntegerUnsupportedProperty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNoType.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNotObject.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesObjectConst.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesRef.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesStringConst.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNotString.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNull.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionMapConst.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionNoType.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionNumberConstValueAboveMax.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionNumberConstValueBelowMin.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionNumberConstValueNotNumeric.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionNumberMaxNotNumeric.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionNumberMinAboveMax.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionNumberMinNotNumeric.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionNumberReadOnly.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionNumberUnsupportedProperty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectBothDeterminants.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectConstNotObject.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanConst.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerAboveMax.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerBelowMin.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerConst.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotInteger.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectConstPropertyNoType.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectConstPropertyNoValue.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberAboveMax.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberBelowMin.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberConst.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberNotNumeric.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectConstPropertyStringConst.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectConstPropertyStringValueNotString.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeArray.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeNull.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeObject.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeUnsupported.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectConstUnsupportedProperty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectConstValueNoSchema.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectErrorMessageNoProperty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectErrorMessageNotString.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectErrorMessagePropertyNotString.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectNoDeterminant.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectPropertiesNotObject.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectPropertyNoType.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectPropertyObjectConst.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectPropertyRef.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectPropertyStringConst.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectPropertyTypeNotString.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectPropertyTypeNull.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectPropertyTypeUnsupported.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectRequiredNoProperty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionObjectRequiredNotString.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionRef.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionStringConstContentEncoding.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionStringConstFormat.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionStringConstPattern.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionStringConstUnsupportedProperty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionStringConstValueNotString.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionStringContentEncodingNotString.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionStringContentEncodingUnsupportedValue.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionStringEnumConst.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionStringEnumContentEncoding.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionStringEnumElementInvalid.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionStringEnumFormat.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionStringEnumPattern.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionStringEnumReadOnly.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionStringEnumUnsupportedProperty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionStringFormatAndContentEncoding.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionStringFormatAndPattern.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionStringFormatNotString.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionStringFormatUnsupportedValue.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionStringPatternAndContentEncoding.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionStringPatternNotDurationOrDecimal.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionStringPatternNotString.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionStringPatternRegexInvalid.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionStringReadOnly.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionStringUnsupportedProperty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionTypeNotString.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionTypeNull.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/SchemaDefinitionTypeUnsupported.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/ThingUnsupportedProperty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/TitleEmpty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/TitleInvalid.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/TitleNotString.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/TrailingComma.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/TypeEmpty.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/TypeNotThingModel.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/UnclosedArray.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/UnclosedObject.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/failure/UnsupportedLanguage.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/success/LinkExtends.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/success/LinkNoRel.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/success/LinkOtherRel.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/success/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/test-cases/success/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/.vscode/settings.json (100%) create mode 100644 codegen2/test/thing-models/invalidAioBinding/ActionDuplicateSchemaNamesObjectsDifferentFieldValues.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/ActionDuplicateSchemaNamesObjectsDifferentFields.TM.json rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormAdditionalResponseContentTypeEmpty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormAdditionalResponseContentTypeText.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormAdditionalResponseNoMatchingSchemaDefinition.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormAdditionalResponseNoSchema.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormAdditionalResponseNoSchemaDefinitions.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormAdditionalResponseNoSuccess.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionMap.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionNotObject.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormAdditionalResponseSchemaEmpty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormAdditionalResponseSuccessTrue.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormAdditionalResponseUnsupportedProperty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormAdditionalResponsesMultiple.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormContentTypeText.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormHeaderCodeEmpty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormHeaderCodeNoMatchingSchemaDefinition.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormHeaderCodeNoSchemaDefinitions.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormHeaderCodeSchemaDefinitionNotEnum.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormHeaderInfoContentTypeEmpty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormHeaderInfoContentTypeNotJson.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormHeaderInfoNoContentType.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormHeaderInfoNoMatchingSchemaDefinition.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormHeaderInfoNoSchema.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormHeaderInfoNoSchemaDefinitions.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionMap.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionNotObject.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormHeaderInfoSchemaEmpty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormHeaderInfoSuccessTrue.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormHeaderInfoUnsupportedProperty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormHeaderInfosMultiple.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormOpInvokeDuplicate.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormServiceGroupEmpty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormTopicNoContentType.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormTopicTokenAction.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormTopicTokenConsumerId.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormTopicTokenMaintainerId.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormTopicTokenSenderId.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormUnsupportedProperty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormsMultipleContentTypes.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormsOpInvokeDuplicate.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormsOplessAndInvoke.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionFormsOplessDuplicate.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionInputMap.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionInputNullAndContentTypeJson.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionInputNumber.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionInputObjectAndContentTypeCustom.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionInputObjectAndContentTypeRaw.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionInputObjectConst.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionInputObjectErrorMessage.TM.json (100%) create mode 100644 codegen2/test/thing-models/invalidAioBinding/ActionInputRefNotFound.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/ActionInputRefString.TM.json rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionInputString.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionNoForms.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionNoFormsWithTopic.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionOutputMap.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionOutputNullAndContentTypeJson.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionOutputNumber.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionOutputObjectAndContentTypeCustom.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionOutputObjectAndContentTypeRaw.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionOutputObjectConst.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionOutputObjectErrorMessage.TM.json (100%) create mode 100644 codegen2/test/thing-models/invalidAioBinding/ActionOutputRefNotFound.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/ActionOutputRefString.TM.json rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionOutputString.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ActionUnsupportedProperty.TM.json (100%) create mode 100644 codegen2/test/thing-models/invalidAioBinding/ActionsTopicDuplication.TM.json rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ContextDtvWrongPrefix.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ContextDtvWrongUri.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ContextMissingDtv.TM.json (100%) create mode 100644 codegen2/test/thing-models/invalidAioBinding/DuplicateGeneratedNameAcrossThingsInOneFile.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/DuplicateThingNameAcrossThingsInOneFile.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/DuplicatedGeneratedNameBetweenThingAndJsonSchema.TM.json rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/EventBooleanConst.TM.json (100%) create mode 100644 codegen2/test/thing-models/invalidAioBinding/EventDuplicateSchemaNamesDifferentTypes.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/EventDuplicateSchemaNamesEnumsDifferentValues.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/EventDuplicateSchemaNamesObjectsDifferentFieldValues.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/EventDuplicateSchemaNamesObjectsDifferentFields.TM.json rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/EventFormAdditionalResponses.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/EventFormContentTypeText.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/EventFormHeaderCode.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/EventFormHeaderInfo.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/EventFormOpSubDuplicate.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/EventFormServiceGroupEmpty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/EventFormTopicNoContentType.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/EventFormTopicTokenAction.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/EventFormTopicTokenConsumerId.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/EventFormTopicTokenExecutorId.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/EventFormTopicTokenInvokerId.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/EventFormTopicTokenMaintainerId.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/EventFormUnsupportedProperty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/EventFormsOpSubDuplicate.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/EventFormsOplessAndSub.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/EventFormsOplessDuplicate.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/EventIntegerConst.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/EventNoForms.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/EventNoFormsWithTopicAndNoRootFormSubAll.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/EventNullAndContentTypeJson.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/EventNumberConst.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/EventObjectAndContentTypeCustom.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/EventObjectAndContentTypeRaw.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/EventObjectConst.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/EventObjectErrorMessage.TM.json (100%) create mode 100644 codegen2/test/thing-models/invalidAioBinding/EventRefNotFound.TM.json rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/EventStringConst.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/EventUnsupportedProperty.TM.json (100%) create mode 100644 codegen2/test/thing-models/invalidAioBinding/EventsTopicDuplication.TM.json rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/LinkEmptyHref.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/LinkEmptyType.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/LinkNoHref.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/LinkNoType.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/LinkNonJsonFile.TM.json (86%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/LinkNonexistentFile.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/LinkTypeNotJson.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/LinkUnsupportedProperty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/MultipleLinks.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/NoTitle.TM.json (100%) create mode 100644 codegen2/test/thing-models/invalidAioBinding/PropertiesReadTopicDuplication.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/PropertiesWriteTopicDuplication.TM.json rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyBooleanConst.TM.json (100%) create mode 100644 codegen2/test/thing-models/invalidAioBinding/PropertyDuplicateSchemaNamesDifferentTypes.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/PropertyDuplicateSchemaNamesEnumsDifferentValues.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/PropertyDuplicateSchemaNamesObjectsDifferentFieldValues.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/PropertyDuplicateSchemaNamesObjectsDifferentFields.TM.json rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormAdditionalResponseContentTypeEmpty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormAdditionalResponseContentTypeText.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormAdditionalResponseNoSchema.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormAdditionalResponseNoSchemaDefinitions.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormAdditionalResponseNoSuccess.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionMap.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionNotObject.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormAdditionalResponseSchemaEmpty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormAdditionalResponseSuccessTrue.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormAdditionalResponseUnsupportedProperty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormAdditionalResponsesMultiple.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormContentTypeText.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormHeaderCode.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormHeaderInfo.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormOpReadDuplicate.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormOpWriteDuplicate.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormReadWithoutTopicAndNoRootFormReadAll.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormServiceGroup.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormTopicNoContentType.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormTopicTokenExecutorId.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormTopicTokenInvokerId.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormTopicTokenNoActionWhenReadAndWrite.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormTopicTokenSenderId.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormUnsupportedProperty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormsOpReadDuplicate.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormsOpWriteDuplicate.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormsOpWriteNoRead.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormsOplessAndRead.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyFormsOplessDuplicate.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyIntegerConst.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyNoForms.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyNumberConst.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyObjectConst.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyObjectErrorMessage.TM.json (100%) create mode 100644 codegen2/test/thing-models/invalidAioBinding/PropertyRefNotFound.TM.json rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyStringConst.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyTypeNull.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/PropertyUnsupportedProperty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormAdditionalResponseContentTypeEmpty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormAdditionalResponseContentTypeText.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormAdditionalResponseNoSuccess.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormAdditionalResponseSchema.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormAdditionalResponseSuccessTrue.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormAdditionalResponseUnsupportedProperty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormAdditionalResponsesAndSubAll.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormAdditionalResponsesMultiple.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormContentTypeCustom.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormContentTypeRaw.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormContentTypeText.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormHeaderCode.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormHeaderInfo.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormNoContentType.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormNoTopic.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormOpReadAllAndSubAll.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormOpReadAllDuplicate.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormOpSubAllDuplicate.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormOpWiteMultiAndSubAll.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormOpWriteMultiDuplicate.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormReadAllButNoProperties.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormServiceGroupEmpty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormServiceGroupNoSubAll.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormSubAllButNoEvents.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormTopicEmpty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormTopicLevelEmpty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormTopicLevelInvalid.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormTopicReservedStart.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormTopicTokenActionWhenSubAll.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormTopicTokenConsumerIdWhenSubAll.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormTopicTokenCustomEmpty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormTopicTokenCustomInvalid.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormTopicTokenEmpty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormTopicTokenExecutorId.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormTopicTokenInvokerId.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormTopicTokenMaintainerIdWhenSubAll.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormTopicTokenSenderIdWhenReadAll.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormTopicTokenSenderIdWhenWriteMulti.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormTopicTokenUnrecognized.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormWriteMultiButNoWritableProperties.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormsOpReadAllDuplicate.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormsOpSubAllDuplicate.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormsOpWriteMultiDuplicate.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/RootFormsOpWriteMultiNoReadAll.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionArrayConst.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsNoType.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsObjectConst.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsRef.TM.json (88%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsStringConst.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsTypeNull.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionArrayNoItems.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionBooleanConstValueNotBoolean.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionBooleanReadOnly.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionBooleanUnsupportedProperty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionIntegerConstValueAboveMax.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionIntegerConstValueBelowMin.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionIntegerConstValueNotInteger.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionIntegerConstValueNotNumeric.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionIntegerMaxNotInteger.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionIntegerMinAboveMax.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionIntegerMinNotInteger.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionIntegerReadOnly.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionIntegerUnsupportedProperty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesNoType.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesObjectConst.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TM.json (88%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesStringConst.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesTypeNull.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionMapConst.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionNoType.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionNumberConstValueAboveMax.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionNumberConstValueBelowMin.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionNumberConstValueNotNumeric.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionNumberMinAboveMax.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionNumberReadOnly.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionNumberUnsupportedProperty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectBothDeterminants.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectConstNotObject.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanConst.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerAboveMax.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerBelowMin.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerConst.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotInteger.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoType.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoValue.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberAboveMax.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberBelowMin.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberConst.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberNotNumeric.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringConst.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringValueNotString.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeArray.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeNull.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeObject.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectConstUnsupportedProperty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectConstValueNoSchema.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectErrorMessageNoProperty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectErrorMessageNotString.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectErrorMessagePropertyNotString.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectNoDeterminant.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertiesNotObject.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyNoType.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyObjectConst.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyRef.TM.json (88%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyStringConst.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyTypeNull.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionObjectRequiredNoProperty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionRef.TM.json (87%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionStringConstContentEncoding.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionStringConstFormat.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionStringConstPattern.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionStringConstUnsupportedProperty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionStringConstValueNotString.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionStringContentEncodingUnsupportedValue.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionStringEnumConst.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionStringEnumContentEncoding.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionStringEnumElementInvalid.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionStringEnumFormat.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionStringEnumPattern.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionStringEnumReadOnly.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionStringEnumUnsupportedProperty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionStringFormatAndContentEncoding.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionStringFormatAndPattern.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionStringFormatUnsupportedValue.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionStringPatternAndContentEncoding.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionStringPatternNotDurationOrDecimal.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionStringPatternRegexInvalid.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionStringReadOnly.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionStringUnsupportedProperty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/SchemaDefinitionTypeNull.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/ThingUnsupportedProperty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/TitleEmpty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidAioBinding/TitleInvalid.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidJson/ArrayKey.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidJson/BooleanKey.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidJson/DuplicateKey.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidJson/MissingColon.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidJson/MissingComma.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidJson/MissingElement.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidJson/MissingKey.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidJson/MissingValue.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidJson/NumericKey.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidJson/ObjectKey.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidJson/TrailingComma.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidJson/UnclosedArray.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidJson/UnclosedObject.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/ActionFormOpRead.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/ActionFormOpSub.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/ActionFormOpWrite.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/ActionFormsEmpty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/ContextMissingWot.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/ContextWrongType.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/EventFormOpInvoke.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/EventFormOpRead.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/EventFormOpSubAll.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/EventFormOpWrite.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/EventFormsEmpty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/NoContext.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/NoType.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/PropertyFormOpInvoke.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/PropertyFormOpReadAll.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/PropertyFormOpSub.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/PropertyFormOpWriteMulti.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/PropertyFormsEmpty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/RootFormNoOp.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/RootFormOpArrayEmpty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/RootFormOpElementEmpty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/RootFormOpEmpty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/RootFormOpReadOne.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/RootFormOpSubOne.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/RootFormOpWriteOne.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/RootFormsEmpty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/SchemaDefinitionArrayItemsNotObject.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/SchemaDefinitionArrayItemsTypeNotString.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/SchemaDefinitionArrayItemsTypeUnsupported.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/SchemaDefinitionIntegerMaxNotNumeric.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/SchemaDefinitionIntegerMinNotNumeric.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/SchemaDefinitionMapAdditionalPropertiesNotObject.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeNotString.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/SchemaDefinitionNumberMaxNotNumeric.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/SchemaDefinitionNumberMinNotNumeric.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/SchemaDefinitionObjectConstPropertyTypeUnsupported.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/SchemaDefinitionObjectPropertyTypeNotString.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/SchemaDefinitionObjectPropertyTypeUnsupported.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/SchemaDefinitionObjectRequiredNotString.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/SchemaDefinitionStringContentEncodingNotString.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/SchemaDefinitionStringFormatNotString.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/SchemaDefinitionStringPatternNotString.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/SchemaDefinitionTypeNotString.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/SchemaDefinitionTypeUnsupported.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/TitleNotString.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/TypeEmpty.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/invalidThing/TypeNotThingModel.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/valid/LinkExtends.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/valid/LinkNoRel.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/valid/LinkOtherRel.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/valid/Noop.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/valid/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TM.json (100%) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/thing-models/valid/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TM.json (100%) create mode 100644 codegen2/test/thing-models/valid/ThingOneNamedMyThing.TM.json create mode 100644 codegen2/test/thing-models/valid/ThingOneWithGeneratedNameMyPropSchema.TM.json create mode 100644 codegen2/test/thing-models/valid/ThingTwoNamedMyThing.TM.json create mode 100644 codegen2/test/thing-models/valid/ThingTwoWithGeneratedNameMyPropSchema.TM.json diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs index dec3f9f945..1bc63cd61d 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorLog.cs @@ -8,9 +8,10 @@ public class ErrorLog { private readonly Dictionary> referencesFromThings; private readonly Dictionary<(string, string), List> typedReferencesFromThings; - private readonly Dictionary> namesInThings; + private readonly Dictionary> namesOfThings; + private readonly Dictionary> namesInThings; private readonly Dictionary> topicsInThings; - private readonly Dictionary>> schemaNames; + private readonly Dictionary> schemaNames; private readonly string defaultFolder; public string Phase { get; set; } = "Initialization"; @@ -27,9 +28,10 @@ public ErrorLog(string defaultFolder) { this.referencesFromThings = new Dictionary>(); this.typedReferencesFromThings = new Dictionary<(string, string), List>(); - this.namesInThings = new Dictionary>(); + this.namesOfThings = new Dictionary>(); + this.namesInThings = new Dictionary>(); this.topicsInThings = new Dictionary>(); - this.schemaNames = new Dictionary>>(); + this.schemaNames = new Dictionary>(); this.defaultFolder = defaultFolder; Errors = new HashSet(); @@ -39,11 +41,22 @@ public ErrorLog(string defaultFolder) public void CheckForDuplicatesInThings() { - foreach (var (name, nameSites) in namesInThings) + foreach (var (name, nameSites) in namesOfThings) { if (nameSites.Count > 1) { foreach (var (filename, lineNumber) in nameSites) + { + AddError(ErrorLevel.Error, ErrorCondition.Duplication, $"Duplicate use of Thing name '{name}'.", filename, lineNumber, crossRef: name); + } + } + } + + foreach (var (name, nameSites) in namesInThings) + { + if (nameSites.Count > 1) + { + foreach (var (thingName, (filename, lineNumber)) in nameSites) { AddError(ErrorLevel.Error, ErrorCondition.Duplication, $"Duplicate use of generated name '{name}' across Thing Descriptions.", filename, lineNumber, crossRef: name); } @@ -114,17 +127,27 @@ public void RegisterTypedReferenceFromThing(string refPath, string filename, int typedReferences.Add(new ValueReference(filename, lineNumber, refValue)); } - public void RegisterNameInThing(string name, string filename, int lineNumber) + public void RegisterNameOfThing(string name, string filename, int lineNumber) + { + if (!namesOfThings.TryGetValue(name, out List<(string, int)>? nameSites)) + { + nameSites = new(); + namesOfThings[name] = nameSites; + } + nameSites.Add((filename, lineNumber)); + } + + public void RegisterNameInThing(string name, string thingName, string filename, int lineNumber) { - if (!namesInThings.TryGetValue(name, out Dictionary? nameSites)) + if (!namesInThings.TryGetValue(name, out Dictionary? nameSites)) { nameSites = new(); namesInThings[name] = nameSites; } - if (!nameSites.TryGetValue(filename, out int extantLineNumber) || extantLineNumber < 0) + if (!nameSites.ContainsKey(thingName)) { - nameSites[filename] = lineNumber; + nameSites[thingName] = (filename, lineNumber); } } @@ -140,22 +163,22 @@ public void RegisterTopicInThing(string resolvedTopic, string filename, int line public void RegisterSchemaName(string name, string filename, string dirpath, int lineNumber) { - if (!schemaNames.TryGetValue(name, out List>? nameSites)) + if (!schemaNames.TryGetValue(name, out List<(string, int)>? nameSites)) { nameSites = new(); schemaNames[name] = nameSites; } - if (dirpath.Equals(this.defaultFolder) && namesInThings.TryGetValue(name, out Dictionary? thingNameSites)) + if (dirpath.Equals(this.defaultFolder) && namesInThings.TryGetValue(name, out Dictionary? thingNameSites)) { - foreach (KeyValuePair thingNameSite in thingNameSites) + foreach (KeyValuePair thingNameSite in thingNameSites) { - nameSites.Add(thingNameSite); + nameSites.Add(thingNameSite.Value); } } else { - nameSites.Add(new KeyValuePair(filename, lineNumber)); + nameSites.Add((filename, lineNumber)); } } diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs index 7f2cb54d08..13b7e9d304 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ErrorReporter.cs @@ -34,9 +34,14 @@ public void RegisterTypedReferenceFromThing(long byteIndex, string type, string this.errorLog.RegisterTypedReferenceFromThing(refPath, this.filename, GetLineNumber(byteIndex), type, refValue); } - public void RegisterNameInThing(string name, long byteIndex) + public void RegisterNameOfThing(string name, long byteIndex) { - this.errorLog.RegisterNameInThing(name, this.filename, GetLineNumber(byteIndex)); + this.errorLog.RegisterNameOfThing(name, this.filename, GetLineNumber(byteIndex)); + } + + public void RegisterNameInThing(string name, string thingName, long byteIndex) + { + this.errorLog.RegisterNameInThing(name, thingName, this.filename, GetLineNumber(byteIndex)); } public void RegisterTopicInThing(string resolvedTopic, long byteIndex, string rawTopic) diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompilerLib/CommandPerformer.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompilerLib/CommandPerformer.cs index 48bd2cbacd..4b49cc5f9b 100644 --- a/codegen2/src/Azure.Iot.Operations.ProtocolCompilerLib/CommandPerformer.cs +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompilerLib/CommandPerformer.cs @@ -197,6 +197,7 @@ private static List ParseThings(FileInfo[] thingFiles, ErrorLog err { thingCount++; parsedThings.Add(new ParsedThing(thing, thingFile.Name, thingFile.DirectoryName!, schemaNamer, errorReporter)); + errorReporter.RegisterNameOfThing(thing.Title!.Value.Value, thing.Title!.TokenIndex); } } } @@ -270,6 +271,10 @@ private static bool TryGetThings(ErrorReporter errorReporter, byte[] thingBytes, { errorReporter.RegisterReferenceFromThing(dataSchema.Value.Ref.TokenIndex, dataSchema.Value.Ref.Value.Value); } + else if (item is ValueTracker property && property.Value?.Ref != null) + { + errorReporter.RegisterReferenceFromThing(property.Value.Ref.TokenIndex, property.Value.Ref.Value.Value); + } } } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs index 2463dc0f4b..59544d819d 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/ActionSchemaGenerator.cs @@ -10,7 +10,7 @@ internal static class ActionSchemaGenerator { private const string InputOutputType = "object"; - internal static void GenerateActionSchemas(ErrorReporter errorReporter, TDThing tdThing, string dirName, SchemaNamer schemaNamer, string projectName, Dictionary schemaSpecs, Dictionary> referencedSchemas) + internal static void GenerateActionSchemas(ErrorReporter errorReporter, TDThing tdThing, string dirName, SchemaNamer schemaNamer, string projectName, Dictionary> schemaSpecs, Dictionary> referencedSchemas) { foreach (KeyValuePair> actionKvp in tdThing.Actions?.Entries ?? new()) { @@ -39,7 +39,7 @@ private static void ProcessAction( string projectName, string dirName, Dictionary>? schemaDefinitions, - Dictionary schemaSpecs, + Dictionary> schemaSpecs, Dictionary> referencedSchemas) { FormInfo? actionForm = FormInfo.CreateFromForm(errorReporter, tdAction.Forms?.Elements?.FirstOrDefault(f => f.Value.Op?.Elements?.Any(e => e.Value.Value == TDValues.OpInvokeAction) ?? false)?.Value, schemaDefinitions); @@ -51,14 +51,24 @@ private static void ProcessAction( if (inputRef != null) { string inputSchemaName = schemaNamer.GetActionInSchema(null, actionName); - schemaSpecs[inputSchemaName] = new AliasSpec(null, InputOutputType, inputRef.Value.Value, actionForm.Format, inputSchemaName, dirName, TokenIndex: -1); + if (!schemaSpecs.TryGetValue(inputSchemaName, out List? inputSpecs)) + { + inputSpecs = new List(); + schemaSpecs[inputSchemaName] = inputSpecs; + } + inputSpecs.Add(new AliasSpec(null, InputOutputType, inputRef.Value.Value, actionForm.Format, inputSchemaName, dirName, TokenIndex: -1)); errorReporter.RegisterTypedReferenceFromThing(inputRef.TokenIndex, InputOutputType, inputRef.Value.Value); } else if (tdAction.Input?.Value != null && tdAction.Input.Value.Type?.Value.Value != TDValues.TypeNull) { string inputSchemaName = schemaNamer.GetActionInSchema(tdAction.Input.Value, actionName); ObjectSpec inputObjectSpec = ObjectSpec.CreateFromDataSchema(errorReporter, schemaNamer, tdAction.Input, actionForm.Format, inputSchemaName, tdAction.Input.Value.Description?.Value.Value ?? $"Input arguments for action '{actionName}'"); - schemaSpecs[inputSchemaName] = inputObjectSpec; + if (!schemaSpecs.TryGetValue(inputSchemaName, out List? inputSpecs)) + { + inputSpecs = new List(); + schemaSpecs[inputSchemaName] = inputSpecs; + } + inputSpecs.Add(inputObjectSpec); } Dictionary responseFields = new(); @@ -66,14 +76,24 @@ private static void ProcessAction( if (outputRef != null) { string outputSchemaName = schemaNamer.GetActionOutSchema(null, actionName); - schemaSpecs[outputSchemaName] = new AliasSpec(null, InputOutputType, outputRef.Value.Value, actionForm.Format, outputSchemaName, dirName, TokenIndex: -1); + if (!schemaSpecs.TryGetValue(outputSchemaName, out List? outputSpecs)) + { + outputSpecs = new List(); + schemaSpecs[outputSchemaName] = outputSpecs; + } + outputSpecs.Add(new AliasSpec(null, InputOutputType, outputRef.Value.Value, actionForm.Format, outputSchemaName, dirName, TokenIndex: -1)); errorReporter.RegisterTypedReferenceFromThing(outputRef.TokenIndex, InputOutputType, outputRef.Value.Value); } else if (tdAction.Output?.Value != null && tdAction.Output.Value.Type?.Value.Value != TDValues.TypeNull) { string outputSchemaName = schemaNamer.GetActionOutSchema(tdAction.Output.Value, actionName); ObjectSpec outputObjectSpec = ObjectSpec.CreateFromDataSchema(errorReporter, schemaNamer, tdAction.Output, actionForm.Format, outputSchemaName, tdAction.Output.Value.Description?.Value.Value ?? $"Output arguments for action '{actionName}'"); - schemaSpecs[outputSchemaName] = outputObjectSpec; + if (!schemaSpecs.TryGetValue(outputSchemaName, out List? outputSpecs)) + { + outputSpecs = new List(); + schemaSpecs[outputSchemaName] = outputSpecs; + } + outputSpecs.Add(outputObjectSpec); responseFields = outputObjectSpec.Fields.ToDictionary(f => f.Key, f => f.Value with { Require = false }); } @@ -93,7 +113,12 @@ private static void ProcessAction( actionForm.Format, respSchemaName, TokenIndex: -1); - schemaSpecs[respSchemaName] = propReadRespObjectSpec; + if (!schemaSpecs.TryGetValue(respSchemaName, out List? respSpecs)) + { + respSpecs = new List(); + schemaSpecs[respSchemaName] = respSpecs; + } + respSpecs.Add(propReadRespObjectSpec); SchemaGenerationSupport.AddSchemaReference(actionForm.ErrorRespName!, actionForm.ErrorRespFormat, referencedSchemas); } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EventSchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EventSchemaGenerator.cs index f1c752656e..3ff9621a84 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EventSchemaGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/EventSchemaGenerator.cs @@ -8,7 +8,7 @@ internal static class EventSchemaGenerator { - internal static void GenerateEventSchemas(ErrorReporter errorReporter, TDThing tdThing, string dirName, SchemaNamer schemaNamer, string projectName, Dictionary schemaSpecs, Dictionary> referencedSchemas) + internal static void GenerateEventSchemas(ErrorReporter errorReporter, TDThing tdThing, string dirName, SchemaNamer schemaNamer, string projectName, Dictionary> schemaSpecs, Dictionary> referencedSchemas) { FormInfo? subAllEventsForm = FormInfo.CreateFromForm(errorReporter, tdThing.Forms?.Elements?.FirstOrDefault(f => f.Value.Op?.Elements?.Any(e => e.Value.Value == TDValues.OpSubAllEvents) ?? false)?.Value, tdThing.SchemaDefinitions?.Entries); @@ -46,7 +46,7 @@ private static void ProcessEvent( string projectName, string dirName, Dictionary>? schemaDefinitions, - Dictionary schemaSpecs, + Dictionary> schemaSpecs, Dictionary valueFields) { FormInfo? subEventForm = FormInfo.CreateFromForm(errorReporter, tdEvent.Forms?.Elements?.FirstOrDefault(f => f.Value.Op?.Elements?.Any(e => e.Value.Value == TDValues.OpSubEvent) ?? false)?.Value, schemaDefinitions); @@ -70,7 +70,12 @@ private static void ProcessEvent( subEventForm.Format, eventSchemaName, TokenIndex: -1); - schemaSpecs[eventSchemaName] = eventObjectSpec; + if (!schemaSpecs.TryGetValue(eventSchemaName, out List? eventSpecs)) + { + eventSpecs = new List(); + schemaSpecs[eventSchemaName] = eventSpecs; + } + eventSpecs.Add(eventObjectSpec); } } @@ -78,18 +83,23 @@ private static void GenerateCollectiveEventObject( SchemaNamer schemaNamer, FormInfo? topLevelEventsForm, Dictionary valueFields, - Dictionary schemaSpecs) + Dictionary> schemaSpecs) { if (topLevelEventsForm?.TopicPattern != null) { if (valueFields.Any()) { - schemaSpecs[schemaNamer.AggregateEventSchema] = new ObjectSpec( + if (!schemaSpecs.TryGetValue(schemaNamer.AggregateEventSchema, out List? aggEventSpecs)) + { + aggEventSpecs = new List(); + schemaSpecs[schemaNamer.AggregateEventSchema] = aggEventSpecs; + } + aggEventSpecs.Add(new ObjectSpec( $"Data values of Events.", valueFields, topLevelEventsForm.Format, schemaNamer.AggregateEventSchema, - TokenIndex: -1); + TokenIndex: -1)); } } } diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/PropertySchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/PropertySchemaGenerator.cs index 7fe9131a06..6c0f573f36 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/PropertySchemaGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/PropertySchemaGenerator.cs @@ -8,7 +8,7 @@ internal static class PropertySchemaGenerator { - internal static void GeneratePropertySchemas(ErrorReporter errorReporter, TDThing tdThing, string dirName, SchemaNamer schemaNamer, string projectName, Dictionary schemaSpecs, Dictionary> referencedSchemas) + internal static void GeneratePropertySchemas(ErrorReporter errorReporter, TDThing tdThing, string dirName, SchemaNamer schemaNamer, string projectName, Dictionary> schemaSpecs, Dictionary> referencedSchemas) { FormInfo? readAllPropsForm = FormInfo.CreateFromForm(errorReporter, tdThing.Forms?.Elements?.FirstOrDefault(f => f.Value.Op?.Elements?.Any(e => e.Value.Value == TDValues.OpReadAllProps) ?? false)?.Value, tdThing.SchemaDefinitions?.Entries); FormInfo? writeMultPropsForm = FormInfo.CreateFromForm(errorReporter, tdThing.Forms?.Elements?.FirstOrDefault(f => f.Value.Op?.Elements?.Any(e => e.Value.Value == TDValues.OpWriteMultProps) ?? false)?.Value, tdThing.SchemaDefinitions?.Entries); @@ -22,7 +22,7 @@ internal static void GeneratePropertySchemas(ErrorReporter errorReporter, TDThin foreach (KeyValuePair> propKvp in tdThing.Properties?.Entries ?? new()) { - TDProperty? property = propKvp.Value.Value; + ValueTracker property = propKvp.Value; if (property != null) { ProcessProperty( @@ -93,51 +93,57 @@ private static void ProcessProperty( ErrorReporter errorReporter, SchemaNamer schemaNamer, string propName, - TDProperty tdProperty, + ValueTracker tdProperty, string projectName, string dirName, Dictionary>? schemaDefinitions, - Dictionary schemaSpecs, + Dictionary> schemaSpecs, Dictionary valueFields, Dictionary errorFields, Dictionary> referencedSchemas, HashSet errorSchemaNames, bool isRead) { - if ((tdProperty.ReadOnly?.Value.Value ?? false) && !isRead) + if ((tdProperty.Value.ReadOnly?.Value.Value ?? false) && !isRead) { return; } string operation = isRead ? TDValues.OpReadProp : TDValues.OpWriteProp; - FormInfo? propForm = FormInfo.CreateFromForm(errorReporter, tdProperty.Forms?.Elements?.FirstOrDefault(f => f.Value.Op?.Elements?.Any(e => e.Value.Value == operation) ?? false)?.Value, schemaDefinitions); - propForm ??= FormInfo.CreateFromForm(errorReporter, tdProperty.Forms?.Elements?.FirstOrDefault(f => f.Value.Op == null)?.Value, schemaDefinitions); + FormInfo? propForm = FormInfo.CreateFromForm(errorReporter, tdProperty.Value.Forms?.Elements?.FirstOrDefault(f => f.Value.Op?.Elements?.Any(e => e.Value.Value == operation) ?? false)?.Value, schemaDefinitions); + propForm ??= FormInfo.CreateFromForm(errorReporter, tdProperty.Value.Forms?.Elements?.FirstOrDefault(f => f.Value.Op == null)?.Value, schemaDefinitions); FieldSpec propFieldSpec = new( - tdProperty.Description?.Value.Value ?? (isRead ? $"The '{propName}' Property value." : $"Value for the '{propName}' Property."), - new ValueTracker { PropertyName = string.Empty, Value = tdProperty as TDDataSchema }, + tdProperty.Value.Description?.Value.Value ?? (isRead ? $"The '{propName}' Property value." : $"Value for the '{propName}' Property."), + new ValueTracker { PropertyName = string.Empty, Value = tdProperty.Value as TDDataSchema, TokenIndex = tdProperty.TokenIndex }, BackupSchemaName: schemaNamer.GetPropValueSchema(propName), Require: isRead, Base: dirName, - Fragment: tdProperty.Placeholder?.Value.Value ?? false); + Fragment: tdProperty.Value.Placeholder?.Value.Value ?? false); valueFields[propName] = propFieldSpec; - if (propForm?.TopicPattern != null && (isRead || (tdProperty.Placeholder?.Value.Value ?? false))) + if (propForm?.TopicPattern != null && (isRead || (tdProperty.Value.Placeholder?.Value.Value ?? false))) { string propSchemaName = isRead ? schemaNamer.GetPropSchema(propName) : schemaNamer.GetWritablePropSchema(propName); ObjectSpec propObjectSpec = new( - tdProperty.Description?.Value.Value ?? $"Container for{(isRead ? "" : " writing to")} the '{propName}' Property.", + tdProperty.Value.Description?.Value.Value ?? $"Container for{(isRead ? "" : " writing to")} the '{propName}' Property.", new Dictionary { { propName, propFieldSpec } }, propForm.Format, propSchemaName, TokenIndex: -1); - schemaSpecs[propSchemaName] = propObjectSpec; + + if (!schemaSpecs.TryGetValue(propSchemaName, out List? propSpecs)) + { + propSpecs = new List(); + schemaSpecs[propSchemaName] = propSpecs; + } + propSpecs.Add(propObjectSpec); } if (propForm?.ErrorRespSchema != null) { FieldSpec respFieldSpec = new( - tdProperty.Description?.Value.Value ?? $"{(isRead ? "Read" : "Write")} error for the '{propName}' Property.", + tdProperty.Value.Description?.Value.Value ?? $"{(isRead ? "Read" : "Write")} error for the '{propName}' Property.", propForm.ErrorRespSchema, BackupSchemaName: propForm.ErrorRespName!, Require: false, @@ -161,12 +167,18 @@ private static void ProcessProperty( string respSchemaName = isRead ? schemaNamer.GetPropReadRespSchema(propName) : schemaNamer.GetPropWriteRespSchema(propName); ObjectSpec respObjectSpec = new( - tdProperty.Description?.Value.Value ?? $"Response to a '{propName}' Property {(isRead ? "read" : "write")}.", + tdProperty.Value.Description?.Value.Value ?? $"Response to a '{propName}' Property {(isRead ? "read" : "write")}.", responseFields, propForm.Format, respSchemaName, TokenIndex: -1); - schemaSpecs[respSchemaName] = respObjectSpec; + + if (!schemaSpecs.TryGetValue(respSchemaName, out List? respSpecs)) + { + respSpecs = new List(); + schemaSpecs[respSchemaName] = respSpecs; + } + respSpecs.Add(respObjectSpec); SchemaGenerationSupport.AddSchemaReference(propForm.ErrorRespName!, propForm.ErrorRespFormat, referencedSchemas); } @@ -185,7 +197,7 @@ private static void GenerateCollectiveResponseObject( string preposition, string quantifier, HashSet errorSchemaNames, - Dictionary schemaSpecs, + Dictionary> schemaSpecs, Dictionary> referencedSchemas, bool responseIncludesProps) { @@ -193,22 +205,32 @@ private static void GenerateCollectiveResponseObject( { if (valueFields.Any()) { - schemaSpecs[propsSchema] = new ObjectSpec( + if (!schemaSpecs.TryGetValue(propsSchema, out List? propSpecs)) + { + propSpecs = new List(); + schemaSpecs[propsSchema] = propSpecs; + } + propSpecs.Add(new ObjectSpec( $"Values {preposition} {quantifier} Properties.", valueFields, topLevelPropsForm.Format, propsSchema, - TokenIndex: -1); + TokenIndex: -1)); } if (topLevelPropsForm.HasErrorResponse) { - schemaSpecs[errorSchema] = new ObjectSpec( + if (!schemaSpecs.TryGetValue(errorSchema, out List? errorSpecs)) + { + errorSpecs = new List(); + schemaSpecs[errorSchema] = errorSpecs; + } + errorSpecs.Add(new ObjectSpec( $"Errors from any Property {operation}.", errorFields, topLevelPropsForm.Format, errorSchema, - TokenIndex: -1); + TokenIndex: -1)); Dictionary fieldSketches = new(); fieldSketches[schemaNamer.AggregateRespErrorField] = (errorSchema, "Errors when operation fails."); @@ -217,12 +239,17 @@ private static void GenerateCollectiveResponseObject( fieldSketches[schemaNamer.AggregateReadRespValueField] = (propsSchema, "Properties when operation succeeds."); } - schemaSpecs[responseSchema] = ObjectSpec.CreateFixed( + if (!schemaSpecs.TryGetValue(responseSchema, out List? responseSpecs)) + { + responseSpecs = new List(); + schemaSpecs[propsSchema] = responseSpecs; + } + responseSpecs.Add(ObjectSpec.CreateFixed( schemaNamer, $"Response to {operation} of {quantifier} Properties", fieldSketches, topLevelPropsForm.Format, - responseSchema); + responseSchema)); foreach (string errSchemaName in errorSchemaNames) { diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs index 237c178239..0ba789fd45 100644 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/SchemaGenerator.cs @@ -14,7 +14,7 @@ public static Dictionary> GenerateSchem foreach (ParsedThing parsedThing in parsedThings) { - Dictionary schemaSpecs = new(); + Dictionary> schemaSpecs = new(); Dictionary> referencedSchemas = new(); PropertySchemaGenerator.GeneratePropertySchemas(parsedThing.ErrorReporter, parsedThing.Thing, parsedThing.DirectoryName, parsedThing.SchemaNamer, projectName, schemaSpecs, referencedSchemas); @@ -50,7 +50,7 @@ public static Dictionary> GenerateSchem return generatedSchemas; } - private static Dictionary ComputeClosedSchemaSpecs(ErrorReporter errorReporter, TDThing thing, SchemaNamer schemaNamer, Dictionary schemaSpecs, Dictionary> referencedSchemas) + private static Dictionary ComputeClosedSchemaSpecs(ErrorReporter errorReporter, TDThing thing, SchemaNamer schemaNamer, Dictionary> schemaSpecs, Dictionary> referencedSchemas) { Dictionary closedSchemaSpecs = new(); @@ -60,20 +60,23 @@ private static Dictionary ComputeClosedSchemaSpecs(ErrorRepo { if (thing.SchemaDefinitions?.Entries?.TryGetValue(referencedSchema.Key, out ValueTracker? dataSchema) ?? false) { - ComputeClosureOfDataSchema(errorReporter, schemaNamer, referencedSchema.Key, dataSchema, format, closedSchemaSpecs); + ComputeClosureOfDataSchema(errorReporter, schemaNamer, thing.Title!.Value.Value, referencedSchema.Key, dataSchema, format, closedSchemaSpecs); } } } - foreach (KeyValuePair schemaSpec in schemaSpecs) + foreach (KeyValuePair> schemaSpec in schemaSpecs) { - ComputeClosureOfSchemaSpec(errorReporter, schemaNamer, schemaSpec.Key, schemaSpec.Value, closedSchemaSpecs); + foreach (SchemaSpec spec in schemaSpec.Value) + { + ComputeClosureOfSchemaSpec(errorReporter, schemaNamer, thing.Title!.Value.Value, schemaSpec.Key, spec, closedSchemaSpecs); + } } return closedSchemaSpecs; } - private static void ComputeClosureOfSchemaSpec(ErrorReporter errorReporter, SchemaNamer schemaNamer, string schemaName, SchemaSpec schemaSpec, Dictionary closedSchemaSpecs) + private static void ComputeClosureOfSchemaSpec(ErrorReporter errorReporter, SchemaNamer schemaNamer, string thingName, string schemaName, SchemaSpec schemaSpec, Dictionary closedSchemaSpecs) { if (IsLocalDuplicate(errorReporter, schemaName, schemaSpec, closedSchemaSpecs)) { @@ -81,18 +84,18 @@ private static void ComputeClosureOfSchemaSpec(ErrorReporter errorReporter, Sche } closedSchemaSpecs[schemaName] = schemaSpec; - errorReporter.RegisterNameInThing(schemaName, schemaSpec.TokenIndex); + errorReporter.RegisterNameInThing(schemaName, thingName, schemaSpec.TokenIndex); if (schemaSpec is ObjectSpec objectSpec) { foreach (KeyValuePair field in objectSpec.Fields) { - ComputeClosureOfDataSchema(errorReporter, schemaNamer, field.Value.BackupSchemaName, field.Value.Schema, schemaSpec.Format, closedSchemaSpecs); + ComputeClosureOfDataSchema(errorReporter, schemaNamer, thingName, field.Value.BackupSchemaName, field.Value.Schema, schemaSpec.Format, closedSchemaSpecs); } } } - private static void ComputeClosureOfDataSchema(ErrorReporter errorReporter, SchemaNamer schemaNamer, string backupName, ValueTracker dataSchema, SerializationFormat format, Dictionary closedSchemaSpecs) + private static void ComputeClosureOfDataSchema(ErrorReporter errorReporter, SchemaNamer schemaNamer, string thingName, string backupName, ValueTracker dataSchema, SerializationFormat format, Dictionary closedSchemaSpecs) { if (IsProxy(dataSchema.Value)) { @@ -109,23 +112,23 @@ private static void ComputeClosureOfDataSchema(ErrorReporter errorReporter, Sche } closedSchemaSpecs[schemaName] = schemaSpec; - errorReporter.RegisterNameInThing(schemaName, schemaSpec.TokenIndex); + errorReporter.RegisterNameInThing(schemaName, thingName, schemaSpec.TokenIndex); } if (dataSchema.Value.Properties?.Entries != null) { foreach (KeyValuePair> property in dataSchema.Value.Properties.Entries) { - ComputeClosureOfDataSchema(errorReporter, schemaNamer, schemaNamer.GetBackupSchemaName(schemaName, property.Key), property.Value, format, closedSchemaSpecs); + ComputeClosureOfDataSchema(errorReporter, schemaNamer, thingName, schemaNamer.GetBackupSchemaName(schemaName, property.Key), property.Value, format, closedSchemaSpecs); } } else if (dataSchema.Value.Items?.Value != null) { - ComputeClosureOfDataSchema(errorReporter, schemaNamer, backupName, dataSchema.Value.Items, format, closedSchemaSpecs); + ComputeClosureOfDataSchema(errorReporter, schemaNamer, thingName, backupName, dataSchema.Value.Items, format, closedSchemaSpecs); } else if (dataSchema.Value.AdditionalProperties?.Value != null) { - ComputeClosureOfDataSchema(errorReporter, schemaNamer, backupName, dataSchema.Value.AdditionalProperties, format, closedSchemaSpecs); + ComputeClosureOfDataSchema(errorReporter, schemaNamer, thingName, backupName, dataSchema.Value.AdditionalProperties, format, closedSchemaSpecs); } } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/ProtocolCompilerTester.cs b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/ProtocolCompilerTester.cs index 3c821c11c7..962c0994d2 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/ProtocolCompilerTester.cs +++ b/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/ProtocolCompilerTester.cs @@ -9,13 +9,13 @@ public class ProtocolCompilerTester { - private const string basePath = "../../.."; + private const string basePath = "../../../.."; private const string testCasesPath = $"{basePath}/test-cases"; private const string successCasesPath = $"{testCasesPath}/success"; private const string failureCasesPath = $"{testCasesPath}/failure"; private const string tmPath = $"{basePath}/thing-models"; private const string schemasPath = $"{basePath}/schemas"; - private const string namerPath = $"{basePath}/name-config"; + private const string namerPath = $"{basePath}/name-rules"; private const string sandboxPath = $"{basePath}/sandbox"; static ProtocolCompilerTester() diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/name-rules/DefaultSchemaNames.json b/codegen2/test/name-rules/DefaultSchemaNames.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/name-rules/DefaultSchemaNames.json rename to codegen2/test/name-rules/DefaultSchemaNames.json diff --git a/codegen2/test/sandbox/ActionInputRefNotFound/schemas/PokeInputArguments.schema.json b/codegen2/test/sandbox/ActionInputRefNotFound/schemas/PokeInputArguments.schema.json new file mode 100644 index 0000000000..d337104721 --- /dev/null +++ b/codegen2/test/sandbox/ActionInputRefNotFound/schemas/PokeInputArguments.schema.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "PokeInputArguments", + "type": "object", + "$ref": "../../../schemas/json-schemas/Nonexistent.json" +} diff --git a/codegen2/test/sandbox/ActionInputRefString/schemas/PokeInputArguments.schema.json b/codegen2/test/sandbox/ActionInputRefString/schemas/PokeInputArguments.schema.json new file mode 100644 index 0000000000..0941a3f88e --- /dev/null +++ b/codegen2/test/sandbox/ActionInputRefString/schemas/PokeInputArguments.schema.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "PokeInputArguments", + "type": "object", + "$ref": "../../../schemas/json-schemas/AStringSchema.json" +} diff --git a/codegen2/test/sandbox/ActionOutputRefNotFound/schemas/PeekOutputArguments.schema.json b/codegen2/test/sandbox/ActionOutputRefNotFound/schemas/PeekOutputArguments.schema.json new file mode 100644 index 0000000000..3c798b3cdf --- /dev/null +++ b/codegen2/test/sandbox/ActionOutputRefNotFound/schemas/PeekOutputArguments.schema.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "PeekOutputArguments", + "type": "object", + "$ref": "../../../schemas/json-schemas/Nonexistent.json" +} diff --git a/codegen2/test/sandbox/ActionOutputRefString/schemas/PeekOutputArguments.schema.json b/codegen2/test/sandbox/ActionOutputRefString/schemas/PeekOutputArguments.schema.json new file mode 100644 index 0000000000..871206c7b8 --- /dev/null +++ b/codegen2/test/sandbox/ActionOutputRefString/schemas/PeekOutputArguments.schema.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "PeekOutputArguments", + "type": "object", + "$ref": "../../../schemas/json-schemas/AStringSchema.json" +} diff --git a/codegen2/test/sandbox/DuplicatedGeneratedNameBetweenThingAndJsonSchema/schemas/AnObjectSchema.schema.json b/codegen2/test/sandbox/DuplicatedGeneratedNameBetweenThingAndJsonSchema/schemas/AnObjectSchema.schema.json new file mode 100644 index 0000000000..0163fc7160 --- /dev/null +++ b/codegen2/test/sandbox/DuplicatedGeneratedNameBetweenThingAndJsonSchema/schemas/AnObjectSchema.schema.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "AnObjectSchema", + "description": "Output arguments for action 'doit'", + "type": "object", + "additionalProperties": false, + "properties": { + "outVal": { + "description": "The 'outVal' Field.", + "type": "string" + } + } +} diff --git a/codegen2/test/sandbox/DuplicatedGeneratedNameBetweenThingAndJsonSchema/schemas/DoitInputArguments.schema.json b/codegen2/test/sandbox/DuplicatedGeneratedNameBetweenThingAndJsonSchema/schemas/DoitInputArguments.schema.json new file mode 100644 index 0000000000..48eeaa82f5 --- /dev/null +++ b/codegen2/test/sandbox/DuplicatedGeneratedNameBetweenThingAndJsonSchema/schemas/DoitInputArguments.schema.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "DoitInputArguments", + "type": "object", + "$ref": "../../../schemas/json-schemas/AnObjectSchema.json" +} diff --git a/codegen2/test/sandbox/EventRefNotFound/schemas/AlertEvent.schema.json b/codegen2/test/sandbox/EventRefNotFound/schemas/AlertEvent.schema.json new file mode 100644 index 0000000000..60811f462c --- /dev/null +++ b/codegen2/test/sandbox/EventRefNotFound/schemas/AlertEvent.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "AlertEvent", + "description": "Container for the 'alert' Event data.", + "type": "object", + "additionalProperties": false, + "required": [ "alert" ], + "properties": { + "alert": { + "description": "The 'alert' Event data value.", + "$ref": "../../../schemas/json-schemas/Nonexistent.json" + } + } +} diff --git a/codegen2/test/sandbox/PropertyRefNotFound/schemas/AlphaProperty.schema.json b/codegen2/test/sandbox/PropertyRefNotFound/schemas/AlphaProperty.schema.json new file mode 100644 index 0000000000..281fa8cc77 --- /dev/null +++ b/codegen2/test/sandbox/PropertyRefNotFound/schemas/AlphaProperty.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "AlphaProperty", + "description": "Container for the 'alpha' Property.", + "type": "object", + "additionalProperties": false, + "required": [ "alpha" ], + "properties": { + "alpha": { + "description": "The 'alpha' Property value.", + "$ref": "../../../schemas/json-schemas/Nonexistent.json" + } + } +} diff --git a/codegen2/test/sandbox/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses/schemas/AlphaProperty.schema.json b/codegen2/test/sandbox/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses/schemas/AlphaProperty.schema.json new file mode 100644 index 0000000000..43c4fe77ce --- /dev/null +++ b/codegen2/test/sandbox/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses/schemas/AlphaProperty.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "AlphaProperty", + "description": "Container for the 'alpha' Property.", + "type": "object", + "additionalProperties": false, + "required": [ "alpha" ], + "properties": { + "alpha": { + "description": "The 'alpha' Property value.", + "type": "string" + } + } +} diff --git a/codegen2/test/sandbox/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses/schemas/AlphaWriteResponseSchema.schema.json b/codegen2/test/sandbox/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses/schemas/AlphaWriteResponseSchema.schema.json new file mode 100644 index 0000000000..634811bde2 --- /dev/null +++ b/codegen2/test/sandbox/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses/schemas/AlphaWriteResponseSchema.schema.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "AlphaWriteResponseSchema", + "description": "Response to a 'alpha' Property write.", + "type": "object", + "additionalProperties": false, + "properties": { + "_error": { + "description": "Write error for the 'alpha' Property.", + "$ref": "Error.schema.json" + } + } +} diff --git a/codegen2/test/sandbox/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses/schemas/Error.schema.json b/codegen2/test/sandbox/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses/schemas/Error.schema.json new file mode 100644 index 0000000000..58bb4b011c --- /dev/null +++ b/codegen2/test/sandbox/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses/schemas/Error.schema.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Error", + "type": "object", + "additionalProperties": false, + "properties": { + "error": { + "description": "The 'error' Field.", + "type": "string" + } + } +} diff --git a/codegen2/test/sandbox/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses/schemas/PropertyCollection.schema.json b/codegen2/test/sandbox/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses/schemas/PropertyCollection.schema.json new file mode 100644 index 0000000000..45836c6c80 --- /dev/null +++ b/codegen2/test/sandbox/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses/schemas/PropertyCollection.schema.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "PropertyCollection", + "description": "Response to read of all Properties", + "type": "object", + "additionalProperties": false, + "properties": { + "_errors": { + "description": "Errors when operation fails.", + "$ref": "PropertyCollectionReadError.schema.json" + }, + "_properties": { + "description": "Properties when operation succeeds.", + "$ref": "PropertyCollection.schema.json" + } + } +} diff --git a/codegen2/test/sandbox/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses/schemas/PropertyCollectionReadError.schema.json b/codegen2/test/sandbox/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses/schemas/PropertyCollectionReadError.schema.json new file mode 100644 index 0000000000..34bd8e88d7 --- /dev/null +++ b/codegen2/test/sandbox/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses/schemas/PropertyCollectionReadError.schema.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "PropertyCollectionReadError", + "description": "Errors from any Property read.", + "type": "object", + "additionalProperties": false, + "properties": { + } +} diff --git a/codegen2/test/sandbox/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses/schemas/AlphaProperty.schema.json b/codegen2/test/sandbox/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses/schemas/AlphaProperty.schema.json new file mode 100644 index 0000000000..43c4fe77ce --- /dev/null +++ b/codegen2/test/sandbox/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses/schemas/AlphaProperty.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "AlphaProperty", + "description": "Container for the 'alpha' Property.", + "type": "object", + "additionalProperties": false, + "required": [ "alpha" ], + "properties": { + "alpha": { + "description": "The 'alpha' Property value.", + "type": "string" + } + } +} diff --git a/codegen2/test/sandbox/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses/schemas/AlphaReadResponseSchema.schema.json b/codegen2/test/sandbox/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses/schemas/AlphaReadResponseSchema.schema.json new file mode 100644 index 0000000000..59613cbe18 --- /dev/null +++ b/codegen2/test/sandbox/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses/schemas/AlphaReadResponseSchema.schema.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "AlphaReadResponseSchema", + "description": "Response to a 'alpha' Property read.", + "type": "object", + "additionalProperties": false, + "required": [ ], + "properties": { + "_error": { + "description": "Read error for the 'alpha' Property.", + "$ref": "Error.schema.json" + }, + "alpha": { + "description": "The 'alpha' Property value.", + "type": "string" + } + } +} diff --git a/codegen2/test/sandbox/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses/schemas/Error.schema.json b/codegen2/test/sandbox/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses/schemas/Error.schema.json new file mode 100644 index 0000000000..58bb4b011c --- /dev/null +++ b/codegen2/test/sandbox/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses/schemas/Error.schema.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "Error", + "type": "object", + "additionalProperties": false, + "properties": { + "error": { + "description": "The 'error' Field.", + "type": "string" + } + } +} diff --git a/codegen2/test/sandbox/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses/schemas/PropertyCollection.schema.json b/codegen2/test/sandbox/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses/schemas/PropertyCollection.schema.json new file mode 100644 index 0000000000..bba97733d9 --- /dev/null +++ b/codegen2/test/sandbox/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses/schemas/PropertyCollection.schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "PropertyCollection", + "description": "Values of all Properties.", + "type": "object", + "additionalProperties": false, + "required": [ "alpha" ], + "properties": { + "alpha": { + "description": "The 'alpha' Property value.", + "type": "string" + } + } +} diff --git a/codegen2/test/sandbox/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses/schemas/PropertyCollectionWriteError.schema.json b/codegen2/test/sandbox/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses/schemas/PropertyCollectionWriteError.schema.json new file mode 100644 index 0000000000..80c8d3d45c --- /dev/null +++ b/codegen2/test/sandbox/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses/schemas/PropertyCollectionWriteError.schema.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "PropertyCollectionWriteError", + "description": "Errors from any Property write.", + "type": "object", + "additionalProperties": false, + "properties": { + } +} diff --git a/codegen2/test/sandbox/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses/schemas/PropertyUpdate.schema.json b/codegen2/test/sandbox/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses/schemas/PropertyUpdate.schema.json new file mode 100644 index 0000000000..e85c2dffbe --- /dev/null +++ b/codegen2/test/sandbox/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses/schemas/PropertyUpdate.schema.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "PropertyUpdate", + "description": "Response to write of multiple Properties", + "type": "object", + "additionalProperties": false, + "properties": { + "_errors": { + "description": "Errors when operation fails.", + "$ref": "PropertyCollectionWriteError.schema.json" + } + } +} diff --git a/codegen2/test/schemas/json-schemas/AStringSchema.json b/codegen2/test/schemas/json-schemas/AStringSchema.json new file mode 100644 index 0000000000..6336f9817c --- /dev/null +++ b/codegen2/test/schemas/json-schemas/AStringSchema.json @@ -0,0 +1,5 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "AStringSchema", + "type": "string" +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/json-schemas/AnObjectSchema.json b/codegen2/test/schemas/json-schemas/AnObjectSchema.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/json-schemas/AnObjectSchema.json rename to codegen2/test/schemas/json-schemas/AnObjectSchema.json diff --git a/codegen2/test/schemas/json-schemas/AnotherObjectSchema.json b/codegen2/test/schemas/json-schemas/AnotherObjectSchema.json new file mode 100644 index 0000000000..f6b3ef1e00 --- /dev/null +++ b/codegen2/test/schemas/json-schemas/AnotherObjectSchema.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "title": "AnObjectSchema", + "type": "object", + "additionalProperties": false, + "properties": { + "gamma": { + "type": "string" + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/SampleTest.json b/codegen2/test/test-cases/SampleTest.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/SampleTest.json rename to codegen2/test/test-cases/SampleTest.json diff --git a/codegen2/test/test-cases/failure/ActionDuplicateSchemaNamesObjectsDifferentFieldValues.json b/codegen2/test/test-cases/failure/ActionDuplicateSchemaNamesObjectsDifferentFieldValues.json new file mode 100644 index 0000000000..af2841d158 --- /dev/null +++ b/codegen2/test/test-cases/failure/ActionDuplicateSchemaNamesObjectsDifferentFieldValues.json @@ -0,0 +1,23 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionDuplicateSchemaNamesObjectsDifferentFieldValues.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "ActionDuplicateSchemaNamesObjectsDifferentFieldValues.TM.json", + "line": 14, + "cfLine": 23, + "crossRef": "" + }, + { + "condition": "Duplication", + "filename": "ActionDuplicateSchemaNamesObjectsDifferentFieldValues.TM.json", + "line": 23, + "cfLine": 14, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/ActionDuplicateSchemaNamesObjectsDifferentFields.json b/codegen2/test/test-cases/failure/ActionDuplicateSchemaNamesObjectsDifferentFields.json new file mode 100644 index 0000000000..cd463815ad --- /dev/null +++ b/codegen2/test/test-cases/failure/ActionDuplicateSchemaNamesObjectsDifferentFields.json @@ -0,0 +1,23 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionDuplicateSchemaNamesObjectsDifferentFields.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "ActionDuplicateSchemaNamesObjectsDifferentFields.TM.json", + "line": 14, + "cfLine": 19, + "crossRef": "" + }, + { + "condition": "Duplication", + "filename": "ActionDuplicateSchemaNamesObjectsDifferentFields.TM.json", + "line": 23, + "cfLine": 10, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeEmpty.json b/codegen2/test/test-cases/failure/ActionFormAdditionalResponseContentTypeEmpty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeEmpty.json rename to codegen2/test/test-cases/failure/ActionFormAdditionalResponseContentTypeEmpty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeText.json b/codegen2/test/test-cases/failure/ActionFormAdditionalResponseContentTypeText.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseContentTypeText.json rename to codegen2/test/test-cases/failure/ActionFormAdditionalResponseContentTypeText.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoMatchingSchemaDefinition.json b/codegen2/test/test-cases/failure/ActionFormAdditionalResponseNoMatchingSchemaDefinition.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoMatchingSchemaDefinition.json rename to codegen2/test/test-cases/failure/ActionFormAdditionalResponseNoMatchingSchemaDefinition.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchema.json b/codegen2/test/test-cases/failure/ActionFormAdditionalResponseNoSchema.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchema.json rename to codegen2/test/test-cases/failure/ActionFormAdditionalResponseNoSchema.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchemaDefinitions.json b/codegen2/test/test-cases/failure/ActionFormAdditionalResponseNoSchemaDefinitions.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSchemaDefinitions.json rename to codegen2/test/test-cases/failure/ActionFormAdditionalResponseNoSchemaDefinitions.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSuccess.json b/codegen2/test/test-cases/failure/ActionFormAdditionalResponseNoSuccess.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseNoSuccess.json rename to codegen2/test/test-cases/failure/ActionFormAdditionalResponseNoSuccess.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionMap.json b/codegen2/test/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionMap.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionMap.json rename to codegen2/test/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionMap.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionNotObject.json b/codegen2/test/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionNotObject.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionNotObject.json rename to codegen2/test/test-cases/failure/ActionFormAdditionalResponseSchemaDefinitionNotObject.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaEmpty.json b/codegen2/test/test-cases/failure/ActionFormAdditionalResponseSchemaEmpty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSchemaEmpty.json rename to codegen2/test/test-cases/failure/ActionFormAdditionalResponseSchemaEmpty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSuccessTrue.json b/codegen2/test/test-cases/failure/ActionFormAdditionalResponseSuccessTrue.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseSuccessTrue.json rename to codegen2/test/test-cases/failure/ActionFormAdditionalResponseSuccessTrue.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseUnsupportedProperty.json b/codegen2/test/test-cases/failure/ActionFormAdditionalResponseUnsupportedProperty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponseUnsupportedProperty.json rename to codegen2/test/test-cases/failure/ActionFormAdditionalResponseUnsupportedProperty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponsesMultiple.json b/codegen2/test/test-cases/failure/ActionFormAdditionalResponsesMultiple.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormAdditionalResponsesMultiple.json rename to codegen2/test/test-cases/failure/ActionFormAdditionalResponsesMultiple.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormContentTypeText.json b/codegen2/test/test-cases/failure/ActionFormContentTypeText.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormContentTypeText.json rename to codegen2/test/test-cases/failure/ActionFormContentTypeText.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeEmpty.json b/codegen2/test/test-cases/failure/ActionFormHeaderCodeEmpty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeEmpty.json rename to codegen2/test/test-cases/failure/ActionFormHeaderCodeEmpty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoMatchingSchemaDefinition.json b/codegen2/test/test-cases/failure/ActionFormHeaderCodeNoMatchingSchemaDefinition.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoMatchingSchemaDefinition.json rename to codegen2/test/test-cases/failure/ActionFormHeaderCodeNoMatchingSchemaDefinition.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoSchemaDefinitions.json b/codegen2/test/test-cases/failure/ActionFormHeaderCodeNoSchemaDefinitions.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeNoSchemaDefinitions.json rename to codegen2/test/test-cases/failure/ActionFormHeaderCodeNoSchemaDefinitions.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeSchemaDefinitionNotEnum.json b/codegen2/test/test-cases/failure/ActionFormHeaderCodeSchemaDefinitionNotEnum.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderCodeSchemaDefinitionNotEnum.json rename to codegen2/test/test-cases/failure/ActionFormHeaderCodeSchemaDefinitionNotEnum.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeEmpty.json b/codegen2/test/test-cases/failure/ActionFormHeaderInfoContentTypeEmpty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeEmpty.json rename to codegen2/test/test-cases/failure/ActionFormHeaderInfoContentTypeEmpty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeNotJson.json b/codegen2/test/test-cases/failure/ActionFormHeaderInfoContentTypeNotJson.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoContentTypeNotJson.json rename to codegen2/test/test-cases/failure/ActionFormHeaderInfoContentTypeNotJson.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoContentType.json b/codegen2/test/test-cases/failure/ActionFormHeaderInfoNoContentType.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoContentType.json rename to codegen2/test/test-cases/failure/ActionFormHeaderInfoNoContentType.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoMatchingSchemaDefinition.json b/codegen2/test/test-cases/failure/ActionFormHeaderInfoNoMatchingSchemaDefinition.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoMatchingSchemaDefinition.json rename to codegen2/test/test-cases/failure/ActionFormHeaderInfoNoMatchingSchemaDefinition.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchema.json b/codegen2/test/test-cases/failure/ActionFormHeaderInfoNoSchema.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchema.json rename to codegen2/test/test-cases/failure/ActionFormHeaderInfoNoSchema.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchemaDefinitions.json b/codegen2/test/test-cases/failure/ActionFormHeaderInfoNoSchemaDefinitions.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoNoSchemaDefinitions.json rename to codegen2/test/test-cases/failure/ActionFormHeaderInfoNoSchemaDefinitions.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionMap.json b/codegen2/test/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionMap.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionMap.json rename to codegen2/test/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionMap.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionNotObject.json b/codegen2/test/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionNotObject.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionNotObject.json rename to codegen2/test/test-cases/failure/ActionFormHeaderInfoSchemaDefinitionNotObject.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaEmpty.json b/codegen2/test/test-cases/failure/ActionFormHeaderInfoSchemaEmpty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSchemaEmpty.json rename to codegen2/test/test-cases/failure/ActionFormHeaderInfoSchemaEmpty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSuccessTrue.json b/codegen2/test/test-cases/failure/ActionFormHeaderInfoSuccessTrue.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoSuccessTrue.json rename to codegen2/test/test-cases/failure/ActionFormHeaderInfoSuccessTrue.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoUnsupportedProperty.json b/codegen2/test/test-cases/failure/ActionFormHeaderInfoUnsupportedProperty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfoUnsupportedProperty.json rename to codegen2/test/test-cases/failure/ActionFormHeaderInfoUnsupportedProperty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfosMultiple.json b/codegen2/test/test-cases/failure/ActionFormHeaderInfosMultiple.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormHeaderInfosMultiple.json rename to codegen2/test/test-cases/failure/ActionFormHeaderInfosMultiple.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpInvokeDuplicate.json b/codegen2/test/test-cases/failure/ActionFormOpInvokeDuplicate.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpInvokeDuplicate.json rename to codegen2/test/test-cases/failure/ActionFormOpInvokeDuplicate.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpRead.json b/codegen2/test/test-cases/failure/ActionFormOpRead.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpRead.json rename to codegen2/test/test-cases/failure/ActionFormOpRead.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpSub.json b/codegen2/test/test-cases/failure/ActionFormOpSub.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpSub.json rename to codegen2/test/test-cases/failure/ActionFormOpSub.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpWrite.json b/codegen2/test/test-cases/failure/ActionFormOpWrite.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormOpWrite.json rename to codegen2/test/test-cases/failure/ActionFormOpWrite.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormServiceGroupEmpty.json b/codegen2/test/test-cases/failure/ActionFormServiceGroupEmpty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormServiceGroupEmpty.json rename to codegen2/test/test-cases/failure/ActionFormServiceGroupEmpty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicNoContentType.json b/codegen2/test/test-cases/failure/ActionFormTopicNoContentType.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicNoContentType.json rename to codegen2/test/test-cases/failure/ActionFormTopicNoContentType.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenAction.json b/codegen2/test/test-cases/failure/ActionFormTopicTokenAction.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenAction.json rename to codegen2/test/test-cases/failure/ActionFormTopicTokenAction.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenConsumerId.json b/codegen2/test/test-cases/failure/ActionFormTopicTokenConsumerId.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenConsumerId.json rename to codegen2/test/test-cases/failure/ActionFormTopicTokenConsumerId.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenMaintainerId.json b/codegen2/test/test-cases/failure/ActionFormTopicTokenMaintainerId.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenMaintainerId.json rename to codegen2/test/test-cases/failure/ActionFormTopicTokenMaintainerId.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenSenderId.json b/codegen2/test/test-cases/failure/ActionFormTopicTokenSenderId.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormTopicTokenSenderId.json rename to codegen2/test/test-cases/failure/ActionFormTopicTokenSenderId.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormUnsupportedProperty.json b/codegen2/test/test-cases/failure/ActionFormUnsupportedProperty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormUnsupportedProperty.json rename to codegen2/test/test-cases/failure/ActionFormUnsupportedProperty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsEmpty.json b/codegen2/test/test-cases/failure/ActionFormsEmpty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsEmpty.json rename to codegen2/test/test-cases/failure/ActionFormsEmpty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsMultipleContentTypes.json b/codegen2/test/test-cases/failure/ActionFormsMultipleContentTypes.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsMultipleContentTypes.json rename to codegen2/test/test-cases/failure/ActionFormsMultipleContentTypes.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOpInvokeDuplicate.json b/codegen2/test/test-cases/failure/ActionFormsOpInvokeDuplicate.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOpInvokeDuplicate.json rename to codegen2/test/test-cases/failure/ActionFormsOpInvokeDuplicate.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessAndInvoke.json b/codegen2/test/test-cases/failure/ActionFormsOplessAndInvoke.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessAndInvoke.json rename to codegen2/test/test-cases/failure/ActionFormsOplessAndInvoke.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessDuplicate.json b/codegen2/test/test-cases/failure/ActionFormsOplessDuplicate.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionFormsOplessDuplicate.json rename to codegen2/test/test-cases/failure/ActionFormsOplessDuplicate.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputMap.json b/codegen2/test/test-cases/failure/ActionInputMap.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputMap.json rename to codegen2/test/test-cases/failure/ActionInputMap.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNullAndContentTypeJson.json b/codegen2/test/test-cases/failure/ActionInputNullAndContentTypeJson.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNullAndContentTypeJson.json rename to codegen2/test/test-cases/failure/ActionInputNullAndContentTypeJson.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNumber.json b/codegen2/test/test-cases/failure/ActionInputNumber.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputNumber.json rename to codegen2/test/test-cases/failure/ActionInputNumber.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeCustom.json b/codegen2/test/test-cases/failure/ActionInputObjectAndContentTypeCustom.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeCustom.json rename to codegen2/test/test-cases/failure/ActionInputObjectAndContentTypeCustom.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeRaw.json b/codegen2/test/test-cases/failure/ActionInputObjectAndContentTypeRaw.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectAndContentTypeRaw.json rename to codegen2/test/test-cases/failure/ActionInputObjectAndContentTypeRaw.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectConst.json b/codegen2/test/test-cases/failure/ActionInputObjectConst.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectConst.json rename to codegen2/test/test-cases/failure/ActionInputObjectConst.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectErrorMessage.json b/codegen2/test/test-cases/failure/ActionInputObjectErrorMessage.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputObjectErrorMessage.json rename to codegen2/test/test-cases/failure/ActionInputObjectErrorMessage.json diff --git a/codegen2/test/test-cases/failure/ActionInputRefNotFound.json b/codegen2/test/test-cases/failure/ActionInputRefNotFound.json new file mode 100644 index 0000000000..3b6b7a746b --- /dev/null +++ b/codegen2/test/test-cases/failure/ActionInputRefNotFound.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionInputRefNotFound.TM.json" ], + "lang": "csharp" + }, + "errors": [ + { + "condition": "ItemNotFound", + "filename": "ActionInputRefNotFound.TM.json", + "line": 11, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/ActionInputRefString.json b/codegen2/test/test-cases/failure/ActionInputRefString.json new file mode 100644 index 0000000000..fbaf5f18d9 --- /dev/null +++ b/codegen2/test/test-cases/failure/ActionInputRefString.json @@ -0,0 +1,17 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionInputRefString.TM.json" ], + "schemas": [ "../schemas/json-schemas/AStringSchema.json" ], + "lang": "csharp" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "ActionInputRefString.TM.json", + "line": 11, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputString.json b/codegen2/test/test-cases/failure/ActionInputString.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionInputString.json rename to codegen2/test/test-cases/failure/ActionInputString.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoForms.json b/codegen2/test/test-cases/failure/ActionNoForms.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoForms.json rename to codegen2/test/test-cases/failure/ActionNoForms.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoFormsWithTopic.json b/codegen2/test/test-cases/failure/ActionNoFormsWithTopic.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionNoFormsWithTopic.json rename to codegen2/test/test-cases/failure/ActionNoFormsWithTopic.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputMap.json b/codegen2/test/test-cases/failure/ActionOutputMap.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputMap.json rename to codegen2/test/test-cases/failure/ActionOutputMap.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNullAndContentTypeJson.json b/codegen2/test/test-cases/failure/ActionOutputNullAndContentTypeJson.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNullAndContentTypeJson.json rename to codegen2/test/test-cases/failure/ActionOutputNullAndContentTypeJson.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNumber.json b/codegen2/test/test-cases/failure/ActionOutputNumber.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputNumber.json rename to codegen2/test/test-cases/failure/ActionOutputNumber.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeCustom.json b/codegen2/test/test-cases/failure/ActionOutputObjectAndContentTypeCustom.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeCustom.json rename to codegen2/test/test-cases/failure/ActionOutputObjectAndContentTypeCustom.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeRaw.json b/codegen2/test/test-cases/failure/ActionOutputObjectAndContentTypeRaw.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectAndContentTypeRaw.json rename to codegen2/test/test-cases/failure/ActionOutputObjectAndContentTypeRaw.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectConst.json b/codegen2/test/test-cases/failure/ActionOutputObjectConst.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectConst.json rename to codegen2/test/test-cases/failure/ActionOutputObjectConst.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectErrorMessage.json b/codegen2/test/test-cases/failure/ActionOutputObjectErrorMessage.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputObjectErrorMessage.json rename to codegen2/test/test-cases/failure/ActionOutputObjectErrorMessage.json diff --git a/codegen2/test/test-cases/failure/ActionOutputRefNotFound.json b/codegen2/test/test-cases/failure/ActionOutputRefNotFound.json new file mode 100644 index 0000000000..db711fa790 --- /dev/null +++ b/codegen2/test/test-cases/failure/ActionOutputRefNotFound.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionOutputRefNotFound.TM.json" ], + "lang": "csharp" + }, + "errors": [ + { + "condition": "ItemNotFound", + "filename": "ActionOutputRefNotFound.TM.json", + "line": 11, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/ActionOutputRefString.json b/codegen2/test/test-cases/failure/ActionOutputRefString.json new file mode 100644 index 0000000000..8870926819 --- /dev/null +++ b/codegen2/test/test-cases/failure/ActionOutputRefString.json @@ -0,0 +1,17 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionOutputRefString.TM.json" ], + "schemas": [ "../schemas/json-schemas/AStringSchema.json" ], + "lang": "csharp" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "ActionOutputRefString.TM.json", + "line": 11, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputString.json b/codegen2/test/test-cases/failure/ActionOutputString.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionOutputString.json rename to codegen2/test/test-cases/failure/ActionOutputString.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionUnsupportedProperty.json b/codegen2/test/test-cases/failure/ActionUnsupportedProperty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ActionUnsupportedProperty.json rename to codegen2/test/test-cases/failure/ActionUnsupportedProperty.json diff --git a/codegen2/test/test-cases/failure/ActionsTopicDuplication.json b/codegen2/test/test-cases/failure/ActionsTopicDuplication.json new file mode 100644 index 0000000000..c41a438ad3 --- /dev/null +++ b/codegen2/test/test-cases/failure/ActionsTopicDuplication.json @@ -0,0 +1,23 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionsTopicDuplication.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "ActionsTopicDuplication.TM.json", + "line": 13, + "cfLine": 0, + "crossRef": "sample/dup/{executorId}" + }, + { + "condition": "Duplication", + "filename": "ActionsTopicDuplication.TM.json", + "line": 22, + "cfLine": 0, + "crossRef": "sample/dup/{executorId}" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ArrayKey.json b/codegen2/test/test-cases/failure/ArrayKey.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ArrayKey.json rename to codegen2/test/test-cases/failure/ArrayKey.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/BooleanKey.json b/codegen2/test/test-cases/failure/BooleanKey.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/BooleanKey.json rename to codegen2/test/test-cases/failure/BooleanKey.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextDtvWrongPrefix.json b/codegen2/test/test-cases/failure/ContextDtvWrongPrefix.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextDtvWrongPrefix.json rename to codegen2/test/test-cases/failure/ContextDtvWrongPrefix.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextDtvWrongUri.json b/codegen2/test/test-cases/failure/ContextDtvWrongUri.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextDtvWrongUri.json rename to codegen2/test/test-cases/failure/ContextDtvWrongUri.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextMissingDtv.json b/codegen2/test/test-cases/failure/ContextMissingDtv.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextMissingDtv.json rename to codegen2/test/test-cases/failure/ContextMissingDtv.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextMissingWot.json b/codegen2/test/test-cases/failure/ContextMissingWot.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextMissingWot.json rename to codegen2/test/test-cases/failure/ContextMissingWot.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextWrongType.json b/codegen2/test/test-cases/failure/ContextWrongType.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ContextWrongType.json rename to codegen2/test/test-cases/failure/ContextWrongType.json diff --git a/codegen2/test/test-cases/failure/DuplicateGeneratedNameAcrossThingsInOneFile.json b/codegen2/test/test-cases/failure/DuplicateGeneratedNameAcrossThingsInOneFile.json new file mode 100644 index 0000000000..530f6497ae --- /dev/null +++ b/codegen2/test/test-cases/failure/DuplicateGeneratedNameAcrossThingsInOneFile.json @@ -0,0 +1,23 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/DuplicateGeneratedNameAcrossThingsInOneFile.TM.json" ], + "lang": "csharp" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "DuplicateGeneratedNameAcrossThingsInOneFile.TM.json", + "line": 11, + "cfLine": 0, + "crossRef": "MyPropSchema" + }, + { + "condition": "Duplication", + "filename": "DuplicateGeneratedNameAcrossThingsInOneFile.TM.json", + "line": 39, + "cfLine": 0, + "crossRef": "MyPropSchema" + } + ] +} diff --git a/codegen2/test/test-cases/failure/DuplicateGeneratedNameAcrossThingsInTwoFiles.json b/codegen2/test/test-cases/failure/DuplicateGeneratedNameAcrossThingsInTwoFiles.json new file mode 100644 index 0000000000..3bbad314ad --- /dev/null +++ b/codegen2/test/test-cases/failure/DuplicateGeneratedNameAcrossThingsInTwoFiles.json @@ -0,0 +1,23 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "valid/ThingOneWithGeneratedNameMyPropSchema.TM.json", "valid/ThingTwoWithGeneratedNameMyPropSchema.TM.json" ], + "lang": "csharp" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "ThingOneWithGeneratedNameMyPropSchema.TM.json", + "line": 10, + "cfLine": 0, + "crossRef": "MyPropSchema" + }, + { + "condition": "Duplication", + "filename": "ThingTwoWithGeneratedNameMyPropSchema.TM.json", + "line": 10, + "cfLine": 0, + "crossRef": "MyPropSchema" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/DuplicateKey.json b/codegen2/test/test-cases/failure/DuplicateKey.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/DuplicateKey.json rename to codegen2/test/test-cases/failure/DuplicateKey.json diff --git a/codegen2/test/test-cases/failure/DuplicateThingNameAcrossThingsInOneFile.json b/codegen2/test/test-cases/failure/DuplicateThingNameAcrossThingsInOneFile.json new file mode 100644 index 0000000000..9d80d99c48 --- /dev/null +++ b/codegen2/test/test-cases/failure/DuplicateThingNameAcrossThingsInOneFile.json @@ -0,0 +1,23 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/DuplicateThingNameAcrossThingsInOneFile.TM.json" ], + "lang": "csharp" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "DuplicateThingNameAcrossThingsInOneFile.TM.json", + "line": 8, + "cfLine": 0, + "crossRef": "MyThing" + }, + { + "condition": "Duplication", + "filename": "DuplicateThingNameAcrossThingsInOneFile.TM.json", + "line": 30, + "cfLine": 0, + "crossRef": "MyThing" + } + ] +} diff --git a/codegen2/test/test-cases/failure/DuplicateThingNameAcrossThingsInTwoFiles.json b/codegen2/test/test-cases/failure/DuplicateThingNameAcrossThingsInTwoFiles.json new file mode 100644 index 0000000000..e29404e341 --- /dev/null +++ b/codegen2/test/test-cases/failure/DuplicateThingNameAcrossThingsInTwoFiles.json @@ -0,0 +1,23 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "valid/ThingOneNamedMyThing.TM.json", "valid/ThingTwoNamedMyThing.TM.json" ], + "lang": "csharp" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "ThingOneNamedMyThing.TM.json", + "line": 7, + "cfLine": 0, + "crossRef": "MyThing" + }, + { + "condition": "Duplication", + "filename": "ThingTwoNamedMyThing.TM.json", + "line": 7, + "cfLine": 0, + "crossRef": "MyThing" + } + ] +} diff --git a/codegen2/test/test-cases/failure/DuplicatedGeneratedNameAcrossJsonSchemas.json b/codegen2/test/test-cases/failure/DuplicatedGeneratedNameAcrossJsonSchemas.json new file mode 100644 index 0000000000..4d3144dad0 --- /dev/null +++ b/codegen2/test/test-cases/failure/DuplicatedGeneratedNameAcrossJsonSchemas.json @@ -0,0 +1,23 @@ +{ + "success": false, + "commandLine": { + "schemas": [ "../schemas/json-schemas/AnObjectSchema.json", "../schemas/json-schemas/AnotherObjectSchema.json" ], + "lang": "csharp" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "AnObjectSchema.json", + "line": 1, + "cfLine": 0, + "crossRef": "AnObjectSchema" + }, + { + "condition": "Duplication", + "filename": "AnotherObjectSchema.json", + "line": 1, + "cfLine": 0, + "crossRef": "AnObjectSchema" + } + ] +} diff --git a/codegen2/test/test-cases/failure/DuplicatedGeneratedNameBetweenThingAndJsonSchema.json b/codegen2/test/test-cases/failure/DuplicatedGeneratedNameBetweenThingAndJsonSchema.json new file mode 100644 index 0000000000..831d7c4817 --- /dev/null +++ b/codegen2/test/test-cases/failure/DuplicatedGeneratedNameBetweenThingAndJsonSchema.json @@ -0,0 +1,24 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/DuplicatedGeneratedNameBetweenThingAndJsonSchema.TM.json" ], + "schemas": [ "../schemas/json-schemas/AnObjectSchema.json" ], + "lang": "csharp" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "DuplicatedGeneratedNameBetweenThingAndJsonSchema.TM.json", + "line": 13, + "cfLine": 0, + "crossRef": "AnObjectSchema" + }, + { + "condition": "Duplication", + "filename": "AnObjectSchema.json", + "line": 1, + "cfLine": 0, + "crossRef": "AnObjectSchema" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventBooleanConst.json b/codegen2/test/test-cases/failure/EventBooleanConst.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventBooleanConst.json rename to codegen2/test/test-cases/failure/EventBooleanConst.json diff --git a/codegen2/test/test-cases/failure/EventDuplicateSchemaNamesDifferentTypes.json b/codegen2/test/test-cases/failure/EventDuplicateSchemaNamesDifferentTypes.json new file mode 100644 index 0000000000..d3ad9731c1 --- /dev/null +++ b/codegen2/test/test-cases/failure/EventDuplicateSchemaNamesDifferentTypes.json @@ -0,0 +1,23 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventDuplicateSchemaNamesDifferentTypes.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "EventDuplicateSchemaNamesDifferentTypes.TM.json", + "line": 14, + "cfLine": 32, + "crossRef": "" + }, + { + "condition": "Duplication", + "filename": "EventDuplicateSchemaNamesDifferentTypes.TM.json", + "line": 32, + "cfLine": 14, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/EventDuplicateSchemaNamesEnumsDifferentValues.json b/codegen2/test/test-cases/failure/EventDuplicateSchemaNamesEnumsDifferentValues.json new file mode 100644 index 0000000000..6f13cb360a --- /dev/null +++ b/codegen2/test/test-cases/failure/EventDuplicateSchemaNamesEnumsDifferentValues.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventDuplicateSchemaNamesEnumsDifferentValues.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "EventDuplicateSchemaNamesEnumsDifferentValues.TM.json", + "line": 14, + "cfLine": 32, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/EventDuplicateSchemaNamesObjectsDifferentFieldValues.json b/codegen2/test/test-cases/failure/EventDuplicateSchemaNamesObjectsDifferentFieldValues.json new file mode 100644 index 0000000000..6fdf10a64a --- /dev/null +++ b/codegen2/test/test-cases/failure/EventDuplicateSchemaNamesObjectsDifferentFieldValues.json @@ -0,0 +1,23 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventDuplicateSchemaNamesObjectsDifferentFieldValues.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "EventDuplicateSchemaNamesObjectsDifferentFieldValues.TM.json", + "line": 18, + "cfLine": 36, + "crossRef": "" + }, + { + "condition": "Duplication", + "filename": "EventDuplicateSchemaNamesObjectsDifferentFieldValues.TM.json", + "line": 36, + "cfLine": 18, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/EventDuplicateSchemaNamesObjectsDifferentFields.json b/codegen2/test/test-cases/failure/EventDuplicateSchemaNamesObjectsDifferentFields.json new file mode 100644 index 0000000000..184267d0ac --- /dev/null +++ b/codegen2/test/test-cases/failure/EventDuplicateSchemaNamesObjectsDifferentFields.json @@ -0,0 +1,23 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventDuplicateSchemaNamesObjectsDifferentFields.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "EventDuplicateSchemaNamesObjectsDifferentFields.TM.json", + "line": 18, + "cfLine": 32, + "crossRef": "" + }, + { + "condition": "Duplication", + "filename": "EventDuplicateSchemaNamesObjectsDifferentFields.TM.json", + "line": 36, + "cfLine": 14, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormAdditionalResponses.json b/codegen2/test/test-cases/failure/EventFormAdditionalResponses.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormAdditionalResponses.json rename to codegen2/test/test-cases/failure/EventFormAdditionalResponses.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormContentTypeText.json b/codegen2/test/test-cases/failure/EventFormContentTypeText.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormContentTypeText.json rename to codegen2/test/test-cases/failure/EventFormContentTypeText.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderCode.json b/codegen2/test/test-cases/failure/EventFormHeaderCode.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderCode.json rename to codegen2/test/test-cases/failure/EventFormHeaderCode.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderInfo.json b/codegen2/test/test-cases/failure/EventFormHeaderInfo.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormHeaderInfo.json rename to codegen2/test/test-cases/failure/EventFormHeaderInfo.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpInvoke.json b/codegen2/test/test-cases/failure/EventFormOpInvoke.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpInvoke.json rename to codegen2/test/test-cases/failure/EventFormOpInvoke.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpRead.json b/codegen2/test/test-cases/failure/EventFormOpRead.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpRead.json rename to codegen2/test/test-cases/failure/EventFormOpRead.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubAll.json b/codegen2/test/test-cases/failure/EventFormOpSubAll.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubAll.json rename to codegen2/test/test-cases/failure/EventFormOpSubAll.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubDuplicate.json b/codegen2/test/test-cases/failure/EventFormOpSubDuplicate.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpSubDuplicate.json rename to codegen2/test/test-cases/failure/EventFormOpSubDuplicate.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpWrite.json b/codegen2/test/test-cases/failure/EventFormOpWrite.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormOpWrite.json rename to codegen2/test/test-cases/failure/EventFormOpWrite.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormServiceGroupEmpty.json b/codegen2/test/test-cases/failure/EventFormServiceGroupEmpty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormServiceGroupEmpty.json rename to codegen2/test/test-cases/failure/EventFormServiceGroupEmpty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicNoContentType.json b/codegen2/test/test-cases/failure/EventFormTopicNoContentType.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicNoContentType.json rename to codegen2/test/test-cases/failure/EventFormTopicNoContentType.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenAction.json b/codegen2/test/test-cases/failure/EventFormTopicTokenAction.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenAction.json rename to codegen2/test/test-cases/failure/EventFormTopicTokenAction.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenConsumerId.json b/codegen2/test/test-cases/failure/EventFormTopicTokenConsumerId.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenConsumerId.json rename to codegen2/test/test-cases/failure/EventFormTopicTokenConsumerId.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenExecutorId.json b/codegen2/test/test-cases/failure/EventFormTopicTokenExecutorId.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenExecutorId.json rename to codegen2/test/test-cases/failure/EventFormTopicTokenExecutorId.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenInvokerId.json b/codegen2/test/test-cases/failure/EventFormTopicTokenInvokerId.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenInvokerId.json rename to codegen2/test/test-cases/failure/EventFormTopicTokenInvokerId.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenMaintainerId.json b/codegen2/test/test-cases/failure/EventFormTopicTokenMaintainerId.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormTopicTokenMaintainerId.json rename to codegen2/test/test-cases/failure/EventFormTopicTokenMaintainerId.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormUnsupportedProperty.json b/codegen2/test/test-cases/failure/EventFormUnsupportedProperty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormUnsupportedProperty.json rename to codegen2/test/test-cases/failure/EventFormUnsupportedProperty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsEmpty.json b/codegen2/test/test-cases/failure/EventFormsEmpty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsEmpty.json rename to codegen2/test/test-cases/failure/EventFormsEmpty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOpSubDuplicate.json b/codegen2/test/test-cases/failure/EventFormsOpSubDuplicate.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOpSubDuplicate.json rename to codegen2/test/test-cases/failure/EventFormsOpSubDuplicate.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessAndSub.json b/codegen2/test/test-cases/failure/EventFormsOplessAndSub.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessAndSub.json rename to codegen2/test/test-cases/failure/EventFormsOplessAndSub.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessDuplicate.json b/codegen2/test/test-cases/failure/EventFormsOplessDuplicate.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventFormsOplessDuplicate.json rename to codegen2/test/test-cases/failure/EventFormsOplessDuplicate.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventIntegerConst.json b/codegen2/test/test-cases/failure/EventIntegerConst.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventIntegerConst.json rename to codegen2/test/test-cases/failure/EventIntegerConst.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoForms.json b/codegen2/test/test-cases/failure/EventNoForms.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoForms.json rename to codegen2/test/test-cases/failure/EventNoForms.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoFormsWithTopicAndNoRootFormSubAll.json b/codegen2/test/test-cases/failure/EventNoFormsWithTopicAndNoRootFormSubAll.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNoFormsWithTopicAndNoRootFormSubAll.json rename to codegen2/test/test-cases/failure/EventNoFormsWithTopicAndNoRootFormSubAll.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNullAndContentTypeJson.json b/codegen2/test/test-cases/failure/EventNullAndContentTypeJson.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNullAndContentTypeJson.json rename to codegen2/test/test-cases/failure/EventNullAndContentTypeJson.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNumberConst.json b/codegen2/test/test-cases/failure/EventNumberConst.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventNumberConst.json rename to codegen2/test/test-cases/failure/EventNumberConst.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeCustom.json b/codegen2/test/test-cases/failure/EventObjectAndContentTypeCustom.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeCustom.json rename to codegen2/test/test-cases/failure/EventObjectAndContentTypeCustom.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeRaw.json b/codegen2/test/test-cases/failure/EventObjectAndContentTypeRaw.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectAndContentTypeRaw.json rename to codegen2/test/test-cases/failure/EventObjectAndContentTypeRaw.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectConst.json b/codegen2/test/test-cases/failure/EventObjectConst.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectConst.json rename to codegen2/test/test-cases/failure/EventObjectConst.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectErrorMessage.json b/codegen2/test/test-cases/failure/EventObjectErrorMessage.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventObjectErrorMessage.json rename to codegen2/test/test-cases/failure/EventObjectErrorMessage.json diff --git a/codegen2/test/test-cases/failure/EventRefNotFound.json b/codegen2/test/test-cases/failure/EventRefNotFound.json new file mode 100644 index 0000000000..9eb6245124 --- /dev/null +++ b/codegen2/test/test-cases/failure/EventRefNotFound.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventRefNotFound.TM.json" ], + "lang": "csharp" + }, + "errors": [ + { + "condition": "ItemNotFound", + "filename": "EventRefNotFound.TM.json", + "line": 15, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventStringConst.json b/codegen2/test/test-cases/failure/EventStringConst.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventStringConst.json rename to codegen2/test/test-cases/failure/EventStringConst.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventUnsupportedProperty.json b/codegen2/test/test-cases/failure/EventUnsupportedProperty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/EventUnsupportedProperty.json rename to codegen2/test/test-cases/failure/EventUnsupportedProperty.json diff --git a/codegen2/test/test-cases/failure/EventsTopicDuplication.json b/codegen2/test/test-cases/failure/EventsTopicDuplication.json new file mode 100644 index 0000000000..bbed9bf662 --- /dev/null +++ b/codegen2/test/test-cases/failure/EventsTopicDuplication.json @@ -0,0 +1,23 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventsTopicDuplication.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "EventsTopicDuplication.TM.json", + "line": 20, + "cfLine": 0, + "crossRef": "sample/dup/TestThing" + }, + { + "condition": "Duplication", + "filename": "EventsTopicDuplication.TM.json", + "line": 32, + "cfLine": 0, + "crossRef": "sample/dup/TestThing" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkEmptyHref.json b/codegen2/test/test-cases/failure/LinkEmptyHref.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkEmptyHref.json rename to codegen2/test/test-cases/failure/LinkEmptyHref.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkEmptyType.json b/codegen2/test/test-cases/failure/LinkEmptyType.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkEmptyType.json rename to codegen2/test/test-cases/failure/LinkEmptyType.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNoHref.json b/codegen2/test/test-cases/failure/LinkNoHref.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNoHref.json rename to codegen2/test/test-cases/failure/LinkNoHref.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNoType.json b/codegen2/test/test-cases/failure/LinkNoType.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNoType.json rename to codegen2/test/test-cases/failure/LinkNoType.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNonJsonFile.json b/codegen2/test/test-cases/failure/LinkNonJsonFile.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNonJsonFile.json rename to codegen2/test/test-cases/failure/LinkNonJsonFile.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNonexistentFile.json b/codegen2/test/test-cases/failure/LinkNonexistentFile.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkNonexistentFile.json rename to codegen2/test/test-cases/failure/LinkNonexistentFile.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkTypeNotJson.json b/codegen2/test/test-cases/failure/LinkTypeNotJson.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkTypeNotJson.json rename to codegen2/test/test-cases/failure/LinkTypeNotJson.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkUnsupportedProperty.json b/codegen2/test/test-cases/failure/LinkUnsupportedProperty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/LinkUnsupportedProperty.json rename to codegen2/test/test-cases/failure/LinkUnsupportedProperty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingColon.json b/codegen2/test/test-cases/failure/MissingColon.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingColon.json rename to codegen2/test/test-cases/failure/MissingColon.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingComma.json b/codegen2/test/test-cases/failure/MissingComma.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingComma.json rename to codegen2/test/test-cases/failure/MissingComma.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingElement.json b/codegen2/test/test-cases/failure/MissingElement.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingElement.json rename to codegen2/test/test-cases/failure/MissingElement.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingKey.json b/codegen2/test/test-cases/failure/MissingKey.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingKey.json rename to codegen2/test/test-cases/failure/MissingKey.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingValue.json b/codegen2/test/test-cases/failure/MissingValue.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MissingValue.json rename to codegen2/test/test-cases/failure/MissingValue.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MultipleLinks.json b/codegen2/test/test-cases/failure/MultipleLinks.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/MultipleLinks.json rename to codegen2/test/test-cases/failure/MultipleLinks.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoClientOrServer.json b/codegen2/test/test-cases/failure/NoClientOrServer.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoClientOrServer.json rename to codegen2/test/test-cases/failure/NoClientOrServer.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoContext.json b/codegen2/test/test-cases/failure/NoContext.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoContext.json rename to codegen2/test/test-cases/failure/NoContext.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoThingOrSchema.json b/codegen2/test/test-cases/failure/NoThingOrSchema.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoThingOrSchema.json rename to codegen2/test/test-cases/failure/NoThingOrSchema.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoTitle.json b/codegen2/test/test-cases/failure/NoTitle.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoTitle.json rename to codegen2/test/test-cases/failure/NoTitle.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoType.json b/codegen2/test/test-cases/failure/NoType.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NoType.json rename to codegen2/test/test-cases/failure/NoType.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NonexistentThing.json b/codegen2/test/test-cases/failure/NonexistentThing.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NonexistentThing.json rename to codegen2/test/test-cases/failure/NonexistentThing.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NumericKey.json b/codegen2/test/test-cases/failure/NumericKey.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/NumericKey.json rename to codegen2/test/test-cases/failure/NumericKey.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ObjectKey.json b/codegen2/test/test-cases/failure/ObjectKey.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ObjectKey.json rename to codegen2/test/test-cases/failure/ObjectKey.json diff --git a/codegen2/test/test-cases/failure/PropertiesReadTopicDuplication.json b/codegen2/test/test-cases/failure/PropertiesReadTopicDuplication.json new file mode 100644 index 0000000000..778af7bd09 --- /dev/null +++ b/codegen2/test/test-cases/failure/PropertiesReadTopicDuplication.json @@ -0,0 +1,44 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertiesReadTopicDuplication.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "PropertiesReadTopicDuplication.TM.json", + "line": 16, + "cfLine": 0, + "crossRef": "sample/dup/{maintainerId}/read" + }, + { + "condition": "Duplication", + "filename": "PropertiesReadTopicDuplication.TM.json", + "line": 26, + "cfLine": 0, + "crossRef": "sample/dup/{maintainerId}/read" + }, + { + "condition": "Duplication", + "filename": "PropertiesReadTopicDuplication.TM.json", + "line": 37, + "cfLine": 0, + "crossRef": "sample/dup/{maintainerId}/read" + }, + { + "condition": "Duplication", + "filename": "PropertiesReadTopicDuplication.TM.json", + "line": 46, + "cfLine": 0, + "crossRef": "sample/dup/{maintainerId}/read" + }, + { + "condition": "Duplication", + "filename": "PropertiesReadTopicDuplication.TM.json", + "line": 61, + "cfLine": 0, + "crossRef": "sample/dup/{maintainerId}/read" + } + ] +} diff --git a/codegen2/test/test-cases/failure/PropertiesWriteTopicDuplication.json b/codegen2/test/test-cases/failure/PropertiesWriteTopicDuplication.json new file mode 100644 index 0000000000..475f669087 --- /dev/null +++ b/codegen2/test/test-cases/failure/PropertiesWriteTopicDuplication.json @@ -0,0 +1,30 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertiesWriteTopicDuplication.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "PropertiesWriteTopicDuplication.TM.json", + "line": 21, + "cfLine": 0, + "crossRef": "sample/dup/{maintainerId}/write" + }, + { + "condition": "Duplication", + "filename": "PropertiesWriteTopicDuplication.TM.json", + "line": 36, + "cfLine": 0, + "crossRef": "sample/dup/{maintainerId}/write" + }, + { + "condition": "Duplication", + "filename": "PropertiesWriteTopicDuplication.TM.json", + "line": 46, + "cfLine": 0, + "crossRef": "sample/dup/{maintainerId}/write" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyBooleanConst.json b/codegen2/test/test-cases/failure/PropertyBooleanConst.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyBooleanConst.json rename to codegen2/test/test-cases/failure/PropertyBooleanConst.json diff --git a/codegen2/test/test-cases/failure/PropertyDuplicateSchemaNamesDifferentTypes.json b/codegen2/test/test-cases/failure/PropertyDuplicateSchemaNamesDifferentTypes.json new file mode 100644 index 0000000000..70145aed12 --- /dev/null +++ b/codegen2/test/test-cases/failure/PropertyDuplicateSchemaNamesDifferentTypes.json @@ -0,0 +1,23 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyDuplicateSchemaNamesDifferentTypes.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "PropertyDuplicateSchemaNamesDifferentTypes.TM.json", + "line": 11, + "cfLine": 27, + "crossRef": "" + }, + { + "condition": "Duplication", + "filename": "PropertyDuplicateSchemaNamesDifferentTypes.TM.json", + "line": 27, + "cfLine": 11, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/PropertyDuplicateSchemaNamesEnumsDifferentValues.json b/codegen2/test/test-cases/failure/PropertyDuplicateSchemaNamesEnumsDifferentValues.json new file mode 100644 index 0000000000..c4931fbbba --- /dev/null +++ b/codegen2/test/test-cases/failure/PropertyDuplicateSchemaNamesEnumsDifferentValues.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyDuplicateSchemaNamesEnumsDifferentValues.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "PropertyDuplicateSchemaNamesEnumsDifferentValues.TM.json", + "line": 11, + "cfLine": 27, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/PropertyDuplicateSchemaNamesObjectsDifferentFieldValues.json b/codegen2/test/test-cases/failure/PropertyDuplicateSchemaNamesObjectsDifferentFieldValues.json new file mode 100644 index 0000000000..a2a5750a45 --- /dev/null +++ b/codegen2/test/test-cases/failure/PropertyDuplicateSchemaNamesObjectsDifferentFieldValues.json @@ -0,0 +1,23 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyDuplicateSchemaNamesObjectsDifferentFieldValues.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "PropertyDuplicateSchemaNamesObjectsDifferentFieldValues.TM.json", + "line": 15, + "cfLine": 31, + "crossRef": "" + }, + { + "condition": "Duplication", + "filename": "PropertyDuplicateSchemaNamesObjectsDifferentFieldValues.TM.json", + "line": 31, + "cfLine": 15, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/PropertyDuplicateSchemaNamesObjectsDifferentFields.json b/codegen2/test/test-cases/failure/PropertyDuplicateSchemaNamesObjectsDifferentFields.json new file mode 100644 index 0000000000..a8545c656e --- /dev/null +++ b/codegen2/test/test-cases/failure/PropertyDuplicateSchemaNamesObjectsDifferentFields.json @@ -0,0 +1,23 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyDuplicateSchemaNamesObjectsDifferentFields.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "Duplication", + "filename": "PropertyDuplicateSchemaNamesObjectsDifferentFields.TM.json", + "line": 15, + "cfLine": 27, + "crossRef": "" + }, + { + "condition": "Duplication", + "filename": "PropertyDuplicateSchemaNamesObjectsDifferentFields.TM.json", + "line": 31, + "cfLine": 11, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeEmpty.json b/codegen2/test/test-cases/failure/PropertyFormAdditionalResponseContentTypeEmpty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeEmpty.json rename to codegen2/test/test-cases/failure/PropertyFormAdditionalResponseContentTypeEmpty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeText.json b/codegen2/test/test-cases/failure/PropertyFormAdditionalResponseContentTypeText.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseContentTypeText.json rename to codegen2/test/test-cases/failure/PropertyFormAdditionalResponseContentTypeText.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.json b/codegen2/test/test-cases/failure/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.json rename to codegen2/test/test-cases/failure/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchema.json b/codegen2/test/test-cases/failure/PropertyFormAdditionalResponseNoSchema.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchema.json rename to codegen2/test/test-cases/failure/PropertyFormAdditionalResponseNoSchema.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchemaDefinitions.json b/codegen2/test/test-cases/failure/PropertyFormAdditionalResponseNoSchemaDefinitions.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSchemaDefinitions.json rename to codegen2/test/test-cases/failure/PropertyFormAdditionalResponseNoSchemaDefinitions.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSuccess.json b/codegen2/test/test-cases/failure/PropertyFormAdditionalResponseNoSuccess.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseNoSuccess.json rename to codegen2/test/test-cases/failure/PropertyFormAdditionalResponseNoSuccess.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionMap.json b/codegen2/test/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionMap.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionMap.json rename to codegen2/test/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionMap.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionNotObject.json b/codegen2/test/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionNotObject.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionNotObject.json rename to codegen2/test/test-cases/failure/PropertyFormAdditionalResponseSchemaDefinitionNotObject.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaEmpty.json b/codegen2/test/test-cases/failure/PropertyFormAdditionalResponseSchemaEmpty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSchemaEmpty.json rename to codegen2/test/test-cases/failure/PropertyFormAdditionalResponseSchemaEmpty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSuccessTrue.json b/codegen2/test/test-cases/failure/PropertyFormAdditionalResponseSuccessTrue.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseSuccessTrue.json rename to codegen2/test/test-cases/failure/PropertyFormAdditionalResponseSuccessTrue.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseUnsupportedProperty.json b/codegen2/test/test-cases/failure/PropertyFormAdditionalResponseUnsupportedProperty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponseUnsupportedProperty.json rename to codegen2/test/test-cases/failure/PropertyFormAdditionalResponseUnsupportedProperty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponsesMultiple.json b/codegen2/test/test-cases/failure/PropertyFormAdditionalResponsesMultiple.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormAdditionalResponsesMultiple.json rename to codegen2/test/test-cases/failure/PropertyFormAdditionalResponsesMultiple.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormContentTypeText.json b/codegen2/test/test-cases/failure/PropertyFormContentTypeText.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormContentTypeText.json rename to codegen2/test/test-cases/failure/PropertyFormContentTypeText.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderCode.json b/codegen2/test/test-cases/failure/PropertyFormHeaderCode.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderCode.json rename to codegen2/test/test-cases/failure/PropertyFormHeaderCode.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderInfo.json b/codegen2/test/test-cases/failure/PropertyFormHeaderInfo.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormHeaderInfo.json rename to codegen2/test/test-cases/failure/PropertyFormHeaderInfo.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpInvoke.json b/codegen2/test/test-cases/failure/PropertyFormOpInvoke.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpInvoke.json rename to codegen2/test/test-cases/failure/PropertyFormOpInvoke.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadAll.json b/codegen2/test/test-cases/failure/PropertyFormOpReadAll.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadAll.json rename to codegen2/test/test-cases/failure/PropertyFormOpReadAll.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadDuplicate.json b/codegen2/test/test-cases/failure/PropertyFormOpReadDuplicate.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpReadDuplicate.json rename to codegen2/test/test-cases/failure/PropertyFormOpReadDuplicate.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpSub.json b/codegen2/test/test-cases/failure/PropertyFormOpSub.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpSub.json rename to codegen2/test/test-cases/failure/PropertyFormOpSub.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteDuplicate.json b/codegen2/test/test-cases/failure/PropertyFormOpWriteDuplicate.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteDuplicate.json rename to codegen2/test/test-cases/failure/PropertyFormOpWriteDuplicate.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteMulti.json b/codegen2/test/test-cases/failure/PropertyFormOpWriteMulti.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOpWriteMulti.json rename to codegen2/test/test-cases/failure/PropertyFormOpWriteMulti.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json b/codegen2/test/test-cases/failure/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json rename to codegen2/test/test-cases/failure/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.json b/codegen2/test/test-cases/failure/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.json rename to codegen2/test/test-cases/failure/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json b/codegen2/test/test-cases/failure/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json rename to codegen2/test/test-cases/failure/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicAndNoRootFormReadAll.json b/codegen2/test/test-cases/failure/PropertyFormReadWithoutTopicAndNoRootFormReadAll.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicAndNoRootFormReadAll.json rename to codegen2/test/test-cases/failure/PropertyFormReadWithoutTopicAndNoRootFormReadAll.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.json b/codegen2/test/test-cases/failure/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.json rename to codegen2/test/test-cases/failure/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormServiceGroup.json b/codegen2/test/test-cases/failure/PropertyFormServiceGroup.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormServiceGroup.json rename to codegen2/test/test-cases/failure/PropertyFormServiceGroup.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicNoContentType.json b/codegen2/test/test-cases/failure/PropertyFormTopicNoContentType.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicNoContentType.json rename to codegen2/test/test-cases/failure/PropertyFormTopicNoContentType.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenExecutorId.json b/codegen2/test/test-cases/failure/PropertyFormTopicTokenExecutorId.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenExecutorId.json rename to codegen2/test/test-cases/failure/PropertyFormTopicTokenExecutorId.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenInvokerId.json b/codegen2/test/test-cases/failure/PropertyFormTopicTokenInvokerId.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenInvokerId.json rename to codegen2/test/test-cases/failure/PropertyFormTopicTokenInvokerId.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.json b/codegen2/test/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.json rename to codegen2/test/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.json b/codegen2/test/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.json rename to codegen2/test/test-cases/failure/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenReadAndWrite.json b/codegen2/test/test-cases/failure/PropertyFormTopicTokenNoActionWhenReadAndWrite.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenNoActionWhenReadAndWrite.json rename to codegen2/test/test-cases/failure/PropertyFormTopicTokenNoActionWhenReadAndWrite.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenSenderId.json b/codegen2/test/test-cases/failure/PropertyFormTopicTokenSenderId.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormTopicTokenSenderId.json rename to codegen2/test/test-cases/failure/PropertyFormTopicTokenSenderId.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormUnsupportedProperty.json b/codegen2/test/test-cases/failure/PropertyFormUnsupportedProperty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormUnsupportedProperty.json rename to codegen2/test/test-cases/failure/PropertyFormUnsupportedProperty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.json b/codegen2/test/test-cases/failure/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.json rename to codegen2/test/test-cases/failure/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.json b/codegen2/test/test-cases/failure/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.json rename to codegen2/test/test-cases/failure/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsEmpty.json b/codegen2/test/test-cases/failure/PropertyFormsEmpty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsEmpty.json rename to codegen2/test/test-cases/failure/PropertyFormsEmpty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpReadDuplicate.json b/codegen2/test/test-cases/failure/PropertyFormsOpReadDuplicate.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpReadDuplicate.json rename to codegen2/test/test-cases/failure/PropertyFormsOpReadDuplicate.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteDuplicate.json b/codegen2/test/test-cases/failure/PropertyFormsOpWriteDuplicate.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteDuplicate.json rename to codegen2/test/test-cases/failure/PropertyFormsOpWriteDuplicate.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteNoRead.json b/codegen2/test/test-cases/failure/PropertyFormsOpWriteNoRead.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOpWriteNoRead.json rename to codegen2/test/test-cases/failure/PropertyFormsOpWriteNoRead.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessAndRead.json b/codegen2/test/test-cases/failure/PropertyFormsOplessAndRead.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessAndRead.json rename to codegen2/test/test-cases/failure/PropertyFormsOplessAndRead.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessDuplicate.json b/codegen2/test/test-cases/failure/PropertyFormsOplessDuplicate.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyFormsOplessDuplicate.json rename to codegen2/test/test-cases/failure/PropertyFormsOplessDuplicate.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyIntegerConst.json b/codegen2/test/test-cases/failure/PropertyIntegerConst.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyIntegerConst.json rename to codegen2/test/test-cases/failure/PropertyIntegerConst.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNoForms.json b/codegen2/test/test-cases/failure/PropertyNoForms.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNoForms.json rename to codegen2/test/test-cases/failure/PropertyNoForms.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNumberConst.json b/codegen2/test/test-cases/failure/PropertyNumberConst.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyNumberConst.json rename to codegen2/test/test-cases/failure/PropertyNumberConst.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyObjectConst.json b/codegen2/test/test-cases/failure/PropertyObjectConst.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyObjectConst.json rename to codegen2/test/test-cases/failure/PropertyObjectConst.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyObjectErrorMessage.json b/codegen2/test/test-cases/failure/PropertyObjectErrorMessage.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyObjectErrorMessage.json rename to codegen2/test/test-cases/failure/PropertyObjectErrorMessage.json diff --git a/codegen2/test/test-cases/failure/PropertyRefNotFound.json b/codegen2/test/test-cases/failure/PropertyRefNotFound.json new file mode 100644 index 0000000000..81e0a5d1d1 --- /dev/null +++ b/codegen2/test/test-cases/failure/PropertyRefNotFound.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyRefNotFound.TM.json" ], + "lang": "csharp" + }, + "errors": [ + { + "condition": "ItemNotFound", + "filename": "PropertyRefNotFound.TM.json", + "line": 12, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyStringConst.json b/codegen2/test/test-cases/failure/PropertyStringConst.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyStringConst.json rename to codegen2/test/test-cases/failure/PropertyStringConst.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyTypeNull.json b/codegen2/test/test-cases/failure/PropertyTypeNull.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyTypeNull.json rename to codegen2/test/test-cases/failure/PropertyTypeNull.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyUnsupportedProperty.json b/codegen2/test/test-cases/failure/PropertyUnsupportedProperty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/PropertyUnsupportedProperty.json rename to codegen2/test/test-cases/failure/PropertyUnsupportedProperty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeEmpty.json b/codegen2/test/test-cases/failure/RootFormAdditionalResponseContentTypeEmpty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeEmpty.json rename to codegen2/test/test-cases/failure/RootFormAdditionalResponseContentTypeEmpty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeText.json b/codegen2/test/test-cases/failure/RootFormAdditionalResponseContentTypeText.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseContentTypeText.json rename to codegen2/test/test-cases/failure/RootFormAdditionalResponseContentTypeText.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseNoSuccess.json b/codegen2/test/test-cases/failure/RootFormAdditionalResponseNoSuccess.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseNoSuccess.json rename to codegen2/test/test-cases/failure/RootFormAdditionalResponseNoSuccess.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSchema.json b/codegen2/test/test-cases/failure/RootFormAdditionalResponseSchema.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSchema.json rename to codegen2/test/test-cases/failure/RootFormAdditionalResponseSchema.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSuccessTrue.json b/codegen2/test/test-cases/failure/RootFormAdditionalResponseSuccessTrue.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseSuccessTrue.json rename to codegen2/test/test-cases/failure/RootFormAdditionalResponseSuccessTrue.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseUnsupportedProperty.json b/codegen2/test/test-cases/failure/RootFormAdditionalResponseUnsupportedProperty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponseUnsupportedProperty.json rename to codegen2/test/test-cases/failure/RootFormAdditionalResponseUnsupportedProperty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesAndSubAll.json b/codegen2/test/test-cases/failure/RootFormAdditionalResponsesAndSubAll.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesAndSubAll.json rename to codegen2/test/test-cases/failure/RootFormAdditionalResponsesAndSubAll.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesMultiple.json b/codegen2/test/test-cases/failure/RootFormAdditionalResponsesMultiple.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormAdditionalResponsesMultiple.json rename to codegen2/test/test-cases/failure/RootFormAdditionalResponsesMultiple.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeCustom.json b/codegen2/test/test-cases/failure/RootFormContentTypeCustom.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeCustom.json rename to codegen2/test/test-cases/failure/RootFormContentTypeCustom.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeRaw.json b/codegen2/test/test-cases/failure/RootFormContentTypeRaw.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeRaw.json rename to codegen2/test/test-cases/failure/RootFormContentTypeRaw.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeText.json b/codegen2/test/test-cases/failure/RootFormContentTypeText.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormContentTypeText.json rename to codegen2/test/test-cases/failure/RootFormContentTypeText.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderCode.json b/codegen2/test/test-cases/failure/RootFormHeaderCode.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderCode.json rename to codegen2/test/test-cases/failure/RootFormHeaderCode.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderInfo.json b/codegen2/test/test-cases/failure/RootFormHeaderInfo.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormHeaderInfo.json rename to codegen2/test/test-cases/failure/RootFormHeaderInfo.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoContentType.json b/codegen2/test/test-cases/failure/RootFormNoContentType.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoContentType.json rename to codegen2/test/test-cases/failure/RootFormNoContentType.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoOp.json b/codegen2/test/test-cases/failure/RootFormNoOp.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoOp.json rename to codegen2/test/test-cases/failure/RootFormNoOp.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoTopic.json b/codegen2/test/test-cases/failure/RootFormNoTopic.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormNoTopic.json rename to codegen2/test/test-cases/failure/RootFormNoTopic.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpArrayEmpty.json b/codegen2/test/test-cases/failure/RootFormOpArrayEmpty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpArrayEmpty.json rename to codegen2/test/test-cases/failure/RootFormOpArrayEmpty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpElementEmpty.json b/codegen2/test/test-cases/failure/RootFormOpElementEmpty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpElementEmpty.json rename to codegen2/test/test-cases/failure/RootFormOpElementEmpty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpEmpty.json b/codegen2/test/test-cases/failure/RootFormOpEmpty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpEmpty.json rename to codegen2/test/test-cases/failure/RootFormOpEmpty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllAndSubAll.json b/codegen2/test/test-cases/failure/RootFormOpReadAllAndSubAll.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllAndSubAll.json rename to codegen2/test/test-cases/failure/RootFormOpReadAllAndSubAll.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllDuplicate.json b/codegen2/test/test-cases/failure/RootFormOpReadAllDuplicate.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadAllDuplicate.json rename to codegen2/test/test-cases/failure/RootFormOpReadAllDuplicate.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadOne.json b/codegen2/test/test-cases/failure/RootFormOpReadOne.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpReadOne.json rename to codegen2/test/test-cases/failure/RootFormOpReadOne.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubAllDuplicate.json b/codegen2/test/test-cases/failure/RootFormOpSubAllDuplicate.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubAllDuplicate.json rename to codegen2/test/test-cases/failure/RootFormOpSubAllDuplicate.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubOne.json b/codegen2/test/test-cases/failure/RootFormOpSubOne.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpSubOne.json rename to codegen2/test/test-cases/failure/RootFormOpSubOne.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWiteMultiAndSubAll.json b/codegen2/test/test-cases/failure/RootFormOpWiteMultiAndSubAll.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWiteMultiAndSubAll.json rename to codegen2/test/test-cases/failure/RootFormOpWiteMultiAndSubAll.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteMultiDuplicate.json b/codegen2/test/test-cases/failure/RootFormOpWriteMultiDuplicate.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteMultiDuplicate.json rename to codegen2/test/test-cases/failure/RootFormOpWriteMultiDuplicate.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteOne.json b/codegen2/test/test-cases/failure/RootFormOpWriteOne.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormOpWriteOne.json rename to codegen2/test/test-cases/failure/RootFormOpWriteOne.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormReadAllButNoProperties.json b/codegen2/test/test-cases/failure/RootFormReadAllButNoProperties.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormReadAllButNoProperties.json rename to codegen2/test/test-cases/failure/RootFormReadAllButNoProperties.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupEmpty.json b/codegen2/test/test-cases/failure/RootFormServiceGroupEmpty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupEmpty.json rename to codegen2/test/test-cases/failure/RootFormServiceGroupEmpty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupNoSubAll.json b/codegen2/test/test-cases/failure/RootFormServiceGroupNoSubAll.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormServiceGroupNoSubAll.json rename to codegen2/test/test-cases/failure/RootFormServiceGroupNoSubAll.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormSubAllButNoEvents.json b/codegen2/test/test-cases/failure/RootFormSubAllButNoEvents.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormSubAllButNoEvents.json rename to codegen2/test/test-cases/failure/RootFormSubAllButNoEvents.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicEmpty.json b/codegen2/test/test-cases/failure/RootFormTopicEmpty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicEmpty.json rename to codegen2/test/test-cases/failure/RootFormTopicEmpty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelEmpty.json b/codegen2/test/test-cases/failure/RootFormTopicLevelEmpty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelEmpty.json rename to codegen2/test/test-cases/failure/RootFormTopicLevelEmpty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelInvalid.json b/codegen2/test/test-cases/failure/RootFormTopicLevelInvalid.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicLevelInvalid.json rename to codegen2/test/test-cases/failure/RootFormTopicLevelInvalid.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicReservedStart.json b/codegen2/test/test-cases/failure/RootFormTopicReservedStart.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicReservedStart.json rename to codegen2/test/test-cases/failure/RootFormTopicReservedStart.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenActionWhenSubAll.json b/codegen2/test/test-cases/failure/RootFormTopicTokenActionWhenSubAll.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenActionWhenSubAll.json rename to codegen2/test/test-cases/failure/RootFormTopicTokenActionWhenSubAll.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenConsumerIdWhenSubAll.json b/codegen2/test/test-cases/failure/RootFormTopicTokenConsumerIdWhenSubAll.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenConsumerIdWhenSubAll.json rename to codegen2/test/test-cases/failure/RootFormTopicTokenConsumerIdWhenSubAll.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomEmpty.json b/codegen2/test/test-cases/failure/RootFormTopicTokenCustomEmpty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomEmpty.json rename to codegen2/test/test-cases/failure/RootFormTopicTokenCustomEmpty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomInvalid.json b/codegen2/test/test-cases/failure/RootFormTopicTokenCustomInvalid.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenCustomInvalid.json rename to codegen2/test/test-cases/failure/RootFormTopicTokenCustomInvalid.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenEmpty.json b/codegen2/test/test-cases/failure/RootFormTopicTokenEmpty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenEmpty.json rename to codegen2/test/test-cases/failure/RootFormTopicTokenEmpty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenExecutorId.json b/codegen2/test/test-cases/failure/RootFormTopicTokenExecutorId.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenExecutorId.json rename to codegen2/test/test-cases/failure/RootFormTopicTokenExecutorId.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenInvokerId.json b/codegen2/test/test-cases/failure/RootFormTopicTokenInvokerId.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenInvokerId.json rename to codegen2/test/test-cases/failure/RootFormTopicTokenInvokerId.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenMaintainerIdWhenSubAll.json b/codegen2/test/test-cases/failure/RootFormTopicTokenMaintainerIdWhenSubAll.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenMaintainerIdWhenSubAll.json rename to codegen2/test/test-cases/failure/RootFormTopicTokenMaintainerIdWhenSubAll.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.json b/codegen2/test/test-cases/failure/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.json rename to codegen2/test/test-cases/failure/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenReadAll.json b/codegen2/test/test-cases/failure/RootFormTopicTokenSenderIdWhenReadAll.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenReadAll.json rename to codegen2/test/test-cases/failure/RootFormTopicTokenSenderIdWhenReadAll.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenWriteMulti.json b/codegen2/test/test-cases/failure/RootFormTopicTokenSenderIdWhenWriteMulti.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenSenderIdWhenWriteMulti.json rename to codegen2/test/test-cases/failure/RootFormTopicTokenSenderIdWhenWriteMulti.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenUnrecognized.json b/codegen2/test/test-cases/failure/RootFormTopicTokenUnrecognized.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormTopicTokenUnrecognized.json rename to codegen2/test/test-cases/failure/RootFormTopicTokenUnrecognized.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormWriteMultiButNoWritableProperties.json b/codegen2/test/test-cases/failure/RootFormWriteMultiButNoWritableProperties.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormWriteMultiButNoWritableProperties.json rename to codegen2/test/test-cases/failure/RootFormWriteMultiButNoWritableProperties.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsEmpty.json b/codegen2/test/test-cases/failure/RootFormsEmpty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsEmpty.json rename to codegen2/test/test-cases/failure/RootFormsEmpty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpReadAllDuplicate.json b/codegen2/test/test-cases/failure/RootFormsOpReadAllDuplicate.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpReadAllDuplicate.json rename to codegen2/test/test-cases/failure/RootFormsOpReadAllDuplicate.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpSubAllDuplicate.json b/codegen2/test/test-cases/failure/RootFormsOpSubAllDuplicate.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpSubAllDuplicate.json rename to codegen2/test/test-cases/failure/RootFormsOpSubAllDuplicate.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiDuplicate.json b/codegen2/test/test-cases/failure/RootFormsOpWriteMultiDuplicate.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiDuplicate.json rename to codegen2/test/test-cases/failure/RootFormsOpWriteMultiDuplicate.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiNoReadAll.json b/codegen2/test/test-cases/failure/RootFormsOpWriteMultiNoReadAll.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/RootFormsOpWriteMultiNoReadAll.json rename to codegen2/test/test-cases/failure/RootFormsOpWriteMultiNoReadAll.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayConst.json b/codegen2/test/test-cases/failure/SchemaDefinitionArrayConst.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayConst.json rename to codegen2/test/test-cases/failure/SchemaDefinitionArrayConst.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsNoType.json b/codegen2/test/test-cases/failure/SchemaDefinitionArrayItemsNoType.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsNoType.json rename to codegen2/test/test-cases/failure/SchemaDefinitionArrayItemsNoType.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsNotObject.json b/codegen2/test/test-cases/failure/SchemaDefinitionArrayItemsNotObject.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsNotObject.json rename to codegen2/test/test-cases/failure/SchemaDefinitionArrayItemsNotObject.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsObjectConst.json b/codegen2/test/test-cases/failure/SchemaDefinitionArrayItemsObjectConst.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsObjectConst.json rename to codegen2/test/test-cases/failure/SchemaDefinitionArrayItemsObjectConst.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsRef.json b/codegen2/test/test-cases/failure/SchemaDefinitionArrayItemsRef.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsRef.json rename to codegen2/test/test-cases/failure/SchemaDefinitionArrayItemsRef.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsStringConst.json b/codegen2/test/test-cases/failure/SchemaDefinitionArrayItemsStringConst.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsStringConst.json rename to codegen2/test/test-cases/failure/SchemaDefinitionArrayItemsStringConst.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeNotString.json b/codegen2/test/test-cases/failure/SchemaDefinitionArrayItemsTypeNotString.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeNotString.json rename to codegen2/test/test-cases/failure/SchemaDefinitionArrayItemsTypeNotString.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeNull.json b/codegen2/test/test-cases/failure/SchemaDefinitionArrayItemsTypeNull.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeNull.json rename to codegen2/test/test-cases/failure/SchemaDefinitionArrayItemsTypeNull.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeUnsupported.json b/codegen2/test/test-cases/failure/SchemaDefinitionArrayItemsTypeUnsupported.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayItemsTypeUnsupported.json rename to codegen2/test/test-cases/failure/SchemaDefinitionArrayItemsTypeUnsupported.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayNoItems.json b/codegen2/test/test-cases/failure/SchemaDefinitionArrayNoItems.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionArrayNoItems.json rename to codegen2/test/test-cases/failure/SchemaDefinitionArrayNoItems.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanConstValueNotBoolean.json b/codegen2/test/test-cases/failure/SchemaDefinitionBooleanConstValueNotBoolean.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanConstValueNotBoolean.json rename to codegen2/test/test-cases/failure/SchemaDefinitionBooleanConstValueNotBoolean.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanReadOnly.json b/codegen2/test/test-cases/failure/SchemaDefinitionBooleanReadOnly.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanReadOnly.json rename to codegen2/test/test-cases/failure/SchemaDefinitionBooleanReadOnly.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanUnsupportedProperty.json b/codegen2/test/test-cases/failure/SchemaDefinitionBooleanUnsupportedProperty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionBooleanUnsupportedProperty.json rename to codegen2/test/test-cases/failure/SchemaDefinitionBooleanUnsupportedProperty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueAboveMax.json b/codegen2/test/test-cases/failure/SchemaDefinitionIntegerConstValueAboveMax.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueAboveMax.json rename to codegen2/test/test-cases/failure/SchemaDefinitionIntegerConstValueAboveMax.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueBelowMin.json b/codegen2/test/test-cases/failure/SchemaDefinitionIntegerConstValueBelowMin.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueBelowMin.json rename to codegen2/test/test-cases/failure/SchemaDefinitionIntegerConstValueBelowMin.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueNotInteger.json b/codegen2/test/test-cases/failure/SchemaDefinitionIntegerConstValueNotInteger.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueNotInteger.json rename to codegen2/test/test-cases/failure/SchemaDefinitionIntegerConstValueNotInteger.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueNotNumeric.json b/codegen2/test/test-cases/failure/SchemaDefinitionIntegerConstValueNotNumeric.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerConstValueNotNumeric.json rename to codegen2/test/test-cases/failure/SchemaDefinitionIntegerConstValueNotNumeric.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMaxNotInteger.json b/codegen2/test/test-cases/failure/SchemaDefinitionIntegerMaxNotInteger.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMaxNotInteger.json rename to codegen2/test/test-cases/failure/SchemaDefinitionIntegerMaxNotInteger.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMaxNotNumeric.json b/codegen2/test/test-cases/failure/SchemaDefinitionIntegerMaxNotNumeric.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMaxNotNumeric.json rename to codegen2/test/test-cases/failure/SchemaDefinitionIntegerMaxNotNumeric.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinAboveMax.json b/codegen2/test/test-cases/failure/SchemaDefinitionIntegerMinAboveMax.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinAboveMax.json rename to codegen2/test/test-cases/failure/SchemaDefinitionIntegerMinAboveMax.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinNotInteger.json b/codegen2/test/test-cases/failure/SchemaDefinitionIntegerMinNotInteger.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinNotInteger.json rename to codegen2/test/test-cases/failure/SchemaDefinitionIntegerMinNotInteger.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinNotNumeric.json b/codegen2/test/test-cases/failure/SchemaDefinitionIntegerMinNotNumeric.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerMinNotNumeric.json rename to codegen2/test/test-cases/failure/SchemaDefinitionIntegerMinNotNumeric.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerReadOnly.json b/codegen2/test/test-cases/failure/SchemaDefinitionIntegerReadOnly.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerReadOnly.json rename to codegen2/test/test-cases/failure/SchemaDefinitionIntegerReadOnly.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerUnsupportedProperty.json b/codegen2/test/test-cases/failure/SchemaDefinitionIntegerUnsupportedProperty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionIntegerUnsupportedProperty.json rename to codegen2/test/test-cases/failure/SchemaDefinitionIntegerUnsupportedProperty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNoType.json b/codegen2/test/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNoType.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNoType.json rename to codegen2/test/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNoType.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNotObject.json b/codegen2/test/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNotObject.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNotObject.json rename to codegen2/test/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesNotObject.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesObjectConst.json b/codegen2/test/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesObjectConst.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesObjectConst.json rename to codegen2/test/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesObjectConst.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesRef.json b/codegen2/test/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesRef.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesRef.json rename to codegen2/test/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesRef.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesStringConst.json b/codegen2/test/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesStringConst.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesStringConst.json rename to codegen2/test/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesStringConst.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNotString.json b/codegen2/test/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNotString.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNotString.json rename to codegen2/test/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNotString.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNull.json b/codegen2/test/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNull.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNull.json rename to codegen2/test/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeNull.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.json b/codegen2/test/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.json rename to codegen2/test/test-cases/failure/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapConst.json b/codegen2/test/test-cases/failure/SchemaDefinitionMapConst.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionMapConst.json rename to codegen2/test/test-cases/failure/SchemaDefinitionMapConst.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNoType.json b/codegen2/test/test-cases/failure/SchemaDefinitionNoType.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNoType.json rename to codegen2/test/test-cases/failure/SchemaDefinitionNoType.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueAboveMax.json b/codegen2/test/test-cases/failure/SchemaDefinitionNumberConstValueAboveMax.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueAboveMax.json rename to codegen2/test/test-cases/failure/SchemaDefinitionNumberConstValueAboveMax.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueBelowMin.json b/codegen2/test/test-cases/failure/SchemaDefinitionNumberConstValueBelowMin.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueBelowMin.json rename to codegen2/test/test-cases/failure/SchemaDefinitionNumberConstValueBelowMin.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueNotNumeric.json b/codegen2/test/test-cases/failure/SchemaDefinitionNumberConstValueNotNumeric.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberConstValueNotNumeric.json rename to codegen2/test/test-cases/failure/SchemaDefinitionNumberConstValueNotNumeric.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMaxNotNumeric.json b/codegen2/test/test-cases/failure/SchemaDefinitionNumberMaxNotNumeric.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMaxNotNumeric.json rename to codegen2/test/test-cases/failure/SchemaDefinitionNumberMaxNotNumeric.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMinAboveMax.json b/codegen2/test/test-cases/failure/SchemaDefinitionNumberMinAboveMax.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMinAboveMax.json rename to codegen2/test/test-cases/failure/SchemaDefinitionNumberMinAboveMax.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMinNotNumeric.json b/codegen2/test/test-cases/failure/SchemaDefinitionNumberMinNotNumeric.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberMinNotNumeric.json rename to codegen2/test/test-cases/failure/SchemaDefinitionNumberMinNotNumeric.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberReadOnly.json b/codegen2/test/test-cases/failure/SchemaDefinitionNumberReadOnly.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberReadOnly.json rename to codegen2/test/test-cases/failure/SchemaDefinitionNumberReadOnly.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberUnsupportedProperty.json b/codegen2/test/test-cases/failure/SchemaDefinitionNumberUnsupportedProperty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionNumberUnsupportedProperty.json rename to codegen2/test/test-cases/failure/SchemaDefinitionNumberUnsupportedProperty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectBothDeterminants.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectBothDeterminants.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectBothDeterminants.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectBothDeterminants.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstNotObject.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectConstNotObject.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstNotObject.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectConstNotObject.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanConst.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanConst.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanConst.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanConst.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerAboveMax.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerAboveMax.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerAboveMax.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerAboveMax.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerBelowMin.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerBelowMin.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerBelowMin.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerBelowMin.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerConst.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerConst.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerConst.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerConst.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotInteger.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotInteger.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotInteger.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotInteger.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNoType.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyNoType.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNoType.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyNoType.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNoValue.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyNoValue.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNoValue.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyNoValue.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberAboveMax.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberAboveMax.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberAboveMax.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberAboveMax.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberBelowMin.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberBelowMin.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberBelowMin.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberBelowMin.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberConst.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberConst.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberConst.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberConst.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberNotNumeric.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberNotNumeric.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberNotNumeric.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberNotNumeric.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringConst.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyStringConst.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringConst.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyStringConst.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringValueNotString.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyStringValueNotString.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyStringValueNotString.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyStringValueNotString.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeArray.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeArray.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeArray.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeArray.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeNull.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeNull.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeNull.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeNull.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeObject.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeObject.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeObject.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeObject.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeUnsupported.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeUnsupported.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeUnsupported.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectConstPropertyTypeUnsupported.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstUnsupportedProperty.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectConstUnsupportedProperty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstUnsupportedProperty.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectConstUnsupportedProperty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstValueNoSchema.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectConstValueNoSchema.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectConstValueNoSchema.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectConstValueNoSchema.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessageNoProperty.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectErrorMessageNoProperty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessageNoProperty.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectErrorMessageNoProperty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessageNotString.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectErrorMessageNotString.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessageNotString.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectErrorMessageNotString.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessagePropertyNotString.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectErrorMessagePropertyNotString.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectErrorMessagePropertyNotString.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectErrorMessagePropertyNotString.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectNoDeterminant.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectNoDeterminant.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectNoDeterminant.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectNoDeterminant.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertiesNotObject.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectPropertiesNotObject.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertiesNotObject.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectPropertiesNotObject.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyNoType.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectPropertyNoType.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyNoType.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectPropertyNoType.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyObjectConst.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectPropertyObjectConst.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyObjectConst.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectPropertyObjectConst.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyRef.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectPropertyRef.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyRef.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectPropertyRef.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyStringConst.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectPropertyStringConst.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyStringConst.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectPropertyStringConst.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeNotString.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectPropertyTypeNotString.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeNotString.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectPropertyTypeNotString.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeNull.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectPropertyTypeNull.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeNull.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectPropertyTypeNull.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeUnsupported.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectPropertyTypeUnsupported.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectPropertyTypeUnsupported.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectPropertyTypeUnsupported.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectRequiredNoProperty.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectRequiredNoProperty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectRequiredNoProperty.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectRequiredNoProperty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectRequiredNotString.json b/codegen2/test/test-cases/failure/SchemaDefinitionObjectRequiredNotString.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionObjectRequiredNotString.json rename to codegen2/test/test-cases/failure/SchemaDefinitionObjectRequiredNotString.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionRef.json b/codegen2/test/test-cases/failure/SchemaDefinitionRef.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionRef.json rename to codegen2/test/test-cases/failure/SchemaDefinitionRef.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstContentEncoding.json b/codegen2/test/test-cases/failure/SchemaDefinitionStringConstContentEncoding.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstContentEncoding.json rename to codegen2/test/test-cases/failure/SchemaDefinitionStringConstContentEncoding.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstFormat.json b/codegen2/test/test-cases/failure/SchemaDefinitionStringConstFormat.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstFormat.json rename to codegen2/test/test-cases/failure/SchemaDefinitionStringConstFormat.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstPattern.json b/codegen2/test/test-cases/failure/SchemaDefinitionStringConstPattern.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstPattern.json rename to codegen2/test/test-cases/failure/SchemaDefinitionStringConstPattern.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstUnsupportedProperty.json b/codegen2/test/test-cases/failure/SchemaDefinitionStringConstUnsupportedProperty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstUnsupportedProperty.json rename to codegen2/test/test-cases/failure/SchemaDefinitionStringConstUnsupportedProperty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstValueNotString.json b/codegen2/test/test-cases/failure/SchemaDefinitionStringConstValueNotString.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringConstValueNotString.json rename to codegen2/test/test-cases/failure/SchemaDefinitionStringConstValueNotString.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringContentEncodingNotString.json b/codegen2/test/test-cases/failure/SchemaDefinitionStringContentEncodingNotString.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringContentEncodingNotString.json rename to codegen2/test/test-cases/failure/SchemaDefinitionStringContentEncodingNotString.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringContentEncodingUnsupportedValue.json b/codegen2/test/test-cases/failure/SchemaDefinitionStringContentEncodingUnsupportedValue.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringContentEncodingUnsupportedValue.json rename to codegen2/test/test-cases/failure/SchemaDefinitionStringContentEncodingUnsupportedValue.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumConst.json b/codegen2/test/test-cases/failure/SchemaDefinitionStringEnumConst.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumConst.json rename to codegen2/test/test-cases/failure/SchemaDefinitionStringEnumConst.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumContentEncoding.json b/codegen2/test/test-cases/failure/SchemaDefinitionStringEnumContentEncoding.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumContentEncoding.json rename to codegen2/test/test-cases/failure/SchemaDefinitionStringEnumContentEncoding.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumElementInvalid.json b/codegen2/test/test-cases/failure/SchemaDefinitionStringEnumElementInvalid.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumElementInvalid.json rename to codegen2/test/test-cases/failure/SchemaDefinitionStringEnumElementInvalid.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumFormat.json b/codegen2/test/test-cases/failure/SchemaDefinitionStringEnumFormat.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumFormat.json rename to codegen2/test/test-cases/failure/SchemaDefinitionStringEnumFormat.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumPattern.json b/codegen2/test/test-cases/failure/SchemaDefinitionStringEnumPattern.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumPattern.json rename to codegen2/test/test-cases/failure/SchemaDefinitionStringEnumPattern.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumReadOnly.json b/codegen2/test/test-cases/failure/SchemaDefinitionStringEnumReadOnly.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumReadOnly.json rename to codegen2/test/test-cases/failure/SchemaDefinitionStringEnumReadOnly.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumUnsupportedProperty.json b/codegen2/test/test-cases/failure/SchemaDefinitionStringEnumUnsupportedProperty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringEnumUnsupportedProperty.json rename to codegen2/test/test-cases/failure/SchemaDefinitionStringEnumUnsupportedProperty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatAndContentEncoding.json b/codegen2/test/test-cases/failure/SchemaDefinitionStringFormatAndContentEncoding.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatAndContentEncoding.json rename to codegen2/test/test-cases/failure/SchemaDefinitionStringFormatAndContentEncoding.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatAndPattern.json b/codegen2/test/test-cases/failure/SchemaDefinitionStringFormatAndPattern.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatAndPattern.json rename to codegen2/test/test-cases/failure/SchemaDefinitionStringFormatAndPattern.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatNotString.json b/codegen2/test/test-cases/failure/SchemaDefinitionStringFormatNotString.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatNotString.json rename to codegen2/test/test-cases/failure/SchemaDefinitionStringFormatNotString.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatUnsupportedValue.json b/codegen2/test/test-cases/failure/SchemaDefinitionStringFormatUnsupportedValue.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringFormatUnsupportedValue.json rename to codegen2/test/test-cases/failure/SchemaDefinitionStringFormatUnsupportedValue.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternAndContentEncoding.json b/codegen2/test/test-cases/failure/SchemaDefinitionStringPatternAndContentEncoding.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternAndContentEncoding.json rename to codegen2/test/test-cases/failure/SchemaDefinitionStringPatternAndContentEncoding.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternNotDurationOrDecimal.json b/codegen2/test/test-cases/failure/SchemaDefinitionStringPatternNotDurationOrDecimal.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternNotDurationOrDecimal.json rename to codegen2/test/test-cases/failure/SchemaDefinitionStringPatternNotDurationOrDecimal.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternNotString.json b/codegen2/test/test-cases/failure/SchemaDefinitionStringPatternNotString.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternNotString.json rename to codegen2/test/test-cases/failure/SchemaDefinitionStringPatternNotString.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternRegexInvalid.json b/codegen2/test/test-cases/failure/SchemaDefinitionStringPatternRegexInvalid.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringPatternRegexInvalid.json rename to codegen2/test/test-cases/failure/SchemaDefinitionStringPatternRegexInvalid.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringReadOnly.json b/codegen2/test/test-cases/failure/SchemaDefinitionStringReadOnly.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringReadOnly.json rename to codegen2/test/test-cases/failure/SchemaDefinitionStringReadOnly.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringUnsupportedProperty.json b/codegen2/test/test-cases/failure/SchemaDefinitionStringUnsupportedProperty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionStringUnsupportedProperty.json rename to codegen2/test/test-cases/failure/SchemaDefinitionStringUnsupportedProperty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeNotString.json b/codegen2/test/test-cases/failure/SchemaDefinitionTypeNotString.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeNotString.json rename to codegen2/test/test-cases/failure/SchemaDefinitionTypeNotString.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeNull.json b/codegen2/test/test-cases/failure/SchemaDefinitionTypeNull.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeNull.json rename to codegen2/test/test-cases/failure/SchemaDefinitionTypeNull.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeUnsupported.json b/codegen2/test/test-cases/failure/SchemaDefinitionTypeUnsupported.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/SchemaDefinitionTypeUnsupported.json rename to codegen2/test/test-cases/failure/SchemaDefinitionTypeUnsupported.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ThingUnsupportedProperty.json b/codegen2/test/test-cases/failure/ThingUnsupportedProperty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/ThingUnsupportedProperty.json rename to codegen2/test/test-cases/failure/ThingUnsupportedProperty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleEmpty.json b/codegen2/test/test-cases/failure/TitleEmpty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleEmpty.json rename to codegen2/test/test-cases/failure/TitleEmpty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleInvalid.json b/codegen2/test/test-cases/failure/TitleInvalid.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleInvalid.json rename to codegen2/test/test-cases/failure/TitleInvalid.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleNotString.json b/codegen2/test/test-cases/failure/TitleNotString.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TitleNotString.json rename to codegen2/test/test-cases/failure/TitleNotString.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TrailingComma.json b/codegen2/test/test-cases/failure/TrailingComma.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TrailingComma.json rename to codegen2/test/test-cases/failure/TrailingComma.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TypeEmpty.json b/codegen2/test/test-cases/failure/TypeEmpty.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TypeEmpty.json rename to codegen2/test/test-cases/failure/TypeEmpty.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TypeNotThingModel.json b/codegen2/test/test-cases/failure/TypeNotThingModel.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/TypeNotThingModel.json rename to codegen2/test/test-cases/failure/TypeNotThingModel.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedArray.json b/codegen2/test/test-cases/failure/UnclosedArray.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedArray.json rename to codegen2/test/test-cases/failure/UnclosedArray.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedObject.json b/codegen2/test/test-cases/failure/UnclosedObject.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnclosedObject.json rename to codegen2/test/test-cases/failure/UnclosedObject.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnsupportedLanguage.json b/codegen2/test/test-cases/failure/UnsupportedLanguage.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/failure/UnsupportedLanguage.json rename to codegen2/test/test-cases/failure/UnsupportedLanguage.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/LinkExtends.json b/codegen2/test/test-cases/success/LinkExtends.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/LinkExtends.json rename to codegen2/test/test-cases/success/LinkExtends.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/LinkNoRel.json b/codegen2/test/test-cases/success/LinkNoRel.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/LinkNoRel.json rename to codegen2/test/test-cases/success/LinkNoRel.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/LinkOtherRel.json b/codegen2/test/test-cases/success/LinkOtherRel.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/LinkOtherRel.json rename to codegen2/test/test-cases/success/LinkOtherRel.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.json b/codegen2/test/test-cases/success/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.json rename to codegen2/test/test-cases/success/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.json b/codegen2/test/test-cases/success/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/test-cases/success/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.json rename to codegen2/test/test-cases/success/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/.vscode/settings.json b/codegen2/test/thing-models/.vscode/settings.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/.vscode/settings.json rename to codegen2/test/thing-models/.vscode/settings.json diff --git a/codegen2/test/thing-models/invalidAioBinding/ActionDuplicateSchemaNamesObjectsDifferentFieldValues.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionDuplicateSchemaNamesObjectsDifferentFieldValues.TM.json new file mode 100644 index 0000000000..e2b9052f5a --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/ActionDuplicateSchemaNamesObjectsDifferentFieldValues.TM.json @@ -0,0 +1,41 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Echo", + "actions": { + "echo": { + "input": { + "title": "MyActionSchema", + "type": "object", + "properties": { + "value": { + "type": "string" + } + } + }, + "output": { + "title": "MyActionSchema", + "type": "object", + "properties": { + "value": { + "type": "integer" + } + } + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/poke/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/ActionDuplicateSchemaNamesObjectsDifferentFields.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionDuplicateSchemaNamesObjectsDifferentFields.TM.json new file mode 100644 index 0000000000..28463ae5bd --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/ActionDuplicateSchemaNamesObjectsDifferentFields.TM.json @@ -0,0 +1,41 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Echo", + "actions": { + "echo": { + "input": { + "title": "MyActionSchema", + "type": "object", + "properties": { + "inVal": { + "type": "string" + } + } + }, + "output": { + "title": "MyActionSchema", + "type": "object", + "properties": { + "outVal": { + "type": "string" + } + } + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/poke/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseContentTypeEmpty.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormAdditionalResponseContentTypeEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseContentTypeEmpty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormAdditionalResponseContentTypeEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseContentTypeText.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormAdditionalResponseContentTypeText.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseContentTypeText.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormAdditionalResponseContentTypeText.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseNoMatchingSchemaDefinition.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormAdditionalResponseNoMatchingSchemaDefinition.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseNoMatchingSchemaDefinition.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormAdditionalResponseNoMatchingSchemaDefinition.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseNoSchema.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormAdditionalResponseNoSchema.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseNoSchema.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormAdditionalResponseNoSchema.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseNoSchemaDefinitions.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormAdditionalResponseNoSchemaDefinitions.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseNoSchemaDefinitions.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormAdditionalResponseNoSchemaDefinitions.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseNoSuccess.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormAdditionalResponseNoSuccess.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseNoSuccess.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormAdditionalResponseNoSuccess.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionMap.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionMap.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionMap.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionMap.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionNotObject.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionNotObject.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionNotObject.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormAdditionalResponseSchemaDefinitionNotObject.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseSchemaEmpty.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormAdditionalResponseSchemaEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseSchemaEmpty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormAdditionalResponseSchemaEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseSuccessTrue.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormAdditionalResponseSuccessTrue.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseSuccessTrue.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormAdditionalResponseSuccessTrue.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseUnsupportedProperty.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormAdditionalResponseUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponseUnsupportedProperty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormAdditionalResponseUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponsesMultiple.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormAdditionalResponsesMultiple.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormAdditionalResponsesMultiple.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormAdditionalResponsesMultiple.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormContentTypeText.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormContentTypeText.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormContentTypeText.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormContentTypeText.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderCodeEmpty.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderCodeEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderCodeEmpty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderCodeEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderCodeNoMatchingSchemaDefinition.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderCodeNoMatchingSchemaDefinition.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderCodeNoMatchingSchemaDefinition.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderCodeNoMatchingSchemaDefinition.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderCodeNoSchemaDefinitions.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderCodeNoSchemaDefinitions.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderCodeNoSchemaDefinitions.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderCodeNoSchemaDefinitions.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderCodeSchemaDefinitionNotEnum.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderCodeSchemaDefinitionNotEnum.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderCodeSchemaDefinitionNotEnum.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderCodeSchemaDefinitionNotEnum.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoContentTypeEmpty.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderInfoContentTypeEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoContentTypeEmpty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderInfoContentTypeEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoContentTypeNotJson.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderInfoContentTypeNotJson.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoContentTypeNotJson.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderInfoContentTypeNotJson.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoNoContentType.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderInfoNoContentType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoNoContentType.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderInfoNoContentType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoNoMatchingSchemaDefinition.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderInfoNoMatchingSchemaDefinition.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoNoMatchingSchemaDefinition.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderInfoNoMatchingSchemaDefinition.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoNoSchema.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderInfoNoSchema.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoNoSchema.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderInfoNoSchema.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoNoSchemaDefinitions.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderInfoNoSchemaDefinitions.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoNoSchemaDefinitions.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderInfoNoSchemaDefinitions.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionMap.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionMap.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionMap.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionMap.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionNotObject.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionNotObject.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionNotObject.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderInfoSchemaDefinitionNotObject.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoSchemaEmpty.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderInfoSchemaEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoSchemaEmpty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderInfoSchemaEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoSuccessTrue.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderInfoSuccessTrue.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoSuccessTrue.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderInfoSuccessTrue.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoUnsupportedProperty.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderInfoUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfoUnsupportedProperty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderInfoUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfosMultiple.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderInfosMultiple.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormHeaderInfosMultiple.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormHeaderInfosMultiple.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormOpInvokeDuplicate.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormOpInvokeDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormOpInvokeDuplicate.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormOpInvokeDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormServiceGroupEmpty.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormServiceGroupEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormServiceGroupEmpty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormServiceGroupEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormTopicNoContentType.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormTopicNoContentType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormTopicNoContentType.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormTopicNoContentType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormTopicTokenAction.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormTopicTokenAction.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormTopicTokenAction.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormTopicTokenAction.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormTopicTokenConsumerId.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormTopicTokenConsumerId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormTopicTokenConsumerId.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormTopicTokenConsumerId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormTopicTokenMaintainerId.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormTopicTokenMaintainerId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormTopicTokenMaintainerId.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormTopicTokenMaintainerId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormTopicTokenSenderId.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormTopicTokenSenderId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormTopicTokenSenderId.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormTopicTokenSenderId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormUnsupportedProperty.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormUnsupportedProperty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormsMultipleContentTypes.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormsMultipleContentTypes.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormsMultipleContentTypes.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormsMultipleContentTypes.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormsOpInvokeDuplicate.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormsOpInvokeDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormsOpInvokeDuplicate.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormsOpInvokeDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormsOplessAndInvoke.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormsOplessAndInvoke.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormsOplessAndInvoke.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormsOplessAndInvoke.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormsOplessDuplicate.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionFormsOplessDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionFormsOplessDuplicate.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionFormsOplessDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputMap.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionInputMap.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputMap.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionInputMap.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputNullAndContentTypeJson.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionInputNullAndContentTypeJson.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputNullAndContentTypeJson.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionInputNullAndContentTypeJson.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputNumber.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionInputNumber.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputNumber.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionInputNumber.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputObjectAndContentTypeCustom.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionInputObjectAndContentTypeCustom.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputObjectAndContentTypeCustom.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionInputObjectAndContentTypeCustom.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputObjectAndContentTypeRaw.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionInputObjectAndContentTypeRaw.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputObjectAndContentTypeRaw.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionInputObjectAndContentTypeRaw.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputObjectConst.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionInputObjectConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputObjectConst.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionInputObjectConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputObjectErrorMessage.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionInputObjectErrorMessage.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputObjectErrorMessage.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionInputObjectErrorMessage.TM.json diff --git a/codegen2/test/thing-models/invalidAioBinding/ActionInputRefNotFound.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionInputRefNotFound.TM.json new file mode 100644 index 0000000000..cd83d95eda --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/ActionInputRefNotFound.TM.json @@ -0,0 +1,26 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + "poke": { + "input": { + "dtv:ref": "../../schemas/json-schemas/Nonexistent.json" + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/poke/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/ActionInputRefString.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionInputRefString.TM.json new file mode 100644 index 0000000000..f42a0d5bea --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/ActionInputRefString.TM.json @@ -0,0 +1,26 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + "poke": { + "input": { + "dtv:ref": "../../schemas/json-schemas/AStringSchema.json" + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/poke/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputString.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionInputString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionInputString.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionInputString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionNoForms.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionNoForms.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionNoForms.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionNoForms.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionNoFormsWithTopic.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionNoFormsWithTopic.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionNoFormsWithTopic.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionNoFormsWithTopic.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputMap.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionOutputMap.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputMap.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionOutputMap.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputNullAndContentTypeJson.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionOutputNullAndContentTypeJson.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputNullAndContentTypeJson.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionOutputNullAndContentTypeJson.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputNumber.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionOutputNumber.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputNumber.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionOutputNumber.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputObjectAndContentTypeCustom.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionOutputObjectAndContentTypeCustom.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputObjectAndContentTypeCustom.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionOutputObjectAndContentTypeCustom.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputObjectAndContentTypeRaw.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionOutputObjectAndContentTypeRaw.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputObjectAndContentTypeRaw.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionOutputObjectAndContentTypeRaw.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputObjectConst.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionOutputObjectConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputObjectConst.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionOutputObjectConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputObjectErrorMessage.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionOutputObjectErrorMessage.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputObjectErrorMessage.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionOutputObjectErrorMessage.TM.json diff --git a/codegen2/test/thing-models/invalidAioBinding/ActionOutputRefNotFound.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionOutputRefNotFound.TM.json new file mode 100644 index 0000000000..f97dcfe8fb --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/ActionOutputRefNotFound.TM.json @@ -0,0 +1,26 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + "peek": { + "output": { + "dtv:ref": "../../schemas/json-schemas/Nonexistent.json" + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/peek/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/ActionOutputRefString.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionOutputRefString.TM.json new file mode 100644 index 0000000000..283a896323 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/ActionOutputRefString.TM.json @@ -0,0 +1,26 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + "peek": { + "output": { + "dtv:ref": "../../schemas/json-schemas/AStringSchema.json" + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/peek/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputString.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionOutputString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionOutputString.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionOutputString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionUnsupportedProperty.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ActionUnsupportedProperty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ActionUnsupportedProperty.TM.json diff --git a/codegen2/test/thing-models/invalidAioBinding/ActionsTopicDuplication.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionsTopicDuplication.TM.json new file mode 100644 index 0000000000..e1fabf5938 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/ActionsTopicDuplication.TM.json @@ -0,0 +1,31 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + "one": { + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/dup/{executorId}", + "op": "invokeaction" + } + ] + }, + "two": { + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/dup/{executorId}" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ContextDtvWrongPrefix.TM.json b/codegen2/test/thing-models/invalidAioBinding/ContextDtvWrongPrefix.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ContextDtvWrongPrefix.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ContextDtvWrongPrefix.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ContextDtvWrongUri.TM.json b/codegen2/test/thing-models/invalidAioBinding/ContextDtvWrongUri.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ContextDtvWrongUri.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ContextDtvWrongUri.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ContextMissingDtv.TM.json b/codegen2/test/thing-models/invalidAioBinding/ContextMissingDtv.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ContextMissingDtv.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ContextMissingDtv.TM.json diff --git a/codegen2/test/thing-models/invalidAioBinding/DuplicateGeneratedNameAcrossThingsInOneFile.TM.json b/codegen2/test/thing-models/invalidAioBinding/DuplicateGeneratedNameAcrossThingsInOneFile.TM.json new file mode 100644 index 0000000000..5fbe322860 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/DuplicateGeneratedNameAcrossThingsInOneFile.TM.json @@ -0,0 +1,58 @@ +[ + { + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "ThingOne", + "events": { + "alpha": { + "data": { + "title": "MyPropSchema", + "type": "object", + "properties": { + "myVal": { + "type": "string" + } + } + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry1", + "op": "subscribeevent" + } + ] + } + } + }, + { + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "ThingTwo", + "events": { + "beta": { + "data": { + "title": "MyPropSchema", + "type": "object", + "properties": { + "myVal": { + "type": "string" + } + } + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry2", + "op": "subscribeevent" + } + ] + } + } + } +] diff --git a/codegen2/test/thing-models/invalidAioBinding/DuplicateThingNameAcrossThingsInOneFile.TM.json b/codegen2/test/thing-models/invalidAioBinding/DuplicateThingNameAcrossThingsInOneFile.TM.json new file mode 100644 index 0000000000..cdddb4752a --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/DuplicateThingNameAcrossThingsInOneFile.TM.json @@ -0,0 +1,46 @@ +[ + { + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "MyThing", + "events": { + "alpha": { + "data": { + "type": "string" + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry1", + "op": "subscribeevent" + } + ] + } + } + }, + { + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "MyThing", + "events": { + "beta": { + "data": { + "type": "string" + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry2", + "op": "subscribeevent" + } + ] + } + } + } +] diff --git a/codegen2/test/thing-models/invalidAioBinding/DuplicatedGeneratedNameBetweenThingAndJsonSchema.TM.json b/codegen2/test/thing-models/invalidAioBinding/DuplicatedGeneratedNameBetweenThingAndJsonSchema.TM.json new file mode 100644 index 0000000000..be4999982c --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/DuplicatedGeneratedNameBetweenThingAndJsonSchema.TM.json @@ -0,0 +1,35 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Doit", + "actions": { + "doit": { + "input": { + "dtv:ref": "../../schemas/json-schemas/AnObjectSchema.json" + }, + "output": { + "title": "AnObjectSchema", + "type": "object", + "properties": { + "outVal": { + "type": "string" + } + } + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/doit/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventBooleanConst.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventBooleanConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventBooleanConst.TM.json rename to codegen2/test/thing-models/invalidAioBinding/EventBooleanConst.TM.json diff --git a/codegen2/test/thing-models/invalidAioBinding/EventDuplicateSchemaNamesDifferentTypes.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventDuplicateSchemaNamesDifferentTypes.TM.json new file mode 100644 index 0000000000..34cf041784 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/EventDuplicateSchemaNamesDifferentTypes.TM.json @@ -0,0 +1,49 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "title": "MyEventSchema", + "type": "object", + "properties": { + "alertVal": { + "type": "string" + } + } + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alert/TestThing", + "op": "subscribeevent" + } + ] + }, + "notice": { + "data": { + "title": "MyEventSchema", + "type": "string", + "enum": [ + "foo", + "bar" + ] + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/notice/TestThing", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/EventDuplicateSchemaNamesEnumsDifferentValues.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventDuplicateSchemaNamesEnumsDifferentValues.TM.json new file mode 100644 index 0000000000..c5201cd891 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/EventDuplicateSchemaNamesEnumsDifferentValues.TM.json @@ -0,0 +1,49 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "title": "MyEventSchema", + "type": "string", + "enum": [ + "foo", + "bar", + "baz" + ] + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alert/TestThing", + "op": "subscribeevent" + } + ] + }, + "notice": { + "data": { + "title": "MyEventSchema", + "type": "string", + "enum": [ + "foo", + "bar" + ] + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/notice/TestThing", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/EventDuplicateSchemaNamesObjectsDifferentFieldValues.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventDuplicateSchemaNamesObjectsDifferentFieldValues.TM.json new file mode 100644 index 0000000000..d31b14af73 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/EventDuplicateSchemaNamesObjectsDifferentFieldValues.TM.json @@ -0,0 +1,50 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "title": "MyEventSchema", + "type": "object", + "properties": { + "value": { + "type": "string" + } + } + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alert/TestThing", + "op": "subscribeevent" + } + ] + }, + "notice": { + "data": { + "title": "MyEventSchema", + "type": "object", + "properties": { + "value": { + "type": "integer" + } + } + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/notice/TestThing", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/EventDuplicateSchemaNamesObjectsDifferentFields.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventDuplicateSchemaNamesObjectsDifferentFields.TM.json new file mode 100644 index 0000000000..0392e9618e --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/EventDuplicateSchemaNamesObjectsDifferentFields.TM.json @@ -0,0 +1,50 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "title": "MyEventSchema", + "type": "object", + "properties": { + "alertVal": { + "type": "string" + } + } + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alert/TestThing", + "op": "subscribeevent" + } + ] + }, + "notice": { + "data": { + "title": "MyEventSchema", + "type": "object", + "properties": { + "noticeVal": { + "type": "string" + } + } + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/notice/TestThing", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormAdditionalResponses.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventFormAdditionalResponses.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormAdditionalResponses.TM.json rename to codegen2/test/thing-models/invalidAioBinding/EventFormAdditionalResponses.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormContentTypeText.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventFormContentTypeText.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormContentTypeText.TM.json rename to codegen2/test/thing-models/invalidAioBinding/EventFormContentTypeText.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormHeaderCode.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventFormHeaderCode.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormHeaderCode.TM.json rename to codegen2/test/thing-models/invalidAioBinding/EventFormHeaderCode.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormHeaderInfo.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventFormHeaderInfo.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormHeaderInfo.TM.json rename to codegen2/test/thing-models/invalidAioBinding/EventFormHeaderInfo.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormOpSubDuplicate.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventFormOpSubDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormOpSubDuplicate.TM.json rename to codegen2/test/thing-models/invalidAioBinding/EventFormOpSubDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormServiceGroupEmpty.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventFormServiceGroupEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormServiceGroupEmpty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/EventFormServiceGroupEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormTopicNoContentType.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventFormTopicNoContentType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormTopicNoContentType.TM.json rename to codegen2/test/thing-models/invalidAioBinding/EventFormTopicNoContentType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormTopicTokenAction.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventFormTopicTokenAction.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormTopicTokenAction.TM.json rename to codegen2/test/thing-models/invalidAioBinding/EventFormTopicTokenAction.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormTopicTokenConsumerId.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventFormTopicTokenConsumerId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormTopicTokenConsumerId.TM.json rename to codegen2/test/thing-models/invalidAioBinding/EventFormTopicTokenConsumerId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormTopicTokenExecutorId.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventFormTopicTokenExecutorId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormTopicTokenExecutorId.TM.json rename to codegen2/test/thing-models/invalidAioBinding/EventFormTopicTokenExecutorId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormTopicTokenInvokerId.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventFormTopicTokenInvokerId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormTopicTokenInvokerId.TM.json rename to codegen2/test/thing-models/invalidAioBinding/EventFormTopicTokenInvokerId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormTopicTokenMaintainerId.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventFormTopicTokenMaintainerId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormTopicTokenMaintainerId.TM.json rename to codegen2/test/thing-models/invalidAioBinding/EventFormTopicTokenMaintainerId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormUnsupportedProperty.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventFormUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormUnsupportedProperty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/EventFormUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormsOpSubDuplicate.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventFormsOpSubDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormsOpSubDuplicate.TM.json rename to codegen2/test/thing-models/invalidAioBinding/EventFormsOpSubDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormsOplessAndSub.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventFormsOplessAndSub.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormsOplessAndSub.TM.json rename to codegen2/test/thing-models/invalidAioBinding/EventFormsOplessAndSub.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormsOplessDuplicate.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventFormsOplessDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventFormsOplessDuplicate.TM.json rename to codegen2/test/thing-models/invalidAioBinding/EventFormsOplessDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventIntegerConst.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventIntegerConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventIntegerConst.TM.json rename to codegen2/test/thing-models/invalidAioBinding/EventIntegerConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventNoForms.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventNoForms.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventNoForms.TM.json rename to codegen2/test/thing-models/invalidAioBinding/EventNoForms.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventNoFormsWithTopicAndNoRootFormSubAll.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventNoFormsWithTopicAndNoRootFormSubAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventNoFormsWithTopicAndNoRootFormSubAll.TM.json rename to codegen2/test/thing-models/invalidAioBinding/EventNoFormsWithTopicAndNoRootFormSubAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventNullAndContentTypeJson.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventNullAndContentTypeJson.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventNullAndContentTypeJson.TM.json rename to codegen2/test/thing-models/invalidAioBinding/EventNullAndContentTypeJson.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventNumberConst.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventNumberConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventNumberConst.TM.json rename to codegen2/test/thing-models/invalidAioBinding/EventNumberConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventObjectAndContentTypeCustom.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventObjectAndContentTypeCustom.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventObjectAndContentTypeCustom.TM.json rename to codegen2/test/thing-models/invalidAioBinding/EventObjectAndContentTypeCustom.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventObjectAndContentTypeRaw.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventObjectAndContentTypeRaw.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventObjectAndContentTypeRaw.TM.json rename to codegen2/test/thing-models/invalidAioBinding/EventObjectAndContentTypeRaw.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventObjectConst.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventObjectConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventObjectConst.TM.json rename to codegen2/test/thing-models/invalidAioBinding/EventObjectConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventObjectErrorMessage.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventObjectErrorMessage.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventObjectErrorMessage.TM.json rename to codegen2/test/thing-models/invalidAioBinding/EventObjectErrorMessage.TM.json diff --git a/codegen2/test/thing-models/invalidAioBinding/EventRefNotFound.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventRefNotFound.TM.json new file mode 100644 index 0000000000..2457204f09 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/EventRefNotFound.TM.json @@ -0,0 +1,26 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + }, + "events": { + "alert": { + "data": { + "dtv:ref": "../../schemas/json-schemas/Nonexistent.json" + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alert/TestThing", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventStringConst.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventStringConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventStringConst.TM.json rename to codegen2/test/thing-models/invalidAioBinding/EventStringConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventUnsupportedProperty.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/EventUnsupportedProperty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/EventUnsupportedProperty.TM.json diff --git a/codegen2/test/thing-models/invalidAioBinding/EventsTopicDuplication.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventsTopicDuplication.TM.json new file mode 100644 index 0000000000..6f3b493c1a --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/EventsTopicDuplication.TM.json @@ -0,0 +1,37 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + }, + "events": { + "one": { + "data": { + "type": "string" + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/dup/TestThing", + "op": "subscribeevent" + } + ] + }, + "two": { + "data": { + "type": "string" + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/dup/TestThing" + } + ] + } + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkEmptyHref.TM.json b/codegen2/test/thing-models/invalidAioBinding/LinkEmptyHref.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkEmptyHref.TM.json rename to codegen2/test/thing-models/invalidAioBinding/LinkEmptyHref.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkEmptyType.TM.json b/codegen2/test/thing-models/invalidAioBinding/LinkEmptyType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkEmptyType.TM.json rename to codegen2/test/thing-models/invalidAioBinding/LinkEmptyType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkNoHref.TM.json b/codegen2/test/thing-models/invalidAioBinding/LinkNoHref.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkNoHref.TM.json rename to codegen2/test/thing-models/invalidAioBinding/LinkNoHref.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkNoType.TM.json b/codegen2/test/thing-models/invalidAioBinding/LinkNoType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkNoType.TM.json rename to codegen2/test/thing-models/invalidAioBinding/LinkNoType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkNonJsonFile.TM.json b/codegen2/test/thing-models/invalidAioBinding/LinkNonJsonFile.TM.json similarity index 86% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkNonJsonFile.TM.json rename to codegen2/test/thing-models/invalidAioBinding/LinkNonJsonFile.TM.json index 1b95194f72..e52b5d7b7c 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkNonJsonFile.TM.json +++ b/codegen2/test/thing-models/invalidAioBinding/LinkNonJsonFile.TM.json @@ -8,7 +8,7 @@ "links": [ { "rel": "dtv:naming", - "href": "../../TestCase.cs", + "href": "../../Azure.Iot.Operations.ProtocolCompiler.UnitTests/TestCase.cs", "type": "application/json" } ], diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkNonexistentFile.TM.json b/codegen2/test/thing-models/invalidAioBinding/LinkNonexistentFile.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkNonexistentFile.TM.json rename to codegen2/test/thing-models/invalidAioBinding/LinkNonexistentFile.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkTypeNotJson.TM.json b/codegen2/test/thing-models/invalidAioBinding/LinkTypeNotJson.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkTypeNotJson.TM.json rename to codegen2/test/thing-models/invalidAioBinding/LinkTypeNotJson.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkUnsupportedProperty.TM.json b/codegen2/test/thing-models/invalidAioBinding/LinkUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/LinkUnsupportedProperty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/LinkUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/MultipleLinks.TM.json b/codegen2/test/thing-models/invalidAioBinding/MultipleLinks.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/MultipleLinks.TM.json rename to codegen2/test/thing-models/invalidAioBinding/MultipleLinks.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/NoTitle.TM.json b/codegen2/test/thing-models/invalidAioBinding/NoTitle.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/NoTitle.TM.json rename to codegen2/test/thing-models/invalidAioBinding/NoTitle.TM.json diff --git a/codegen2/test/thing-models/invalidAioBinding/PropertiesReadTopicDuplication.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertiesReadTopicDuplication.TM.json new file mode 100644 index 0000000000..8b82b4f3a9 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/PropertiesReadTopicDuplication.TM.json @@ -0,0 +1,69 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + "one": { + "type": "string", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/dup/{maintainerId}/read", + "op": "readproperty" + } + ] + }, + "two": { + "type": "string", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/dup/{maintainerId}/{action}", + "op": "readproperty" + } + ] + }, + "three": { + "type": "string", + "readOnly": true, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/dup/{maintainerId}/{action}" + } + ] + }, + "four": { + "type": "string", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/dup/{maintainerId}/{action}", + "op": [ "readproperty", "writeproperty" ] + } + ] + }, + "five": { + "type": "string", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/five/{maintainerId}/{action}", + "op": "writeproperty" + }, + { + "contentType": "application/json", + "dtv:topic": "sample/dup/{maintainerId}/{action}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/PropertiesWriteTopicDuplication.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertiesWriteTopicDuplication.TM.json new file mode 100644 index 0000000000..290622eb30 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/PropertiesWriteTopicDuplication.TM.json @@ -0,0 +1,53 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + "one": { + "type": "string", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/one/{maintainerId}/read", + "op": "readproperty" + }, + { + "contentType": "application/json", + "dtv:topic": "sample/dup/{maintainerId}/write", + "op": "writeproperty" + } + ] + }, + "two": { + "type": "string", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/two/{maintainerId}/{action}", + "op": "readproperty" + }, + { + "contentType": "application/json", + "dtv:topic": "sample/dup/{maintainerId}/{action}", + "op": "writeproperty" + } + ] + }, + "three": { + "type": "string", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/dup/{maintainerId}/{action}" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyBooleanConst.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyBooleanConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyBooleanConst.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyBooleanConst.TM.json diff --git a/codegen2/test/thing-models/invalidAioBinding/PropertyDuplicateSchemaNamesDifferentTypes.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyDuplicateSchemaNamesDifferentTypes.TM.json new file mode 100644 index 0000000000..8137290718 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/PropertyDuplicateSchemaNamesDifferentTypes.TM.json @@ -0,0 +1,45 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + "alpha": { + "title": "MyPropSchema", + "type": "object", + "properties": { + "alphaVal": { + "type": "string" + } + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + }, + "beta": { + "title": "MyPropSchema", + "type": "string", + "enum": [ + "foo", + "bar" + ], + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/beta/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/PropertyDuplicateSchemaNamesEnumsDifferentValues.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyDuplicateSchemaNamesEnumsDifferentValues.TM.json new file mode 100644 index 0000000000..2c0b64474d --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/PropertyDuplicateSchemaNamesEnumsDifferentValues.TM.json @@ -0,0 +1,45 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + "alpha": { + "title": "MyPropSchema", + "type": "string", + "enum": [ + "foo", + "bar", + "baz" + ], + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + }, + "beta": { + "title": "MyPropSchema", + "type": "string", + "enum": [ + "foo", + "bar" + ], + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/beta/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/PropertyDuplicateSchemaNamesObjectsDifferentFieldValues.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyDuplicateSchemaNamesObjectsDifferentFieldValues.TM.json new file mode 100644 index 0000000000..fd0c0c154c --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/PropertyDuplicateSchemaNamesObjectsDifferentFieldValues.TM.json @@ -0,0 +1,46 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + "alpha": { + "title": "MyPropSchema", + "type": "object", + "properties": { + "value": { + "type": "string" + } + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + }, + "beta": { + "title": "MyPropSchema", + "type": "object", + "properties": { + "value": { + "type": "integer" + } + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/beta/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/PropertyDuplicateSchemaNamesObjectsDifferentFields.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyDuplicateSchemaNamesObjectsDifferentFields.TM.json new file mode 100644 index 0000000000..87fd722f9b --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/PropertyDuplicateSchemaNamesObjectsDifferentFields.TM.json @@ -0,0 +1,46 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + "alpha": { + "title": "MyPropSchema", + "type": "object", + "properties": { + "alphaVal": { + "type": "string" + } + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + }, + "beta": { + "title": "MyPropSchema", + "type": "object", + "properties": { + "betaVal": { + "type": "string" + } + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/beta/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseContentTypeEmpty.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormAdditionalResponseContentTypeEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseContentTypeEmpty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormAdditionalResponseContentTypeEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseContentTypeText.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormAdditionalResponseContentTypeText.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseContentTypeText.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormAdditionalResponseContentTypeText.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormAdditionalResponseNoMatchingSchemaDefinition.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseNoSchema.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormAdditionalResponseNoSchema.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseNoSchema.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormAdditionalResponseNoSchema.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseNoSchemaDefinitions.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormAdditionalResponseNoSchemaDefinitions.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseNoSchemaDefinitions.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormAdditionalResponseNoSchemaDefinitions.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseNoSuccess.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormAdditionalResponseNoSuccess.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseNoSuccess.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormAdditionalResponseNoSuccess.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionMap.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionMap.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionMap.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionMap.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionNotObject.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionNotObject.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionNotObject.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormAdditionalResponseSchemaDefinitionNotObject.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseSchemaEmpty.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormAdditionalResponseSchemaEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseSchemaEmpty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormAdditionalResponseSchemaEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseSuccessTrue.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormAdditionalResponseSuccessTrue.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseSuccessTrue.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormAdditionalResponseSuccessTrue.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseUnsupportedProperty.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormAdditionalResponseUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponseUnsupportedProperty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormAdditionalResponseUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponsesMultiple.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormAdditionalResponsesMultiple.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormAdditionalResponsesMultiple.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormAdditionalResponsesMultiple.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormContentTypeText.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormContentTypeText.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormContentTypeText.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormContentTypeText.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormHeaderCode.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormHeaderCode.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormHeaderCode.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormHeaderCode.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormHeaderInfo.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormHeaderInfo.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormHeaderInfo.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormHeaderInfo.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormOpReadDuplicate.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormOpReadDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormOpReadDuplicate.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormOpReadDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormOpWriteDuplicate.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormOpWriteDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormOpWriteDuplicate.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormOpWriteDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormOplessAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormOplessWithoutTopicAndNoRootFormReadAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormReadAdditionalResponsesNoTopicAndRootFormReadAllWithoutAdditionalResponses.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormReadWithoutTopicAndNoRootFormReadAll.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormReadWithoutTopicAndNoRootFormReadAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormReadWithoutTopicAndNoRootFormReadAll.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormReadWithoutTopicAndNoRootFormReadAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormReadWithoutTopicWriteWithTopicAndRootFormReadAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormServiceGroup.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormServiceGroup.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormServiceGroup.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormServiceGroup.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormTopicNoContentType.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormTopicNoContentType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormTopicNoContentType.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormTopicNoContentType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormTopicTokenExecutorId.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormTopicTokenExecutorId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormTopicTokenExecutorId.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormTopicTokenExecutorId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormTopicTokenInvokerId.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormTopicTokenInvokerId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormTopicTokenInvokerId.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormTopicTokenInvokerId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndNoReadOnly.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormTopicTokenNoActionWhenNoOpAndReadOnlyFalse.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormTopicTokenNoActionWhenReadAndWrite.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormTopicTokenNoActionWhenReadAndWrite.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormTopicTokenNoActionWhenReadAndWrite.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormTopicTokenNoActionWhenReadAndWrite.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormTopicTokenSenderId.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormTopicTokenSenderId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormTopicTokenSenderId.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormTopicTokenSenderId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormUnsupportedProperty.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormUnsupportedProperty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormWriteAdditionalResponsesNoTopicAndNoRootFormWriteMultiWithoutAdditionalResponses.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormWriteWithoutTopicAndNoRootFormWriteMulti.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormsOpReadDuplicate.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormsOpReadDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormsOpReadDuplicate.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormsOpReadDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormsOpWriteDuplicate.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormsOpWriteDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormsOpWriteDuplicate.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormsOpWriteDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormsOpWriteNoRead.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormsOpWriteNoRead.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormsOpWriteNoRead.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormsOpWriteNoRead.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormsOplessAndRead.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormsOplessAndRead.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormsOplessAndRead.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormsOplessAndRead.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormsOplessDuplicate.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyFormsOplessDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyFormsOplessDuplicate.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyFormsOplessDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyIntegerConst.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyIntegerConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyIntegerConst.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyIntegerConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyNoForms.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyNoForms.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyNoForms.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyNoForms.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyNumberConst.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyNumberConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyNumberConst.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyNumberConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyObjectConst.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyObjectConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyObjectConst.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyObjectConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyObjectErrorMessage.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyObjectErrorMessage.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyObjectErrorMessage.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyObjectErrorMessage.TM.json diff --git a/codegen2/test/thing-models/invalidAioBinding/PropertyRefNotFound.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyRefNotFound.TM.json new file mode 100644 index 0000000000..50d3e0380c --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/PropertyRefNotFound.TM.json @@ -0,0 +1,24 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + "alpha": { + "dtv:ref": "../../schemas/json-schemas/Nonexistent.json", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyStringConst.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyStringConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyStringConst.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyStringConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyTypeNull.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyTypeNull.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyTypeNull.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyTypeNull.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyUnsupportedProperty.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/PropertyUnsupportedProperty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/PropertyUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponseContentTypeEmpty.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormAdditionalResponseContentTypeEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponseContentTypeEmpty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormAdditionalResponseContentTypeEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponseContentTypeText.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormAdditionalResponseContentTypeText.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponseContentTypeText.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormAdditionalResponseContentTypeText.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponseNoSuccess.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormAdditionalResponseNoSuccess.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponseNoSuccess.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormAdditionalResponseNoSuccess.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponseSchema.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormAdditionalResponseSchema.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponseSchema.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormAdditionalResponseSchema.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponseSuccessTrue.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormAdditionalResponseSuccessTrue.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponseSuccessTrue.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormAdditionalResponseSuccessTrue.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponseUnsupportedProperty.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormAdditionalResponseUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponseUnsupportedProperty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormAdditionalResponseUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponsesAndSubAll.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormAdditionalResponsesAndSubAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponsesAndSubAll.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormAdditionalResponsesAndSubAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponsesMultiple.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormAdditionalResponsesMultiple.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormAdditionalResponsesMultiple.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormAdditionalResponsesMultiple.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormContentTypeCustom.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormContentTypeCustom.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormContentTypeCustom.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormContentTypeCustom.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormContentTypeRaw.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormContentTypeRaw.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormContentTypeRaw.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormContentTypeRaw.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormContentTypeText.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormContentTypeText.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormContentTypeText.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormContentTypeText.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormHeaderCode.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormHeaderCode.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormHeaderCode.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormHeaderCode.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormHeaderInfo.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormHeaderInfo.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormHeaderInfo.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormHeaderInfo.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormNoContentType.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormNoContentType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormNoContentType.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormNoContentType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormNoTopic.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormNoTopic.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormNoTopic.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormNoTopic.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormOpReadAllAndSubAll.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormOpReadAllAndSubAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormOpReadAllAndSubAll.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormOpReadAllAndSubAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormOpReadAllDuplicate.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormOpReadAllDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormOpReadAllDuplicate.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormOpReadAllDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormOpSubAllDuplicate.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormOpSubAllDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormOpSubAllDuplicate.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormOpSubAllDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormOpWiteMultiAndSubAll.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormOpWiteMultiAndSubAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormOpWiteMultiAndSubAll.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormOpWiteMultiAndSubAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormOpWriteMultiDuplicate.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormOpWriteMultiDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormOpWriteMultiDuplicate.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormOpWriteMultiDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormReadAllButNoProperties.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormReadAllButNoProperties.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormReadAllButNoProperties.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormReadAllButNoProperties.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormServiceGroupEmpty.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormServiceGroupEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormServiceGroupEmpty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormServiceGroupEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormServiceGroupNoSubAll.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormServiceGroupNoSubAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormServiceGroupNoSubAll.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormServiceGroupNoSubAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormSubAllButNoEvents.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormSubAllButNoEvents.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormSubAllButNoEvents.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormSubAllButNoEvents.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicEmpty.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormTopicEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicEmpty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormTopicEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicLevelEmpty.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormTopicLevelEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicLevelEmpty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormTopicLevelEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicLevelInvalid.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormTopicLevelInvalid.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicLevelInvalid.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormTopicLevelInvalid.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicReservedStart.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormTopicReservedStart.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicReservedStart.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormTopicReservedStart.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenActionWhenSubAll.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormTopicTokenActionWhenSubAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenActionWhenSubAll.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormTopicTokenActionWhenSubAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenConsumerIdWhenSubAll.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormTopicTokenConsumerIdWhenSubAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenConsumerIdWhenSubAll.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormTopicTokenConsumerIdWhenSubAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenCustomEmpty.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormTopicTokenCustomEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenCustomEmpty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormTopicTokenCustomEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenCustomInvalid.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormTopicTokenCustomInvalid.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenCustomInvalid.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormTopicTokenCustomInvalid.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenEmpty.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormTopicTokenEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenEmpty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormTopicTokenEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenExecutorId.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormTopicTokenExecutorId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenExecutorId.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormTopicTokenExecutorId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenInvokerId.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormTopicTokenInvokerId.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenInvokerId.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormTopicTokenInvokerId.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenMaintainerIdWhenSubAll.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormTopicTokenMaintainerIdWhenSubAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenMaintainerIdWhenSubAll.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormTopicTokenMaintainerIdWhenSubAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormTopicTokenNoActionWhenReadAllAndWriteMulti.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenSenderIdWhenReadAll.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormTopicTokenSenderIdWhenReadAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenSenderIdWhenReadAll.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormTopicTokenSenderIdWhenReadAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenSenderIdWhenWriteMulti.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormTopicTokenSenderIdWhenWriteMulti.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenSenderIdWhenWriteMulti.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormTopicTokenSenderIdWhenWriteMulti.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenUnrecognized.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormTopicTokenUnrecognized.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormTopicTokenUnrecognized.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormTopicTokenUnrecognized.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormWriteMultiButNoWritableProperties.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormWriteMultiButNoWritableProperties.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormWriteMultiButNoWritableProperties.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormWriteMultiButNoWritableProperties.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormsOpReadAllDuplicate.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormsOpReadAllDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormsOpReadAllDuplicate.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormsOpReadAllDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormsOpSubAllDuplicate.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormsOpSubAllDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormsOpSubAllDuplicate.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormsOpSubAllDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormsOpWriteMultiDuplicate.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormsOpWriteMultiDuplicate.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormsOpWriteMultiDuplicate.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormsOpWriteMultiDuplicate.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormsOpWriteMultiNoReadAll.TM.json b/codegen2/test/thing-models/invalidAioBinding/RootFormsOpWriteMultiNoReadAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/RootFormsOpWriteMultiNoReadAll.TM.json rename to codegen2/test/thing-models/invalidAioBinding/RootFormsOpWriteMultiNoReadAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionArrayConst.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionArrayConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionArrayConst.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionArrayConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsNoType.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsNoType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsNoType.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsNoType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsObjectConst.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsObjectConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsObjectConst.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsObjectConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsRef.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsRef.TM.json similarity index 88% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsRef.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsRef.TM.json index f7f3025648..d5989e4371 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsRef.TM.json +++ b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsRef.TM.json @@ -9,7 +9,7 @@ "someSchema": { "type": "array", "items": { - "dtv:ref": "../../json-schemas/AnObjectSchema.json" + "dtv:ref": "../../schemas/json-schemas/AnObjectSchema.json" } } }, diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsStringConst.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsStringConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsStringConst.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsStringConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsTypeNull.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsTypeNull.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsTypeNull.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionArrayItemsTypeNull.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionArrayNoItems.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionArrayNoItems.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionArrayNoItems.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionArrayNoItems.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionBooleanConstValueNotBoolean.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionBooleanConstValueNotBoolean.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionBooleanConstValueNotBoolean.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionBooleanConstValueNotBoolean.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionBooleanReadOnly.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionBooleanReadOnly.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionBooleanReadOnly.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionBooleanReadOnly.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionBooleanUnsupportedProperty.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionBooleanUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionBooleanUnsupportedProperty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionBooleanUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerConstValueAboveMax.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionIntegerConstValueAboveMax.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerConstValueAboveMax.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionIntegerConstValueAboveMax.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerConstValueBelowMin.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionIntegerConstValueBelowMin.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerConstValueBelowMin.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionIntegerConstValueBelowMin.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerConstValueNotInteger.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionIntegerConstValueNotInteger.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerConstValueNotInteger.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionIntegerConstValueNotInteger.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerConstValueNotNumeric.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionIntegerConstValueNotNumeric.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerConstValueNotNumeric.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionIntegerConstValueNotNumeric.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerMaxNotInteger.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionIntegerMaxNotInteger.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerMaxNotInteger.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionIntegerMaxNotInteger.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerMinAboveMax.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionIntegerMinAboveMax.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerMinAboveMax.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionIntegerMinAboveMax.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerMinNotInteger.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionIntegerMinNotInteger.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerMinNotInteger.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionIntegerMinNotInteger.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerReadOnly.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionIntegerReadOnly.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerReadOnly.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionIntegerReadOnly.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerUnsupportedProperty.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionIntegerUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionIntegerUnsupportedProperty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionIntegerUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesNoType.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesNoType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesNoType.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesNoType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesObjectConst.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesObjectConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesObjectConst.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesObjectConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TM.json similarity index 88% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TM.json index 4597a7173e..39309a9f74 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TM.json +++ b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesRef.TM.json @@ -9,7 +9,7 @@ "someSchema": { "type": "object", "dtv:additionalProperties": { - "dtv:ref": "../../json-schemas/AnObjectSchema.json" + "dtv:ref": "../../schemas/json-schemas/AnObjectSchema.json" } } }, diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesStringConst.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesStringConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesStringConst.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesStringConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesTypeNull.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesTypeNull.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesTypeNull.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionMapAdditionalPropertiesTypeNull.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionMapConst.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionMapConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionMapConst.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionMapConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionNoType.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionNoType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionNoType.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionNoType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionNumberConstValueAboveMax.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionNumberConstValueAboveMax.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionNumberConstValueAboveMax.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionNumberConstValueAboveMax.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionNumberConstValueBelowMin.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionNumberConstValueBelowMin.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionNumberConstValueBelowMin.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionNumberConstValueBelowMin.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionNumberConstValueNotNumeric.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionNumberConstValueNotNumeric.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionNumberConstValueNotNumeric.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionNumberConstValueNotNumeric.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionNumberMinAboveMax.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionNumberMinAboveMax.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionNumberMinAboveMax.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionNumberMinAboveMax.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionNumberReadOnly.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionNumberReadOnly.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionNumberReadOnly.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionNumberReadOnly.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionNumberUnsupportedProperty.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionNumberUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionNumberUnsupportedProperty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionNumberUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectBothDeterminants.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectBothDeterminants.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectBothDeterminants.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectBothDeterminants.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstNotObject.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstNotObject.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstNotObject.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstNotObject.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanConst.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanConst.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanNotBoolean.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyBooleanUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerAboveMax.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerAboveMax.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerAboveMax.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerAboveMax.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerBelowMin.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerBelowMin.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerBelowMin.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerBelowMin.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerConst.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerConst.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotInteger.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotInteger.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotInteger.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotInteger.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerNotNumeric.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyIntegerUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoType.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoType.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoValue.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoValue.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoValue.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNoValue.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberAboveMax.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberAboveMax.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberAboveMax.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberAboveMax.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberBelowMin.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberBelowMin.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberBelowMin.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberBelowMin.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberConst.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberConst.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberNotNumeric.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberNotNumeric.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberNotNumeric.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberNotNumeric.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyNumberUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringConst.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringConst.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringValueNotString.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringValueNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringValueNotString.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyStringValueNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeArray.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeArray.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeArray.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeArray.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeNull.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeNull.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeNull.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeNull.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeObject.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeObject.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeObject.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstPropertyTypeObject.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstUnsupportedProperty.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstUnsupportedProperty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstValueNoSchema.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstValueNoSchema.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectConstValueNoSchema.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectConstValueNoSchema.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectErrorMessageNoProperty.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectErrorMessageNoProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectErrorMessageNoProperty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectErrorMessageNoProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectErrorMessageNotString.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectErrorMessageNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectErrorMessageNotString.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectErrorMessageNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectErrorMessagePropertyNotString.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectErrorMessagePropertyNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectErrorMessagePropertyNotString.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectErrorMessagePropertyNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectNoDeterminant.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectNoDeterminant.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectNoDeterminant.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectNoDeterminant.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertiesNotObject.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertiesNotObject.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertiesNotObject.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertiesNotObject.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyNoType.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyNoType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyNoType.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyNoType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyObjectConst.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyObjectConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyObjectConst.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyObjectConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyRef.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyRef.TM.json similarity index 88% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyRef.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyRef.TM.json index 1f81951e42..93de32a1a0 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyRef.TM.json +++ b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyRef.TM.json @@ -10,7 +10,7 @@ "type": "object", "properties": { "foo": { - "dtv:ref": "../../json-schemas/AnObjectSchema.json" + "dtv:ref": "../../schemas/json-schemas/AnObjectSchema.json" } } } diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyStringConst.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyStringConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyStringConst.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyStringConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyTypeNull.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyTypeNull.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyTypeNull.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectPropertyTypeNull.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectRequiredNoProperty.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectRequiredNoProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionObjectRequiredNoProperty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionObjectRequiredNoProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionRef.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionRef.TM.json similarity index 87% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionRef.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionRef.TM.json index 4d603d71f8..511769c054 100644 --- a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionRef.TM.json +++ b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionRef.TM.json @@ -7,7 +7,7 @@ "title": "Noop", "schemaDefinitions": { "someSchema": { - "dtv:ref": "../../json-schemas/AnObjectSchema.json" + "dtv:ref": "../../schemas/json-schemas/AnObjectSchema.json" } }, "actions": { diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringConstContentEncoding.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringConstContentEncoding.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringConstContentEncoding.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringConstContentEncoding.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringConstFormat.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringConstFormat.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringConstFormat.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringConstFormat.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringConstPattern.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringConstPattern.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringConstPattern.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringConstPattern.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringConstUnsupportedProperty.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringConstUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringConstUnsupportedProperty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringConstUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringConstValueNotString.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringConstValueNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringConstValueNotString.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringConstValueNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringContentEncodingUnsupportedValue.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringContentEncodingUnsupportedValue.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringContentEncodingUnsupportedValue.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringContentEncodingUnsupportedValue.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringEnumConst.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringEnumConst.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringEnumConst.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringEnumConst.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringEnumContentEncoding.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringEnumContentEncoding.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringEnumContentEncoding.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringEnumContentEncoding.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringEnumElementInvalid.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringEnumElementInvalid.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringEnumElementInvalid.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringEnumElementInvalid.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringEnumFormat.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringEnumFormat.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringEnumFormat.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringEnumFormat.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringEnumPattern.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringEnumPattern.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringEnumPattern.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringEnumPattern.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringEnumReadOnly.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringEnumReadOnly.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringEnumReadOnly.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringEnumReadOnly.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringEnumUnsupportedProperty.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringEnumUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringEnumUnsupportedProperty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringEnumUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringFormatAndContentEncoding.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringFormatAndContentEncoding.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringFormatAndContentEncoding.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringFormatAndContentEncoding.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringFormatAndPattern.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringFormatAndPattern.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringFormatAndPattern.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringFormatAndPattern.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringFormatUnsupportedValue.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringFormatUnsupportedValue.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringFormatUnsupportedValue.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringFormatUnsupportedValue.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringPatternAndContentEncoding.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringPatternAndContentEncoding.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringPatternAndContentEncoding.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringPatternAndContentEncoding.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringPatternNotDurationOrDecimal.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringPatternNotDurationOrDecimal.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringPatternNotDurationOrDecimal.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringPatternNotDurationOrDecimal.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringPatternRegexInvalid.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringPatternRegexInvalid.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringPatternRegexInvalid.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringPatternRegexInvalid.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringReadOnly.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringReadOnly.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringReadOnly.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringReadOnly.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringUnsupportedProperty.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionStringUnsupportedProperty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionStringUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionTypeNull.TM.json b/codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionTypeNull.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/SchemaDefinitionTypeNull.TM.json rename to codegen2/test/thing-models/invalidAioBinding/SchemaDefinitionTypeNull.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ThingUnsupportedProperty.TM.json b/codegen2/test/thing-models/invalidAioBinding/ThingUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/ThingUnsupportedProperty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/ThingUnsupportedProperty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/TitleEmpty.TM.json b/codegen2/test/thing-models/invalidAioBinding/TitleEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/TitleEmpty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/TitleEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/TitleInvalid.TM.json b/codegen2/test/thing-models/invalidAioBinding/TitleInvalid.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidAioBinding/TitleInvalid.TM.json rename to codegen2/test/thing-models/invalidAioBinding/TitleInvalid.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/ArrayKey.TM.json b/codegen2/test/thing-models/invalidJson/ArrayKey.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/ArrayKey.TM.json rename to codegen2/test/thing-models/invalidJson/ArrayKey.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/BooleanKey.TM.json b/codegen2/test/thing-models/invalidJson/BooleanKey.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/BooleanKey.TM.json rename to codegen2/test/thing-models/invalidJson/BooleanKey.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/DuplicateKey.TM.json b/codegen2/test/thing-models/invalidJson/DuplicateKey.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/DuplicateKey.TM.json rename to codegen2/test/thing-models/invalidJson/DuplicateKey.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/MissingColon.TM.json b/codegen2/test/thing-models/invalidJson/MissingColon.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/MissingColon.TM.json rename to codegen2/test/thing-models/invalidJson/MissingColon.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/MissingComma.TM.json b/codegen2/test/thing-models/invalidJson/MissingComma.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/MissingComma.TM.json rename to codegen2/test/thing-models/invalidJson/MissingComma.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/MissingElement.TM.json b/codegen2/test/thing-models/invalidJson/MissingElement.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/MissingElement.TM.json rename to codegen2/test/thing-models/invalidJson/MissingElement.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/MissingKey.TM.json b/codegen2/test/thing-models/invalidJson/MissingKey.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/MissingKey.TM.json rename to codegen2/test/thing-models/invalidJson/MissingKey.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/MissingValue.TM.json b/codegen2/test/thing-models/invalidJson/MissingValue.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/MissingValue.TM.json rename to codegen2/test/thing-models/invalidJson/MissingValue.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/NumericKey.TM.json b/codegen2/test/thing-models/invalidJson/NumericKey.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/NumericKey.TM.json rename to codegen2/test/thing-models/invalidJson/NumericKey.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/ObjectKey.TM.json b/codegen2/test/thing-models/invalidJson/ObjectKey.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/ObjectKey.TM.json rename to codegen2/test/thing-models/invalidJson/ObjectKey.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/TrailingComma.TM.json b/codegen2/test/thing-models/invalidJson/TrailingComma.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/TrailingComma.TM.json rename to codegen2/test/thing-models/invalidJson/TrailingComma.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/UnclosedArray.TM.json b/codegen2/test/thing-models/invalidJson/UnclosedArray.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/UnclosedArray.TM.json rename to codegen2/test/thing-models/invalidJson/UnclosedArray.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/UnclosedObject.TM.json b/codegen2/test/thing-models/invalidJson/UnclosedObject.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidJson/UnclosedObject.TM.json rename to codegen2/test/thing-models/invalidJson/UnclosedObject.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/ActionFormOpRead.TM.json b/codegen2/test/thing-models/invalidThing/ActionFormOpRead.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/ActionFormOpRead.TM.json rename to codegen2/test/thing-models/invalidThing/ActionFormOpRead.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/ActionFormOpSub.TM.json b/codegen2/test/thing-models/invalidThing/ActionFormOpSub.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/ActionFormOpSub.TM.json rename to codegen2/test/thing-models/invalidThing/ActionFormOpSub.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/ActionFormOpWrite.TM.json b/codegen2/test/thing-models/invalidThing/ActionFormOpWrite.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/ActionFormOpWrite.TM.json rename to codegen2/test/thing-models/invalidThing/ActionFormOpWrite.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/ActionFormsEmpty.TM.json b/codegen2/test/thing-models/invalidThing/ActionFormsEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/ActionFormsEmpty.TM.json rename to codegen2/test/thing-models/invalidThing/ActionFormsEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/ContextMissingWot.TM.json b/codegen2/test/thing-models/invalidThing/ContextMissingWot.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/ContextMissingWot.TM.json rename to codegen2/test/thing-models/invalidThing/ContextMissingWot.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/ContextWrongType.TM.json b/codegen2/test/thing-models/invalidThing/ContextWrongType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/ContextWrongType.TM.json rename to codegen2/test/thing-models/invalidThing/ContextWrongType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/EventFormOpInvoke.TM.json b/codegen2/test/thing-models/invalidThing/EventFormOpInvoke.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/EventFormOpInvoke.TM.json rename to codegen2/test/thing-models/invalidThing/EventFormOpInvoke.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/EventFormOpRead.TM.json b/codegen2/test/thing-models/invalidThing/EventFormOpRead.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/EventFormOpRead.TM.json rename to codegen2/test/thing-models/invalidThing/EventFormOpRead.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/EventFormOpSubAll.TM.json b/codegen2/test/thing-models/invalidThing/EventFormOpSubAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/EventFormOpSubAll.TM.json rename to codegen2/test/thing-models/invalidThing/EventFormOpSubAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/EventFormOpWrite.TM.json b/codegen2/test/thing-models/invalidThing/EventFormOpWrite.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/EventFormOpWrite.TM.json rename to codegen2/test/thing-models/invalidThing/EventFormOpWrite.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/EventFormsEmpty.TM.json b/codegen2/test/thing-models/invalidThing/EventFormsEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/EventFormsEmpty.TM.json rename to codegen2/test/thing-models/invalidThing/EventFormsEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/NoContext.TM.json b/codegen2/test/thing-models/invalidThing/NoContext.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/NoContext.TM.json rename to codegen2/test/thing-models/invalidThing/NoContext.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/NoType.TM.json b/codegen2/test/thing-models/invalidThing/NoType.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/NoType.TM.json rename to codegen2/test/thing-models/invalidThing/NoType.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/PropertyFormOpInvoke.TM.json b/codegen2/test/thing-models/invalidThing/PropertyFormOpInvoke.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/PropertyFormOpInvoke.TM.json rename to codegen2/test/thing-models/invalidThing/PropertyFormOpInvoke.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/PropertyFormOpReadAll.TM.json b/codegen2/test/thing-models/invalidThing/PropertyFormOpReadAll.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/PropertyFormOpReadAll.TM.json rename to codegen2/test/thing-models/invalidThing/PropertyFormOpReadAll.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/PropertyFormOpSub.TM.json b/codegen2/test/thing-models/invalidThing/PropertyFormOpSub.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/PropertyFormOpSub.TM.json rename to codegen2/test/thing-models/invalidThing/PropertyFormOpSub.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/PropertyFormOpWriteMulti.TM.json b/codegen2/test/thing-models/invalidThing/PropertyFormOpWriteMulti.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/PropertyFormOpWriteMulti.TM.json rename to codegen2/test/thing-models/invalidThing/PropertyFormOpWriteMulti.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/PropertyFormsEmpty.TM.json b/codegen2/test/thing-models/invalidThing/PropertyFormsEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/PropertyFormsEmpty.TM.json rename to codegen2/test/thing-models/invalidThing/PropertyFormsEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormNoOp.TM.json b/codegen2/test/thing-models/invalidThing/RootFormNoOp.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormNoOp.TM.json rename to codegen2/test/thing-models/invalidThing/RootFormNoOp.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormOpArrayEmpty.TM.json b/codegen2/test/thing-models/invalidThing/RootFormOpArrayEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormOpArrayEmpty.TM.json rename to codegen2/test/thing-models/invalidThing/RootFormOpArrayEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormOpElementEmpty.TM.json b/codegen2/test/thing-models/invalidThing/RootFormOpElementEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormOpElementEmpty.TM.json rename to codegen2/test/thing-models/invalidThing/RootFormOpElementEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormOpEmpty.TM.json b/codegen2/test/thing-models/invalidThing/RootFormOpEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormOpEmpty.TM.json rename to codegen2/test/thing-models/invalidThing/RootFormOpEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormOpReadOne.TM.json b/codegen2/test/thing-models/invalidThing/RootFormOpReadOne.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormOpReadOne.TM.json rename to codegen2/test/thing-models/invalidThing/RootFormOpReadOne.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormOpSubOne.TM.json b/codegen2/test/thing-models/invalidThing/RootFormOpSubOne.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormOpSubOne.TM.json rename to codegen2/test/thing-models/invalidThing/RootFormOpSubOne.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormOpWriteOne.TM.json b/codegen2/test/thing-models/invalidThing/RootFormOpWriteOne.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormOpWriteOne.TM.json rename to codegen2/test/thing-models/invalidThing/RootFormOpWriteOne.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormsEmpty.TM.json b/codegen2/test/thing-models/invalidThing/RootFormsEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/RootFormsEmpty.TM.json rename to codegen2/test/thing-models/invalidThing/RootFormsEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionArrayItemsNotObject.TM.json b/codegen2/test/thing-models/invalidThing/SchemaDefinitionArrayItemsNotObject.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionArrayItemsNotObject.TM.json rename to codegen2/test/thing-models/invalidThing/SchemaDefinitionArrayItemsNotObject.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionArrayItemsTypeNotString.TM.json b/codegen2/test/thing-models/invalidThing/SchemaDefinitionArrayItemsTypeNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionArrayItemsTypeNotString.TM.json rename to codegen2/test/thing-models/invalidThing/SchemaDefinitionArrayItemsTypeNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionArrayItemsTypeUnsupported.TM.json b/codegen2/test/thing-models/invalidThing/SchemaDefinitionArrayItemsTypeUnsupported.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionArrayItemsTypeUnsupported.TM.json rename to codegen2/test/thing-models/invalidThing/SchemaDefinitionArrayItemsTypeUnsupported.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionIntegerMaxNotNumeric.TM.json b/codegen2/test/thing-models/invalidThing/SchemaDefinitionIntegerMaxNotNumeric.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionIntegerMaxNotNumeric.TM.json rename to codegen2/test/thing-models/invalidThing/SchemaDefinitionIntegerMaxNotNumeric.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionIntegerMinNotNumeric.TM.json b/codegen2/test/thing-models/invalidThing/SchemaDefinitionIntegerMinNotNumeric.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionIntegerMinNotNumeric.TM.json rename to codegen2/test/thing-models/invalidThing/SchemaDefinitionIntegerMinNotNumeric.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionMapAdditionalPropertiesNotObject.TM.json b/codegen2/test/thing-models/invalidThing/SchemaDefinitionMapAdditionalPropertiesNotObject.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionMapAdditionalPropertiesNotObject.TM.json rename to codegen2/test/thing-models/invalidThing/SchemaDefinitionMapAdditionalPropertiesNotObject.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeNotString.TM.json b/codegen2/test/thing-models/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeNotString.TM.json rename to codegen2/test/thing-models/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TM.json b/codegen2/test/thing-models/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TM.json rename to codegen2/test/thing-models/invalidThing/SchemaDefinitionMapAdditionalPropertiesTypeUnsupported.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionNumberMaxNotNumeric.TM.json b/codegen2/test/thing-models/invalidThing/SchemaDefinitionNumberMaxNotNumeric.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionNumberMaxNotNumeric.TM.json rename to codegen2/test/thing-models/invalidThing/SchemaDefinitionNumberMaxNotNumeric.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionNumberMinNotNumeric.TM.json b/codegen2/test/thing-models/invalidThing/SchemaDefinitionNumberMinNotNumeric.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionNumberMinNotNumeric.TM.json rename to codegen2/test/thing-models/invalidThing/SchemaDefinitionNumberMinNotNumeric.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionObjectConstPropertyTypeUnsupported.TM.json b/codegen2/test/thing-models/invalidThing/SchemaDefinitionObjectConstPropertyTypeUnsupported.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionObjectConstPropertyTypeUnsupported.TM.json rename to codegen2/test/thing-models/invalidThing/SchemaDefinitionObjectConstPropertyTypeUnsupported.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionObjectPropertyTypeNotString.TM.json b/codegen2/test/thing-models/invalidThing/SchemaDefinitionObjectPropertyTypeNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionObjectPropertyTypeNotString.TM.json rename to codegen2/test/thing-models/invalidThing/SchemaDefinitionObjectPropertyTypeNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionObjectPropertyTypeUnsupported.TM.json b/codegen2/test/thing-models/invalidThing/SchemaDefinitionObjectPropertyTypeUnsupported.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionObjectPropertyTypeUnsupported.TM.json rename to codegen2/test/thing-models/invalidThing/SchemaDefinitionObjectPropertyTypeUnsupported.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionObjectRequiredNotString.TM.json b/codegen2/test/thing-models/invalidThing/SchemaDefinitionObjectRequiredNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionObjectRequiredNotString.TM.json rename to codegen2/test/thing-models/invalidThing/SchemaDefinitionObjectRequiredNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionStringContentEncodingNotString.TM.json b/codegen2/test/thing-models/invalidThing/SchemaDefinitionStringContentEncodingNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionStringContentEncodingNotString.TM.json rename to codegen2/test/thing-models/invalidThing/SchemaDefinitionStringContentEncodingNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionStringFormatNotString.TM.json b/codegen2/test/thing-models/invalidThing/SchemaDefinitionStringFormatNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionStringFormatNotString.TM.json rename to codegen2/test/thing-models/invalidThing/SchemaDefinitionStringFormatNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionStringPatternNotString.TM.json b/codegen2/test/thing-models/invalidThing/SchemaDefinitionStringPatternNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionStringPatternNotString.TM.json rename to codegen2/test/thing-models/invalidThing/SchemaDefinitionStringPatternNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionTypeNotString.TM.json b/codegen2/test/thing-models/invalidThing/SchemaDefinitionTypeNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionTypeNotString.TM.json rename to codegen2/test/thing-models/invalidThing/SchemaDefinitionTypeNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionTypeUnsupported.TM.json b/codegen2/test/thing-models/invalidThing/SchemaDefinitionTypeUnsupported.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/SchemaDefinitionTypeUnsupported.TM.json rename to codegen2/test/thing-models/invalidThing/SchemaDefinitionTypeUnsupported.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/TitleNotString.TM.json b/codegen2/test/thing-models/invalidThing/TitleNotString.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/TitleNotString.TM.json rename to codegen2/test/thing-models/invalidThing/TitleNotString.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/TypeEmpty.TM.json b/codegen2/test/thing-models/invalidThing/TypeEmpty.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/TypeEmpty.TM.json rename to codegen2/test/thing-models/invalidThing/TypeEmpty.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/TypeNotThingModel.TM.json b/codegen2/test/thing-models/invalidThing/TypeNotThingModel.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/invalidThing/TypeNotThingModel.TM.json rename to codegen2/test/thing-models/invalidThing/TypeNotThingModel.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/valid/LinkExtends.TM.json b/codegen2/test/thing-models/valid/LinkExtends.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/valid/LinkExtends.TM.json rename to codegen2/test/thing-models/valid/LinkExtends.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/valid/LinkNoRel.TM.json b/codegen2/test/thing-models/valid/LinkNoRel.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/valid/LinkNoRel.TM.json rename to codegen2/test/thing-models/valid/LinkNoRel.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/valid/LinkOtherRel.TM.json b/codegen2/test/thing-models/valid/LinkOtherRel.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/valid/LinkOtherRel.TM.json rename to codegen2/test/thing-models/valid/LinkOtherRel.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/valid/Noop.TM.json b/codegen2/test/thing-models/valid/Noop.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/valid/Noop.TM.json rename to codegen2/test/thing-models/valid/Noop.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/valid/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TM.json b/codegen2/test/thing-models/valid/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/valid/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TM.json rename to codegen2/test/thing-models/valid/RootFormReadAllWithAdditionalResponsesButNoReadablePropertyAdditionalResponses.TM.json diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/valid/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TM.json b/codegen2/test/thing-models/valid/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TM.json similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/thing-models/valid/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TM.json rename to codegen2/test/thing-models/valid/RootFormWriteMultiWithAdditionalResponsesButNoWritablePropertyAdditionalResponses.TM.json diff --git a/codegen2/test/thing-models/valid/ThingOneNamedMyThing.TM.json b/codegen2/test/thing-models/valid/ThingOneNamedMyThing.TM.json new file mode 100644 index 0000000000..5ebd092023 --- /dev/null +++ b/codegen2/test/thing-models/valid/ThingOneNamedMyThing.TM.json @@ -0,0 +1,22 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "MyThing", + "events": { + "alpha": { + "data": { + "type": "string" + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry1", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/thing-models/valid/ThingOneWithGeneratedNameMyPropSchema.TM.json b/codegen2/test/thing-models/valid/ThingOneWithGeneratedNameMyPropSchema.TM.json new file mode 100644 index 0000000000..b966a4fef8 --- /dev/null +++ b/codegen2/test/thing-models/valid/ThingOneWithGeneratedNameMyPropSchema.TM.json @@ -0,0 +1,28 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "ThingOne", + "events": { + "alpha": { + "data": { + "title": "MyPropSchema", + "type": "object", + "properties": { + "myVal": { + "type": "string" + } + } + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry1", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/thing-models/valid/ThingTwoNamedMyThing.TM.json b/codegen2/test/thing-models/valid/ThingTwoNamedMyThing.TM.json new file mode 100644 index 0000000000..54a4f2cc95 --- /dev/null +++ b/codegen2/test/thing-models/valid/ThingTwoNamedMyThing.TM.json @@ -0,0 +1,22 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "MyThing", + "events": { + "beta": { + "data": { + "type": "string" + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry2", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/thing-models/valid/ThingTwoWithGeneratedNameMyPropSchema.TM.json b/codegen2/test/thing-models/valid/ThingTwoWithGeneratedNameMyPropSchema.TM.json new file mode 100644 index 0000000000..b87630900b --- /dev/null +++ b/codegen2/test/thing-models/valid/ThingTwoWithGeneratedNameMyPropSchema.TM.json @@ -0,0 +1,28 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "ThingTwo", + "events": { + "beta": { + "data": { + "title": "MyPropSchema", + "type": "object", + "properties": { + "myVal": { + "type": "string" + } + } + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/{senderId}/telemetry2", + "op": "subscribeevent" + } + ] + } + } +} From f1d1c5c952f000dedd997f587317aa47da5ef08d Mon Sep 17 00:00:00 2001 From: "John (JD) Douceur" Date: Fri, 16 Jan 2026 09:46:21 -0800 Subject: [PATCH 40/52] eval cleanup --- codegen2/eval/conv.sh | 2 +- codegen2/eval/dg.sh | 29 --------------- codegen2/eval/dg0.sh | 37 ------------------- codegen2/eval/g1.sh | 9 ----- codegen2/eval/g2.sh | 9 ----- codegen2/eval/gen.sh | 36 +++++++++--------- codegen2/eval/gen0.sh | 36 +++++++++--------- ....TD.json => CommandComplexSchemas.TM.json} | 13 +------ ...riants.TD.json => CommandVariants.TM.json} | 16 +------- ...tion.TD.json => CounterCollection.TM.json} | 14 +------ ...chemas.TD.json => ExternalSchemas.TM.json} | 30 ++++----------- ...arate.TD.json => PropertySeparate.TM.json} | 22 +---------- ...ether.TD.json => PropertyTogether.TM.json} | 24 +----------- ...nd.TD.json => TelemetryAndCommand.TM.json} | 14 +------ ...D.json => TelemetryComplexSchemas.TM.json} | 20 +--------- ...json => TelemetryPrimitiveSchemas.TM.json} | 24 +----------- .../{TwoThings.TD.json => TwoThings.TM.json} | 30 ++------------- .../Dtdl2Wot/Interface/t4/InterfaceThing.tt | 4 +- 18 files changed, 65 insertions(+), 304 deletions(-) delete mode 100644 codegen2/eval/dg.sh delete mode 100644 codegen2/eval/dg0.sh delete mode 100644 codegen2/eval/g1.sh delete mode 100644 codegen2/eval/g2.sh rename codegen2/eval/wot/{CommandComplexSchemas.TD.json => CommandComplexSchemas.TM.json} (90%) rename codegen2/eval/wot/{CommandVariants.TD.json => CommandVariants.TM.json} (81%) rename codegen2/eval/wot/{CounterCollection.TD.json => CounterCollection.TM.json} (90%) rename codegen2/eval/wot/{ExternalSchemas.TD.json => ExternalSchemas.TM.json} (73%) rename codegen2/eval/wot/{PropertySeparate.TD.json => PropertySeparate.TM.json} (84%) rename codegen2/eval/wot/{PropertyTogether.TD.json => PropertyTogether.TM.json} (80%) rename codegen2/eval/wot/{TelemetryAndCommand.TD.json => TelemetryAndCommand.TM.json} (81%) rename codegen2/eval/wot/{TelemetryComplexSchemas.TD.json => TelemetryComplexSchemas.TM.json} (78%) rename codegen2/eval/wot/{TelemetryPrimitiveSchemas.TD.json => TelemetryPrimitiveSchemas.TM.json} (77%) rename codegen2/eval/wot/{TwoThings.TD.json => TwoThings.TM.json} (71%) diff --git a/codegen2/eval/conv.sh b/codegen2/eval/conv.sh index 1920053598..8427a66b31 100644 --- a/codegen2/eval/conv.sh +++ b/codegen2/eval/conv.sh @@ -16,6 +16,6 @@ $conv ./dtdl/test/TelemetryAndCommand.json ./conv $conv ./dtdl/test/TelemetryComplexSchemas.json ./conv -$conv ./dtdl/test/TelemetryPrimitiveSchemas.json ./conv +$conv ./dtdl/test/TelemetryPrimitiveSchemas.json ./conv ./dtdl/test/resolver.json $conv ./dtdl/test/TelemetryRawSeparate.json ./conv diff --git a/codegen2/eval/dg.sh b/codegen2/eval/dg.sh deleted file mode 100644 index 901691038a..0000000000 --- a/codegen2/eval/dg.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh - -# odd ../../codegen/test/samples/dotnet/CommandComplexSchemasSample dotnet/CommandComplexSchemasSample & - -# odd ../../codegen/test/samples/rust/CommandComplexSchemasSample/command_complex_schemas_gen/src rust/command_complex_schemas_gen/src & - -# odd ../../codegen/test/samples/dotnet/CommandVariantsSample dotnet/CommandVariantsSample & - -# odd ../../codegen/test/samples/rust/CommandVariantsSample/command_variants_gen/src rust/command_variants_gen/src & - -# odd ../../codegen/demo/dotnet/ProtocolCompiler.Demo/Counters dotnet/Counters & - -# odd ../../codegen/demo/rust/protocol_compiler_demo/counters/src rust/counters/src & - -# odd ../../codegen/test/samples/dotnet/TelemetryComplexSchemasSample dotnet/TelemetryComplexSchemasSample & - -# odd ../../codegen/test/samples/rust/TelemetryComplexSchemasSample/telemetry_complex_schemas_gen/src rust/telemetry_complex_schemas_gen/src & - -# odd ../../codegen/test/samples/dotnet/TelemetryPrimitiveSchemasSample dotnet/TelemetryPrimitiveSchemasSample & - -# odd ../../codegen/test/samples/rust/TelemetryPrimitiveSchemasSample/telemetry_primitive_schemas_gen/src rust/telemetry_primitive_schemas_gen/src & - -# odd ../../codegen/test/samples/dotnet/PropertySeparateSample dotnet/PropertySeparateSample & - -# odd ../../codegen/test/samples/rust/PropertySeparateSample/property_separate_gen/src rust/property_separate_gen/src & - -odd ../../codegen/test/samples/dotnet/PropertyTogetherSample dotnet/PropertyTogetherSample & - -odd ../../codegen/test/samples/rust/PropertyTogetherSample/property_together_gen/src rust/property_together_gen/src & diff --git a/codegen2/eval/dg0.sh b/codegen2/eval/dg0.sh deleted file mode 100644 index fa12a26ab0..0000000000 --- a/codegen2/eval/dg0.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/sh - -odd ../../codegen/test/samples/dotnet/CommandComplexSchemasSample dotnet/CommandComplexSchemasSample & - -# odd ../../codegen/test/samples/rust/CommandComplexSchemasSample/command_complex_schemas_gen/src rust/command_complex_schemas_gen/src & - -# odd ../../codegen/test/samples/dotnet/CommandRawSample dotnet/CommandRawSample & - -# odd ../../codegen/test/samples/rust/CommandRawSample/command_raw_gen/src rust/command_raw_gen/src & - -# odd ../../codegen/test/samples/dotnet/CommandVariantsSample dotnet/CommandVariantsSample & - -# odd ../../codegen/test/samples/rust/CommandVariantsSample/command_variants_gen/src rust/command_variants_gen/src & - -odd ../../codegen/test/samples/dotnet/PropertySeparateSample dotnet/PropertySeparateSample & - -# odd ../../codegen/test/samples/rust/PropertySeparateSample/property_separate_gen/src rust/property_separate_gen/src & - -odd ../../codegen/test/samples/dotnet/PropertyTogetherSample dotnet/PropertyTogetherSample & - -# odd ../../codegen/test/samples/rust/PropertyTogetherSample/property_together_gen/src rust/property_together_gen/src & - -odd ../../codegen/test/samples/dotnet/TelemetryAndCommandSample dotnet/TelemetryAndCommandSample & - -# odd ../../codegen/test/samples/rust/TelemetryAndCommandSample/telemetry_and_command_gen/src rust/telemetry_and_command_gen/src & - -odd ../../codegen/test/samples/dotnet/TelemetryComplexSchemasSample dotnet/TelemetryComplexSchemasSample & - -# odd ../../codegen/test/samples/rust/TelemetryComplexSchemasSample/telemetry_complex_schemas_gen/src rust/telemetry_complex_schemas_gen/src & - -odd ../../codegen/test/samples/dotnet/TelemetryPrimitiveSchemasSample dotnet/TelemetryPrimitiveSchemasSample & - -# odd ../../codegen/test/samples/rust/TelemetryPrimitiveSchemasSample/telemetry_primitive_schemas_gen/src rust/telemetry_primitive_schemas_gen/src & - -# odd ../../codegen/test/samples/dotnet/TelemetryRawSeparateSample dotnet/TelemetryRawSeparateSample & - -# odd ../../codegen/test/samples/rust/TelemetryRawSeparateSample/telemetry_raw_separate_gen/src rust/telemetry_raw_separate_gen/src & diff --git a/codegen2/eval/g1.sh b/codegen2/eval/g1.sh deleted file mode 100644 index 318337604c..0000000000 --- a/codegen2/eval/g1.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh - -gen=../src/Azure.Iot.Operations.ProtocolCompiler/bin/Debug/net9.0/Azure.Iot.Operations.ProtocolCompiler.exe - -[[ -d dotnet/ExternalSchemasOnlySample ]] && rm -r dotnet/ExternalSchemasOnlySample -$gen --schemas wot/ExternalSchemas/*.json --outDir dotnet/ExternalSchemasOnlySample --lang csharp --namespace ExternalSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol - -[[ -d rust/external_schemas_only_gen ]] && rm -r rust/external_schemas_only_gen -$gen --schemas wot/ExternalSchemas/*.json --outDir rust/external_schemas_only_gen --lang rust --namespace ExternalSchemas --sdkPath ../../rust diff --git a/codegen2/eval/g2.sh b/codegen2/eval/g2.sh deleted file mode 100644 index 5d7ca638d7..0000000000 --- a/codegen2/eval/g2.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh - -gen=../src/Azure.Iot.Operations.ProtocolCompiler/bin/Debug/net9.0/Azure.Iot.Operations.ProtocolCompiler.exe - -[[ -d dotnet/ExternalSchemasSample ]] && rm -r dotnet/ExternalSchemasSample -$gen --thingFiles wot/ExternalSchemas.TD.json --schemas wot/ExternalSchemas/*.json --outDir dotnet/ExternalSchemasSample --lang csharp --namespace ExternalSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol - -[[ -d rust/external_schemas_gen ]] && rm -r rust/external_schemas_gen -$gen --thingFiles wot/ExternalSchemas.TD.json --schemas wot/ExternalSchemas/*.json --outDir rust/external_schemas_gen --lang rust --namespace ExternalSchemas --sdkPath ../../rust diff --git a/codegen2/eval/gen.sh b/codegen2/eval/gen.sh index 6dcf5baf6a..8ecbc28e6e 100644 --- a/codegen2/eval/gen.sh +++ b/codegen2/eval/gen.sh @@ -3,58 +3,58 @@ gen=../src/Azure.Iot.Operations.ProtocolCompiler/bin/Debug/net9.0/Azure.Iot.Operations.ProtocolCompiler.exe [[ -d dotnet/CommandComplexSchemasSample ]] && rm -r dotnet/CommandComplexSchemasSample -$gen --thingFiles wot/CommandComplexSchemas.TD.json --outDir dotnet/CommandComplexSchemasSample --lang csharp --namespace CommandComplexSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol +$gen --thingFiles wot/CommandComplexSchemas.TM.json --outDir dotnet/CommandComplexSchemasSample --lang csharp --namespace CommandComplexSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/command_complex_schemas_gen ]] && rm -r rust/command_complex_schemas_gen -$gen --thingFiles wot/CommandComplexSchemas.TD.json --outDir rust/command_complex_schemas_gen --lang rust --namespace CommandComplexSchemas --sdkPath ../../rust +$gen --thingFiles wot/CommandComplexSchemas.TM.json --outDir rust/command_complex_schemas_gen --lang rust --namespace CommandComplexSchemas --sdkPath ../../rust [[ -d dotnet/CommandVariantsSample ]] && rm -r dotnet/CommandVariantsSample -$gen --thingFiles wot/CommandVariants.TD.json --outDir dotnet/CommandVariantsSample --lang csharp --namespace CommandVariants --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol --defaultImpl +$gen --thingFiles wot/CommandVariants.TM.json --outDir dotnet/CommandVariantsSample --lang csharp --namespace CommandVariants --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol --defaultImpl [[ -d rust/command_variants_gen ]] && rm -r rust/command_variants_gen -$gen --thingFiles wot/CommandVariants.TD.json --outDir rust/command_variants_gen --lang rust --namespace CommandVariants --sdkPath ../../rust +$gen --thingFiles wot/CommandVariants.TM.json --outDir rust/command_variants_gen --lang rust --namespace CommandVariants --sdkPath ../../rust [[ -d dotnet/Counters ]] && rm -r dotnet/Counters -$gen --thingFiles wot/CounterCollection.TD.json --outDir dotnet/Counters --lang csharp --namespace CounterCollection --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol +$gen --thingFiles wot/CounterCollection.TM.json --outDir dotnet/Counters --lang csharp --namespace CounterCollection --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/counters ]] && rm -r rust/counters -$gen --thingFiles wot/CounterCollection.TD.json --outDir rust/counters --lang rust --namespace CounterCollection --sdkPath ../../rust +$gen --thingFiles wot/CounterCollection.TM.json --outDir rust/counters --lang rust --namespace CounterCollection --sdkPath ../../rust [[ -d dotnet/TelemetryComplexSchemasSample ]] && rm -r dotnet/TelemetryComplexSchemasSample -$gen --thingFiles wot/TelemetryComplexSchemas.TD.json --outDir dotnet/TelemetryComplexSchemasSample --lang csharp --namespace TelemetryComplexSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol +$gen --thingFiles wot/TelemetryComplexSchemas.TM.json --outDir dotnet/TelemetryComplexSchemasSample --lang csharp --namespace TelemetryComplexSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/telemetry_complex_schemas_gen ]] && rm -r rust/telemetry_complex_schemas_gen -$gen --thingFiles wot/TelemetryComplexSchemas.TD.json --outDir rust/telemetry_complex_schemas_gen --lang rust --namespace TelemetryComplexSchemas --sdkPath ../../rust +$gen --thingFiles wot/TelemetryComplexSchemas.TM.json --outDir rust/telemetry_complex_schemas_gen --lang rust --namespace TelemetryComplexSchemas --sdkPath ../../rust [[ -d dotnet/TelemetryPrimitiveSchemasSample ]] && rm -r dotnet/TelemetryPrimitiveSchemasSample -$gen --thingFiles wot/TelemetryPrimitiveSchemas.TD.json --outDir dotnet/TelemetryPrimitiveSchemasSample --lang csharp --namespace TelemetryPrimitiveSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol +$gen --thingFiles wot/TelemetryPrimitiveSchemas.TM.json --outDir dotnet/TelemetryPrimitiveSchemasSample --lang csharp --namespace TelemetryPrimitiveSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/telemetry_primitive_schemas_gen ]] && rm -r rust/telemetry_primitive_schemas_gen -$gen --thingFiles wot/TelemetryPrimitiveSchemas.TD.json --outDir rust/telemetry_primitive_schemas_gen --lang rust --namespace TelemetryPrimitiveSchemas --sdkPath ../../rust +$gen --thingFiles wot/TelemetryPrimitiveSchemas.TM.json --outDir rust/telemetry_primitive_schemas_gen --lang rust --namespace TelemetryPrimitiveSchemas --sdkPath ../../rust [[ -d dotnet/PropertySeparateSample ]] && rm -r dotnet/PropertySeparateSample -$gen --thingFiles wot/PropertySeparate.TD.json --outDir dotnet/PropertySeparateSample --lang csharp --namespace PropertySeparate --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol +$gen --thingFiles wot/PropertySeparate.TM.json --outDir dotnet/PropertySeparateSample --lang csharp --namespace PropertySeparate --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/property_separate_gen ]] && rm -r rust/property_separate_gen -$gen --thingFiles wot/PropertySeparate.TD.json --outDir rust/property_separate_gen --lang rust --namespace PropertySeparate --sdkPath ../../rust +$gen --thingFiles wot/PropertySeparate.TM.json --outDir rust/property_separate_gen --lang rust --namespace PropertySeparate --sdkPath ../../rust [[ -d dotnet/PropertyTogetherSample ]] && rm -r dotnet/PropertyTogetherSample -$gen --thingFiles wot/PropertyTogether.TD.json --outDir dotnet/PropertyTogetherSample --lang csharp --namespace PropertyTogether --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol +$gen --thingFiles wot/PropertyTogether.TM.json --outDir dotnet/PropertyTogetherSample --lang csharp --namespace PropertyTogether --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/property_together_gen ]] && rm -r rust/property_together_gen -$gen --thingFiles wot/PropertyTogether.TD.json --outDir rust/property_together_gen --lang rust --namespace PropertyTogether --sdkPath ../../rust +$gen --thingFiles wot/PropertyTogether.TM.json --outDir rust/property_together_gen --lang rust --namespace PropertyTogether --sdkPath ../../rust [[ -d dotnet/TwoThingsSample ]] && rm -r dotnet/TwoThingsSample -$gen --thingFiles wot/TwoThings.TD.json --outDir dotnet/TwoThingsSample --lang csharp --namespace TwoThings --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol +$gen --thingFiles wot/TwoThings.TM.json --outDir dotnet/TwoThingsSample --lang csharp --namespace TwoThings --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/two_things_gen ]] && rm -r rust/two_things_gen -$gen --thingFiles wot/TwoThings.TD.json --outDir rust/two_things_gen --lang rust --namespace TwoThings --sdkPath ../../rust +$gen --thingFiles wot/TwoThings.TM.json --outDir rust/two_things_gen --lang rust --namespace TwoThings --sdkPath ../../rust [[ -d dotnet/ExternalSchemasSample ]] && rm -r dotnet/ExternalSchemasSample -$gen --thingFiles wot/ExternalSchemas.TD.json --schemas wot/ExternalSchemas/*.json --outDir dotnet/ExternalSchemasSample --lang csharp --namespace ExternalSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol +$gen --thingFiles wot/ExternalSchemas.TM.json --schemas wot/ExternalSchemas/*.json --outDir dotnet/ExternalSchemasSample --lang csharp --namespace ExternalSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/external_schemas_gen ]] && rm -r rust/external_schemas_gen -$gen --thingFiles wot/ExternalSchemas.TD.json --schemas wot/ExternalSchemas/*.json --outDir rust/external_schemas_gen --lang rust --namespace ExternalSchemas --sdkPath ../../rust +$gen --thingFiles wot/ExternalSchemas.TM.json --schemas wot/ExternalSchemas/*.json --outDir rust/external_schemas_gen --lang rust --namespace ExternalSchemas --sdkPath ../../rust [[ -d dotnet/ExternalSchemasOnlySample ]] && rm -r dotnet/ExternalSchemasOnlySample $gen --schemas wot/ExternalSchemas/*.json --outDir dotnet/ExternalSchemasOnlySample --lang csharp --namespace ExternalSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol diff --git a/codegen2/eval/gen0.sh b/codegen2/eval/gen0.sh index c6b74f56d9..65fb84259e 100644 --- a/codegen2/eval/gen0.sh +++ b/codegen2/eval/gen0.sh @@ -3,55 +3,55 @@ gen=../src/Azure.Iot.Operations.ProtocolCompiler/bin/Debug/net9.0/Azure.Iot.Operations.ProtocolCompiler.exe [[ -d dotnet/CommandComplexSchemasSample ]] && rm -r dotnet/CommandComplexSchemasSample -$gen --thingFiles conv/CommandComplexSchemas.TD.json --outDir dotnet/CommandComplexSchemasSample --lang csharp --namespace CommandComplexSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol +$gen --thingFiles conv/CommandComplexSchemas.TM.json --outDir dotnet/CommandComplexSchemasSample --lang csharp --namespace CommandComplexSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/command_complex_schemas_gen ]] && rm -r rust/command_complex_schemas_gen -$gen --thingFiles conv/CommandComplexSchemas.TD.json --outDir rust/command_complex_schemas_gen --lang rust --namespace CommandComplexSchemas --sdkPath ../../rust +$gen --thingFiles conv/CommandComplexSchemas.TM.json --outDir rust/command_complex_schemas_gen --lang rust --namespace CommandComplexSchemas --sdkPath ../../rust [[ -d dotnet/CommandRawSample ]] && rm -r dotnet/CommandRawSample -$gen --thingFiles conv/CommandRaw.TD.json --outDir dotnet/CommandRawSample --lang csharp --namespace CommandRaw --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol +$gen --thingFiles conv/CommandRaw.TM.json --outDir dotnet/CommandRawSample --lang csharp --namespace CommandRaw --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/command_raw_gen ]] && rm -r rust/command_raw_gen -$gen --thingFiles conv/CommandRaw.TD.json --outDir rust/command_raw_gen --lang rust --namespace CommandRaw --sdkPath ../../rust +$gen --thingFiles conv/CommandRaw.TM.json --outDir rust/command_raw_gen --lang rust --namespace CommandRaw --sdkPath ../../rust [[ -d dotnet/CommandVariantsSample ]] && rm -r dotnet/CommandVariantsSample -$gen --thingFiles conv/CommandVariants.TD.json --outDir dotnet/CommandVariantsSample --lang csharp --namespace CommandVariants --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol --defaultImpl +$gen --thingFiles conv/CommandVariants.TM.json --outDir dotnet/CommandVariantsSample --lang csharp --namespace CommandVariants --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol --defaultImpl [[ -d rust/command_variants_gen ]] && rm -r rust/command_variants_gen -$gen --thingFiles conv/CommandVariants.TD.json --outDir rust/command_variants_gen --lang rust --namespace CommandVariants --sdkPath ../../rust +$gen --thingFiles conv/CommandVariants.TM.json --outDir rust/command_variants_gen --lang rust --namespace CommandVariants --sdkPath ../../rust [[ -d dotnet/PropertySeparateSample ]] && rm -r dotnet/PropertySeparateSample -$gen --thingFiles conv/PropertySeparate.TD.json --outDir dotnet/PropertySeparateSample --lang csharp --namespace PropertySeparate --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol +$gen --thingFiles conv/PropertySeparate.TM.json --outDir dotnet/PropertySeparateSample --lang csharp --namespace PropertySeparate --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/property_separate_gen ]] && rm -r rust/property_separate_gen -$gen --thingFiles conv/PropertySeparate.TD.json --outDir rust/property_separate_gen --lang rust --namespace PropertySeparate --sdkPath ../../rust +$gen --thingFiles conv/PropertySeparate.TM.json --outDir rust/property_separate_gen --lang rust --namespace PropertySeparate --sdkPath ../../rust [[ -d dotnet/PropertyTogetherSample ]] && rm -r dotnet/PropertyTogetherSample -$gen --thingFiles conv/PropertyTogether.TD.json --outDir dotnet/PropertyTogetherSample --lang csharp --namespace PropertyTogether --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol +$gen --thingFiles conv/PropertyTogether.TM.json --outDir dotnet/PropertyTogetherSample --lang csharp --namespace PropertyTogether --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/property_together_gen ]] && rm -r rust/property_together_gen -$gen --thingFiles conv/PropertyTogether.TD.json --outDir rust/property_together_gen --lang rust --namespace PropertyTogether --sdkPath ../../rust +$gen --thingFiles conv/PropertyTogether.TM.json --outDir rust/property_together_gen --lang rust --namespace PropertyTogether --sdkPath ../../rust [[ -d dotnet/TelemetryAndCommandSample ]] && rm -r dotnet/TelemetryAndCommandSample -$gen --thingFiles conv/TelemetryAndCommand.TD.json --outDir dotnet/TelemetryAndCommandSample --lang csharp --namespace TelemetryAndCommand --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol +$gen --thingFiles conv/TelemetryAndCommand.TM.json --outDir dotnet/TelemetryAndCommandSample --lang csharp --namespace TelemetryAndCommand --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/telemetry_and_command_gen ]] && rm -r rust/telemetry_and_command_gen -$gen --thingFiles conv/TelemetryAndCommand.TD.json --outDir rust/telemetry_and_command_gen --lang rust --namespace TelemetryAndCommand --sdkPath ../../rust +$gen --thingFiles conv/TelemetryAndCommand.TM.json --outDir rust/telemetry_and_command_gen --lang rust --namespace TelemetryAndCommand --sdkPath ../../rust [[ -d dotnet/TelemetryComplexSchemasSample ]] && rm -r dotnet/TelemetryComplexSchemasSample -$gen --thingFiles conv/TelemetryComplexSchemas.TD.json --outDir dotnet/TelemetryComplexSchemasSample --lang csharp --namespace TelemetryComplexSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol +$gen --thingFiles conv/TelemetryComplexSchemas.TM.json --outDir dotnet/TelemetryComplexSchemasSample --lang csharp --namespace TelemetryComplexSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/telemetry_complex_schemas_gen ]] && rm -r rust/telemetry_complex_schemas_gen -$gen --thingFiles conv/TelemetryComplexSchemas.TD.json --outDir rust/telemetry_complex_schemas_gen --lang rust --namespace TelemetryComplexSchemas --sdkPath ../../rust +$gen --thingFiles conv/TelemetryComplexSchemas.TM.json --outDir rust/telemetry_complex_schemas_gen --lang rust --namespace TelemetryComplexSchemas --sdkPath ../../rust [[ -d dotnet/TelemetryPrimitiveSchemasSample ]] && rm -r dotnet/TelemetryPrimitiveSchemasSample -$gen --thingFiles conv/TelemetryPrimitiveSchemas.TD.json --outDir dotnet/TelemetryPrimitiveSchemasSample --lang csharp --namespace TelemetryPrimitiveSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol +$gen --thingFiles conv/TelemetryPrimitiveSchemas.TM.json --outDir dotnet/TelemetryPrimitiveSchemasSample --lang csharp --namespace TelemetryPrimitiveSchemas --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/telemetry_primitive_schemas_gen ]] && rm -r rust/telemetry_primitive_schemas_gen -$gen --thingFiles conv/TelemetryPrimitiveSchemas.TD.json --outDir rust/telemetry_primitive_schemas_gen --lang rust --namespace TelemetryPrimitiveSchemas --sdkPath ../../rust +$gen --thingFiles conv/TelemetryPrimitiveSchemas.TM.json --outDir rust/telemetry_primitive_schemas_gen --lang rust --namespace TelemetryPrimitiveSchemas --sdkPath ../../rust [[ -d dotnet/TelemetryRawSeparateSample ]] && rm -r dotnet/TelemetryRawSeparateSample -$gen --thingFiles conv/TelemetryRawSeparate.TD.json --outDir dotnet/TelemetryRawSeparateSample --lang csharp --namespace TelemetryRawSeparate --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol +$gen --thingFiles conv/TelemetryRawSeparate.TM.json --outDir dotnet/TelemetryRawSeparateSample --lang csharp --namespace TelemetryRawSeparate --sdkPath ../../dotnet/src/Azure.Iot.Operations.Protocol [[ -d rust/telemetry_raw_separate_gen ]] && rm -r rust/telemetry_raw_separate_gen -$gen --thingFiles conv/TelemetryRawSeparate.TD.json --outDir rust/telemetry_raw_separate_gen --lang rust --namespace TelemetryRawSeparate --sdkPath ../../rust +$gen --thingFiles conv/TelemetryRawSeparate.TM.json --outDir rust/telemetry_raw_separate_gen --lang rust --namespace TelemetryRawSeparate --sdkPath ../../rust diff --git a/codegen2/eval/wot/CommandComplexSchemas.TD.json b/codegen2/eval/wot/CommandComplexSchemas.TM.json similarity index 90% rename from codegen2/eval/wot/CommandComplexSchemas.TD.json rename to codegen2/eval/wot/CommandComplexSchemas.TM.json index 801a5623c3..d2ba9f5470 100644 --- a/codegen2/eval/wot/CommandComplexSchemas.TD.json +++ b/codegen2/eval/wot/CommandComplexSchemas.TM.json @@ -3,19 +3,11 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:jsonTest:CommandComplexSchemas;1", + "@type": "tm:ThingModel", "title": "CommandComplexSchemas", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "links": [ { - "rel": "service-desc", + "rel": "dtv:naming", "href": "./CommandComplexSchemas.SchemaNames.json", "type": "application/json" } @@ -102,7 +94,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:CommandComplexSchemas:_contents:__doSomething;1", "contentType": "application/json", "dtv:topic": "samples/command/doSomething", "op": "invokeaction" diff --git a/codegen2/eval/wot/CommandVariants.TD.json b/codegen2/eval/wot/CommandVariants.TM.json similarity index 81% rename from codegen2/eval/wot/CommandVariants.TD.json rename to codegen2/eval/wot/CommandVariants.TM.json index adb4acdd46..b8e04e10ee 100644 --- a/codegen2/eval/wot/CommandVariants.TD.json +++ b/codegen2/eval/wot/CommandVariants.TM.json @@ -3,19 +3,11 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:jsonTest:CommandVariants;1", + "@type": "tm:ThingModel", "title": "CommandVariants", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "links": [ { - "rel": "service-desc", + "rel": "dtv:naming", "href": "./CommandVariants.SchemaNames.json", "type": "application/json" } @@ -25,7 +17,6 @@ "idempotent": true, "forms": [ { - "href": "dtmi:jsonTest:CommandVariants:_contents:__noop;1", "contentType": "application/json", "dtv:topic": "samples/command/noop/{executorId}", "op": "invokeaction" @@ -47,7 +38,6 @@ "idempotent": true, "forms": [ { - "href": "dtmi:jsonTest:CommandVariants:_contents:__peek;1", "contentType": "application/json", "dtv:topic": "samples/command/peek/{executorId}", "dtv:serviceGroupId": "PeekCmdGroup", @@ -69,7 +59,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:CommandVariants:_contents:__poke;1", "contentType": "application/json", "dtv:topic": "samples/command/poke/{executorId}", "dtv:serviceGroupId": "PokeCmdGroup", @@ -98,7 +87,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:CommandVariants:_contents:__setColor;1", "contentType": "application/json", "dtv:topic": "samples/command/setColor/{executorId}", "op": "invokeaction" diff --git a/codegen2/eval/wot/CounterCollection.TD.json b/codegen2/eval/wot/CounterCollection.TM.json similarity index 90% rename from codegen2/eval/wot/CounterCollection.TD.json rename to codegen2/eval/wot/CounterCollection.TM.json index 7e0bcb4fbe..f313fff7b6 100644 --- a/codegen2/eval/wot/CounterCollection.TD.json +++ b/codegen2/eval/wot/CounterCollection.TM.json @@ -3,19 +3,11 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:codegen:communicationTest:counterCollection;1", + "@type": "tm:ThingModel", "title": "CounterCollection", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "links": [ { - "rel": "service-desc", + "rel": "dtv:naming", "href": "./CounterCollection.SchemaNames.json", "type": "application/json" } @@ -97,7 +89,6 @@ }, "forms": [ { - "href": "dtmi:codegen:communicationTest:counterCollection:_contents:__increment;1", "contentType": "application/json", "dtv:headerInfo": [ { @@ -147,7 +138,6 @@ }, "forms": [ { - "href": "dtmi:codegen:communicationTest:counterCollection:_contents:__getLocation;1", "contentType": "application/json", "additionalResponses": [ { diff --git a/codegen2/eval/wot/ExternalSchemas.TD.json b/codegen2/eval/wot/ExternalSchemas.TM.json similarity index 73% rename from codegen2/eval/wot/ExternalSchemas.TD.json rename to codegen2/eval/wot/ExternalSchemas.TM.json index 3d796de549..ee740dceef 100644 --- a/codegen2/eval/wot/ExternalSchemas.TD.json +++ b/codegen2/eval/wot/ExternalSchemas.TM.json @@ -3,16 +3,8 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:jsonTest:ExternalSchemas;1", + "@type": "tm:ThingModel", "title": "ExternalSchemas", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "schemaDefinitions": { "Foo": { "description": "The requested property read/write could not be completed.", @@ -43,7 +35,6 @@ }, "forms": [ { - "href": "dtmi:test:PropertyTogether;1", "contentType": "application/json", "dtv:topic": "test/PropertyTogether/read", "additionalResponses": [ @@ -54,7 +45,6 @@ "op": [ "readallproperties" ] }, { - "href": "dtmi:test:PropertyTogether;1", "contentType": "application/json", "dtv:topic": "test/PropertyTogether/write", "additionalResponses": [ @@ -75,9 +65,8 @@ }, "forms": [ { - "href": "dtmi:jsonTest:ExternalSchemas:_contents:__doSomething;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/command/doSomething", + "dtv:topic": "sample/command/doSomething", "op": "invokeaction" } ] @@ -89,9 +78,8 @@ "readOnly": false, "forms": [ { - "href": "dtmi:jsonTest:ExternalSchemas:_contents:__Aleph;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/property/Alpha/{action}", + "dtv:topic": "sample/property/Alpha/{action}", "additionalResponses": [ { "success": false, @@ -101,9 +89,8 @@ "op": [ "readproperty" ] }, { - "href": "dtmi:jsonTest:ExternalSchemas:_contents:__Aleph;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/property/Alpha/{action}", + "dtv:topic": "sample/property/Alpha/{action}", "additionalResponses": [ { "success": false, @@ -122,9 +109,8 @@ }, "forms": [ { - "href": "dtmi:jsonTest:ExternalSchemas:_contents:__Beth;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/{senderId}/telemetry/Beth", + "dtv:topic": "sample/{senderId}/telemetry/Beth", "op": "subscribeevent" } ] @@ -135,9 +121,8 @@ }, "forms": [ { - "href": "dtmi:jsonTest:ExternalSchemas:_contents:__Gimel;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/{senderId}/telemetry/Gimel", + "dtv:topic": "sample/{senderId}/telemetry/Gimel", "op": "subscribeevent" } ] @@ -148,9 +133,8 @@ }, "forms": [ { - "href": "dtmi:jsonTest:ExternalSchemas:_contents:__Dalet;1", "contentType": "application/json", - "dtv:topic": "sample/{modelId}/{senderId}/telemetry/Dalet", + "dtv:topic": "sample/{senderId}/telemetry/Dalet", "op": "subscribeevent" } ] diff --git a/codegen2/eval/wot/PropertySeparate.TD.json b/codegen2/eval/wot/PropertySeparate.TM.json similarity index 84% rename from codegen2/eval/wot/PropertySeparate.TD.json rename to codegen2/eval/wot/PropertySeparate.TM.json index 2d8d1732b4..a065f1d78c 100644 --- a/codegen2/eval/wot/PropertySeparate.TD.json +++ b/codegen2/eval/wot/PropertySeparate.TM.json @@ -3,19 +3,11 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:PropertySeparate;1", + "@type": "tm:ThingModel", "title": "PropertySeparate", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "links": [ { - "rel": "service-desc", + "rel": "dtv:naming", "href": "./PropertySeparate.SchemaNames.json", "type": "application/json" } @@ -64,7 +56,6 @@ "readOnly": true, "forms": [ { - "href": "dtmi:test:PropertySeparate:_contents:__Alpha;1", "contentType": "application/json", "dtv:topic": "test/PropertySeparate/Alpha/read", "op": "readproperty" @@ -78,13 +69,11 @@ "readOnly": false, "forms": [ { - "href": "dtmi:test:PropertySeparate:_contents:__Beta;1", "contentType": "application/json", "dtv:topic": "test/PropertySeparate/Beta/write", "op": "writeproperty" }, { - "href": "dtmi:test:PropertySeparate:_contents:__Beta;1", "contentType": "application/json", "dtv:topic": "test/PropertySeparate/Beta/read", "op": "readproperty" @@ -98,7 +87,6 @@ "readOnly": true, "forms": [ { - "href": "dtmi:test:PropertySeparate:_contents:__Gamma;1", "contentType": "application/json", "additionalResponses": [ { @@ -118,7 +106,6 @@ "readOnly": false, "forms": [ { - "href": "dtmi:test:PropertySeparate:_contents:__Delta;1", "contentType": "application/json", "additionalResponses": [ { @@ -130,7 +117,6 @@ "op": "writeproperty" }, { - "href": "dtmi:test:PropertySeparate:_contents:__Delta;1", "contentType": "application/json", "additionalResponses": [ { @@ -151,13 +137,11 @@ "dtv:placeholder": true, "forms": [ { - "href": "dtmi:test:PropertySeparate:_contents:__Zeta;1", "contentType": "application/json", "dtv:topic": "test/PropertySeparate/Zeta/write", "op": "writeproperty" }, { - "href": "dtmi:test:PropertySeparate:_contents:__Zeta;1", "contentType": "application/json", "dtv:topic": "test/PropertySeparate/Zeta/read", "op": "readproperty" @@ -172,7 +156,6 @@ "dtv:placeholder": true, "forms": [ { - "href": "dtmi:test:PropertySeparate:_contents:__Eta;1", "contentType": "application/json", "additionalResponses": [ { @@ -184,7 +167,6 @@ "op": "writeproperty" }, { - "href": "dtmi:test:PropertySeparate:_contents:__Eta;1", "contentType": "application/json", "additionalResponses": [ { diff --git a/codegen2/eval/wot/PropertyTogether.TD.json b/codegen2/eval/wot/PropertyTogether.TM.json similarity index 80% rename from codegen2/eval/wot/PropertyTogether.TD.json rename to codegen2/eval/wot/PropertyTogether.TM.json index 23b157ead4..5e24e56fba 100644 --- a/codegen2/eval/wot/PropertyTogether.TD.json +++ b/codegen2/eval/wot/PropertyTogether.TM.json @@ -3,19 +3,11 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:test:PropertyTogether;1", + "@type": "tm:ThingModel", "title": "PropertyTogether", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "links": [ { - "rel": "service-desc", + "rel": "dtv:naming", "href": "./PropertyTogether.SchemaNames.json", "type": "application/json" } @@ -58,7 +50,6 @@ }, "forms": [ { - "href": "dtmi:test:PropertyTogether;1", "contentType": "application/json", "additionalResponses": [ { @@ -69,7 +60,6 @@ "op": "writemultipleproperties" }, { - "href": "dtmi:test:PropertyTogether;1", "contentType": "application/json", "additionalResponses": [ { @@ -88,7 +78,6 @@ "readOnly": true, "forms": [ { - "href": "dtmi:test:PropertyTogether:_contents:__Alpha;1", "op": "readproperty" } ] @@ -100,11 +89,9 @@ "readOnly": false, "forms": [ { - "href": "dtmi:test:PropertyTogether:_contents:__Beta;1", "op": "writeproperty" }, { - "href": "dtmi:test:PropertyTogether:_contents:__Beta;1", "op": "readproperty" } ] @@ -116,7 +103,6 @@ "readOnly": true, "forms": [ { - "href": "dtmi:test:PropertyTogether:_contents:__Gamma;1", "additionalResponses": [ { "success": false, @@ -134,7 +120,6 @@ "readOnly": false, "forms": [ { - "href": "dtmi:test:PropertyTogether:_contents:__Delta;1", "additionalResponses": [ { "success": false, @@ -144,7 +129,6 @@ "op": "writeproperty" }, { - "href": "dtmi:test:PropertyTogether:_contents:__Delta;1", "additionalResponses": [ { "success": false, @@ -163,11 +147,9 @@ "dtv:placeholder": true, "forms": [ { - "href": "dtmi:test:PropertyTogether:_contents:__Zeta;1", "op": "writeproperty" }, { - "href": "dtmi:test:PropertyTogether:_contents:__Zeta;1", "op": "readproperty" } ] @@ -180,7 +162,6 @@ "dtv:placeholder": true, "forms": [ { - "href": "dtmi:test:PropertyTogether:_contents:__Eta;1", "additionalResponses": [ { "success": false, @@ -190,7 +171,6 @@ "op": "writeproperty" }, { - "href": "dtmi:test:PropertyTogether:_contents:__Eta;1", "additionalResponses": [ { "success": false, diff --git a/codegen2/eval/wot/TelemetryAndCommand.TD.json b/codegen2/eval/wot/TelemetryAndCommand.TM.json similarity index 81% rename from codegen2/eval/wot/TelemetryAndCommand.TD.json rename to codegen2/eval/wot/TelemetryAndCommand.TM.json index 1a4d828bd5..097ddc435c 100644 --- a/codegen2/eval/wot/TelemetryAndCommand.TD.json +++ b/codegen2/eval/wot/TelemetryAndCommand.TM.json @@ -3,19 +3,10 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:jsonTest:TelemetryAndCommand;1", + "@type": "tm:ThingModel", "title": "TelemetryAndCommand", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "forms": [ { - "href": "dtmi:jsonTest:TelemetryAndCommand;1", "contentType": "application/json", "dtv:topic": "sample/{modelId}/{senderId}/telemetry", "op": "subscribeallevents" @@ -43,7 +34,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:TelemetryAndCommand:_contents:__setColor;1", "contentType": "application/json", "dtv:serviceGroupId": "MyCommandGroup", "dtv:topic": "sample/{modelId}/command/setColor", @@ -77,7 +67,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:TelemetryAndCommand:_contents:__distance;1", "contentType": "application/json", "dtv:serviceGroupId": "MyTelemetryGroup", "op": "subscribeevent" @@ -93,7 +82,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:TelemetryAndCommand:_contents:__color;1", "contentType": "application/json", "dtv:serviceGroupId": "MyTelemetryGroup", "op": "subscribeevent" diff --git a/codegen2/eval/wot/TelemetryComplexSchemas.TD.json b/codegen2/eval/wot/TelemetryComplexSchemas.TM.json similarity index 78% rename from codegen2/eval/wot/TelemetryComplexSchemas.TD.json rename to codegen2/eval/wot/TelemetryComplexSchemas.TM.json index 10702aa9e7..b4e55aa41e 100644 --- a/codegen2/eval/wot/TelemetryComplexSchemas.TD.json +++ b/codegen2/eval/wot/TelemetryComplexSchemas.TM.json @@ -3,19 +3,11 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:jsonTest:TelemetryComplexSchemas;1", + "@type": "tm:ThingModel", "title": "TelemetryComplexSchemas", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "links": [ { - "rel": "service-desc", + "rel": "dtv:naming", "href": "./TelemetryComplexSchemas.SchemaNames.json", "type": "application/json" } @@ -32,7 +24,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:TelemetryComplexSchemas;1", "contentType": "application/json", "dtv:topic": "sample/{senderId}/telemetry", "dtv:serviceGroupId": "AggregTelemGroup", @@ -62,7 +53,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:TelemetryComplexSchemas:_contents:__coordinates;1", "op": "subscribeevent" } ] @@ -81,7 +71,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:TelemetryComplexSchemas:_contents:__doubleArray2D;1", "op": "subscribeevent" } ] @@ -97,7 +86,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:TelemetryComplexSchemas:_contents:__doubleMap;1", "op": "subscribeevent" } ] @@ -116,7 +104,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:TelemetryComplexSchemas:_contents:__doubleMapArray;1", "op": "subscribeevent" } ] @@ -130,7 +117,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:TelemetryComplexSchemas:_contents:__proximity;1", "op": "subscribeevent" } ] @@ -149,7 +135,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:TelemetryComplexSchemas:_contents:__resultArray;1", "op": "subscribeevent" } ] @@ -164,7 +149,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:TelemetryComplexSchemas:_contents:__speed;1", "op": "subscribeevent" } ] diff --git a/codegen2/eval/wot/TelemetryPrimitiveSchemas.TD.json b/codegen2/eval/wot/TelemetryPrimitiveSchemas.TM.json similarity index 77% rename from codegen2/eval/wot/TelemetryPrimitiveSchemas.TD.json rename to codegen2/eval/wot/TelemetryPrimitiveSchemas.TM.json index e707b63989..f42b2bce34 100644 --- a/codegen2/eval/wot/TelemetryPrimitiveSchemas.TD.json +++ b/codegen2/eval/wot/TelemetryPrimitiveSchemas.TM.json @@ -3,19 +3,11 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:jsonTest:TelemetryPrimitiveSchemas;1", + "@type": "tm:ThingModel", "title": "TelemetryPrimitiveSchemas", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "links": [ { - "rel": "service-desc", + "rel": "dtv:naming", "href": "./TelemetryPrimitiveSchemas.SchemaNames.json", "type": "application/json" } @@ -32,7 +24,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:TelemetryPrimitiveSchemas:_contents:__endDate;1", "contentType": "application/json", "dtv:topic": "sample/{senderId}/telemetry/endDate", "op": "subscribeevent" @@ -46,7 +37,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:TelemetryPrimitiveSchemas:_contents:__startDateTime;1", "contentType": "application/json", "dtv:topic": "sample/{senderId}/telemetry/startDateTime", "op": "subscribeevent" @@ -60,7 +50,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:TelemetryPrimitiveSchemas:_contents:__targetTime;1", "contentType": "application/json", "dtv:topic": "sample/{senderId}/telemetry/targetTime", "op": "subscribeevent" @@ -74,7 +63,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:TelemetryPrimitiveSchemas:_contents:__allottedDuration;1", "contentType": "application/json", "dtv:topic": "sample/{senderId}/telemetry/allottedDuration", "op": "subscribeevent" @@ -88,7 +76,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:TelemetryPrimitiveSchemas:_contents:__identifier;1", "contentType": "application/json", "dtv:topic": "sample/{senderId}/telemetry/identifier", "op": "subscribeevent" @@ -102,7 +89,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:TelemetryPrimitiveSchemas:_contents:__data;1", "contentType": "application/json", "dtv:topic": "sample/{senderId}/telemetry/data", "op": "subscribeevent" @@ -115,7 +101,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:TelemetryNativeSchemas:_contents:__flipflop;1", "contentType": "application/json", "dtv:topic": "sample/{senderId}/telemetry/flipflop", "op": "subscribeevent" @@ -130,7 +115,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:TelemetryNativeSchemas:_contents:__absoluteDistance;1", "contentType": "application/json", "dtv:topic": "sample/{senderId}/telemetry/absoluteDistance", "op": "subscribeevent" @@ -145,7 +129,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:TelemetryNativeSchemas:_contents:__relativeDistance;1", "contentType": "application/json", "dtv:topic": "sample/{senderId}/telemetry/relativeDistance", "op": "subscribeevent" @@ -160,7 +143,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:TelemetryNativeSchemas:_contents:__count;1", "contentType": "application/json", "dtv:topic": "sample/{senderId}/telemetry/count", "op": "subscribeevent" @@ -175,7 +157,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:TelemetryNativeSchemas:_contents:__totalCount;1", "contentType": "application/json", "dtv:topic": "sample/{senderId}/telemetry/totalCount", "op": "subscribeevent" @@ -188,7 +169,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:TelemetryNativeSchemas:_contents:__notes;1", "contentType": "application/json", "dtv:topic": "sample/{senderId}/telemetry/notes", "op": "subscribeevent" diff --git a/codegen2/eval/wot/TwoThings.TD.json b/codegen2/eval/wot/TwoThings.TM.json similarity index 71% rename from codegen2/eval/wot/TwoThings.TD.json rename to codegen2/eval/wot/TwoThings.TM.json index b42f7654f7..e6b7812252 100644 --- a/codegen2/eval/wot/TwoThings.TD.json +++ b/codegen2/eval/wot/TwoThings.TM.json @@ -4,26 +4,17 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:jsonTest:ThingOne;1", + "@type": "tm:ThingModel", "title": "ThingOne", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "links": [ { - "rel": "service-desc", + "rel": "dtv:naming", "href": "./ThingOne.SchemaNames.json", "type": "application/json" } ], "forms": [ { - "href": "dtmi:jsonTest:ThingOne;1", "contentType": "application/json", "dtv:topic": "sample/{senderId}/telemetry1", "op": "subscribeallevents" @@ -40,7 +31,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:ThingOne;1", "op": "subscribeevent" } ] @@ -51,7 +41,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:ThingOne;1", "op": "subscribeevent" } ] @@ -63,26 +52,17 @@ "https://www.w3.org/2022/wot/td/v1.1", { "dtv": "http://azure.com/DigitalTwins/dtmi#" } ], - "id": "dtmi:jsonTest:ThingTwo;1", + "@type": "tm:ThingModel", "title": "ThingTwo", - "securityDefinitions": { - "nosec_sc": { - "scheme": "nosec" - } - }, - "security": [ - "nosec_sc" - ], "links": [ { - "rel": "service-desc", + "rel": "dtv:naming", "href": "./ThingTwo.SchemaNames.json", "type": "application/json" } ], "forms": [ { - "href": "dtmi:jsonTest:ThingTwo;1", "contentType": "application/json", "dtv:topic": "sample/{senderId}/telemetry2", "op": "subscribeallevents" @@ -99,7 +79,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:ThingTwo;1", "op": "subscribeevent" } ] @@ -110,7 +89,6 @@ }, "forms": [ { - "href": "dtmi:jsonTest:ThingTwo;1", "op": "subscribeevent" } ] diff --git a/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt b/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt index 062ec3773f..9caa4d8780 100644 --- a/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt +++ b/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.tt @@ -41,10 +41,10 @@ "properties": { <# ix2 = 1; foreach (DTEnumValueInfo enumValue in namespacedEnum.Value.EnumValues) { #> "<#=enumValue.Name#>": { - "type": "<#=ThingDescriber.GetPrimitiveType(namespacedEnum.Value.ValueSchema.Id)#>", <# if (enumValue.Description.Any()) { #> - "description": "<#=enumValue.Description.First().Value#>" + "description": "<#=enumValue.Description.First().Value#>", <# } #> + "type": "<#=ThingDescriber.GetPrimitiveType(namespacedEnum.Value.ValueSchema.Id)#>" }<#=ix2 < namespacedEnum.Value.EnumValues.Count ? "," : ""#> <# ix2++; } #> } From bbe27b8badd38f3df5a291964b66c9fbf7b52779 Mon Sep 17 00:00:00 2001 From: "John (JD) Douceur" Date: Fri, 16 Jan 2026 15:12:30 -0800 Subject: [PATCH 41/52] add Golden Path properties to AIO TM JSON Schema --- codegen2/schema/aio-tm-json-schema.json | 845 +++++++++++------- .../test/thing-models/.vscode/settings.json | 2 +- 2 files changed, 511 insertions(+), 336 deletions(-) diff --git a/codegen2/schema/aio-tm-json-schema.json b/codegen2/schema/aio-tm-json-schema.json index 2a10fa0a9d..979c1e95c4 100644 --- a/codegen2/schema/aio-tm-json-schema.json +++ b/codegen2/schema/aio-tm-json-schema.json @@ -3,7 +3,6 @@ "title": "Thing Description with AIO Protocol Binding", "version": "0.1", "description": "JSON Schema for validating TD instances that employ the AIO WoT Protocol Binding", - "type": "object", "definitions": { "title": { "type": "string", @@ -16,6 +15,9 @@ "title": { "$ref": "#/definitions/title" }, + "aov:namespace": { + "type": "string" + }, "type": { "type": "string", "const": "boolean" @@ -31,6 +33,9 @@ "title": { "$ref": "#/definitions/title" }, + "aov:namespace": { + "type": "string" + }, "type": { "type": "string", "const": "integer" @@ -38,6 +43,14 @@ "const": { "type": "integer" }, + "aov:scaleFactor": { + "description": "scale factor to apply to instance values", + "type": "integer" + }, + "aov:decimalPlaces": { + "description": "number of decimal places of significant precision of instance values", + "type": "integer" + }, "minimum": { "type": "integer", "description": "inclusive minimum integer value", @@ -110,6 +123,9 @@ "title": { "$ref": "#/definitions/title" }, + "aov:namespace": { + "type": "string" + }, "type": { "type": "string", "const": "number" @@ -117,6 +133,14 @@ "const": { "type": "number" }, + "aov:scaleFactor": { + "description": "scale factor to apply to instance values", + "type": "number" + }, + "aov:decimalPlaces": { + "description": "number of decimal places of significant precision of instance values", + "type": "integer" + }, "minimum": { "type": "number", "description": "inclusive minimum numeric value", @@ -153,10 +177,17 @@ "title": { "$ref": "#/definitions/title" }, + "aov:namespace": { + "type": "string" + }, "type": { "type": "string", "const": "string" }, + "aov:typeRef": { + "description": "opaque reference to another type definition (not necessarily in WoT) that is congruent to this definition", + "type": "string" + }, "enum": { "type": "array", "items": { @@ -190,6 +221,9 @@ "const": { "type": "string" } + }, + "dependentRequired": { + "aov:typeRef": [ "enum" ] } }, "dataSchema_object": { @@ -199,10 +233,17 @@ "title": { "$ref": "#/definitions/title" }, + "aov:namespace": { + "type": "string" + }, "type": { "type": "string", "const": "object" }, + "aov:typeRef": { + "description": "opaque reference to another type definition (not necessarily in WoT) that is congruent to this structured object definition", + "type": "string" + }, "properties": { "description": "use 'properties' to indicate an object type and define fields for the object", "additionalProperties": { @@ -232,10 +273,17 @@ "title": { "$ref": "#/definitions/title" }, + "aov:namespace": { + "type": "string" + }, "type": { "type": "string", "const": "object" }, + "aov:typeRef": { + "description": "opaque reference to another type definition (not necessarily in WoT) that is congruent to this map definition", + "type": "string" + }, "dtv:additionalProperties": { "description": "use 'dtv:additionalProperties' to indicate a map type and specify the data schema for the values therein", "$ref": "#/definitions/dataSchema" @@ -259,10 +307,17 @@ "title": { "$ref": "#/definitions/title" }, + "aov:namespace": { + "type": "string" + }, "type": { "type": "string", "const": "array" }, + "aov:typeRef": { + "description": "opaque reference to another type definition (not necessarily in WoT) that is congruent to this array definition", + "type": "string" + }, "items": { "description": "use 'items' to specify the data schema for the values in the array", "$ref": "#/definitions/dataSchema" @@ -575,9 +630,6 @@ "form_element_base": { "type": "object", "properties": { - "href": { - "description": "an 'href' property is required by WoT TD schema, but not processed by AIO ProtocolCompiler" - }, "contentType": { "type": "string", "description": "content type for communicated values, only 'application/json' supported at present", @@ -777,387 +829,510 @@ ], "description": "dtv:headerCode and dtv:headerInfo are not allowed in root forms" } - } - }, - "allOf": [ - { - "$ref": "./tm-json-schema-validation.json" }, - { - "properties": { - "@context": { - "type": "array", - "contains": { - "type": "object", - "required": [ "dtv" ], - "properties": { - "dtv": { - "type": "string", - "const": "http://azure.com/DigitalTwins/dtmi#" - } - } - }, - "description": "Must include WoT TD context string \"https://www.w3.org/2022/wot/td/v1.1\" and local context object with key \"dtv\" and value \"http://azure.com/DigitalTwins/dtmi#\"" - }, - "title": { - "$ref": "#/definitions/title" - }, - "schemaDefinitions": { - "type": "object", - "description": "definitions of schemas that can be referenced via 'additionalResponses', 'dtv:headerCode', and 'dtv:headerInfo' properties in 'forms' elements", - "additionalProperties": { - "allOf": [ { "$ref": "#/definitions/dataSchema_base" } ], - "type": "object", - "required": [ "type" ], - "properties": { - "dtv:errorMessage": { - "type": "string", - "description": "name of a property whose value will hold an error message when this object is used as an error value" - } - }, - "not": { - "anyOf": [ - { - "required": [ "dtv:ref" ] - } - ] - } - } - }, - "securityDefinitions": { - "description": "a 'securityDefinitions' property is required by WoT TD schema, but not processed by AIO ProtocolCompiler" - }, - "security": { - "description": "a 'security' property is required by WoT TD schema, but not processed by AIO ProtocolCompiler" - }, - "links": { - "type": "array", - "description": "Use a value with \"rel\": \"service-desc\" to specify a JSON file of rules for generating schema names", - "items": { - "type": "object", - "required": [ "rel", "href", "type" ], - "properties": { - "rel": { - "type": "string", - "description": "A 'rel' value of 'service-desc' indicates that the target file contains rules for generating schema names", - "const": "service-desc" - }, - "href": { - "type": "string", - "description": "path to a JSON file that specifies rules for generating schema names" - }, - "type": { - "type": "string", - "description": "schema definition rules must be written in JSON format", - "const": "application/json" - } - } - }, - "defaultSnippets": [ - { - "description": "example 'links' value -- replace './EXAMPLE.SchemaNames.json' with path to your own schema names declaration file", - "body": [ - { - "rel": "service-desc", - "href": "./EXAMPLE.SchemaNames.json", - "type": "application/json" - } - ] - } - ] - }, - "forms": { - "type": "array", - "items": { - "$ref": "#/definitions/form_element_root" - }, - "defaultSnippets": [ - { - "description": "example root-level 'forms' values for interacting with all properties and events", - "body": [ - { - "href": "dtmi:test:SomeURI;1", - "contentType": "application/json", - "dtv:topic": "example/SomeTopic/write", - "op": "writemultipleproperties" - }, - { - "href": "dtmi:test:SomeURI;1", - "contentType": "application/json", - "dtv:topic": "example/SomeTopic/read", - "op": "readallproperties" - }, - { - "href": "dtmi:test:SomeURI;1", - "contentType": "application/json", - "dtv:topic": "example/SomeTopic/AllEvents", - "op": "subscribeallevents" - } - ] - } - ] + "aioThingModel": { + "allOf": [ + { + "$ref": "./tm-json-schema-validation.json" }, - "properties": { + { "type": "object", - "description": "properties are values stored on a server that can be read or written by clients", - "additionalProperties": { - "allOf": [ { "$ref": "#/definitions/dataSchema_affordance" } ], - "type": "object", - "properties": { - "readOnly": { - "type": "boolean", - "description": "true if the property is read-only" - }, - "dtv:placeholder": { - "type": "boolean", - "description": "true if the property is a placeholder for a dynamic collection of properties" - }, - "forms": { - "type": "array", - "minItems": 1, - "items": { - "$ref": "#/definitions/form_element_property" - }, - "defaultSnippets": [ + "properties": { + "@context": { + "type": "array", + "items": { + "oneOf": [ { - "description": "example 'forms' values for properties", - "body": [ - { - "href": "dtmi:test:SomeURI;1", - "contentType": "application/json", - "dtv:topic": "example/SomeTopic/MyProp1/write", - "op": "writeproperty" + "type": "string" + }, + { + "type": "object", + "properties": { + "dtv": { + "type": "string", + "const": "http://azure.com/DigitalTwins/dtmi#" }, - { - "href": "dtmi:test:SomeURI;1", - "contentType": "application/json", - "dtv:topic": "example/SomeTopic/MyProp1/read", - "op": "readproperty" + "aov": { + "type": "string", + "const": "http://azure.com/IoT/operations/tm#" } - ] + }, + "additionalProperties": { + "type": "string" + } } ] - } - } - }, - "defaultSnippets": [ - { - "description": "example 'properties' value", - "body": { - "MyProperty": { - "type": "integer", - "minimum": -2147483648, - "maximum": 2147483647, - "readOnly": false, - "forms": [ - { - "href": "dtmi:test:SomeURI;1", - "contentType": "application/json", - "dtv:topic": "example/SomeTopic/MyProp1/write", - "op": "writeproperty" - }, + }, + "contains": { + "type": "object", + "required": [ "dtv" ] + }, + "description": "Must include WoT TD context string \"https://www.w3.org/2022/wot/td/v1.1\" and local context object with key \"dtv\" and value \"http://azure.com/DigitalTwins/dtmi#\"" + }, + "title": { + "$ref": "#/definitions/title" + }, + "aov:typeRef": { + "description": "opaque reference to another definition (not necessarily in WoT) that is congruent to this Thing Model definition", + "type": "string" + }, + "aov:isComposite": { + "description": "true if the Thing Model represents a composite type", + "type": "boolean" + }, + "aov:isEvent": { + "description": "true if the Thing Model represents an event type", + "type": "boolean" + }, + "schemaDefinitions": { + "type": "object", + "description": "definitions of schemas that can be referenced via 'additionalResponses', 'dtv:headerCode', and 'dtv:headerInfo' properties in 'forms' elements", + "additionalProperties": { + "allOf": [ { "$ref": "#/definitions/dataSchema_base" } ], + "type": "object", + "required": [ "type" ], + "properties": { + "dtv:errorMessage": { + "type": "string", + "description": "name of a property whose value will hold an error message when this object is used as an error value" + } + }, + "not": { + "anyOf": [ { - "href": "dtmi:test:SomeURI;1", - "contentType": "application/json", - "dtv:topic": "example/SomeTopic/MyProp1/read", - "op": "readproperty" + "required": [ "dtv:ref" ] } ] } } - } - ] - }, - "actions": { - "type": "object", - "description": "actions are round-trip messages initiated by clients to request a server to perform an operation and return the result to the client", - "additionalProperties": { - "type": "object", - "properties": { - "input": { - "description": "input arguments as properties in object type", - "$ref": "#/definitions/dataSchema_action", - "defaultSnippets": [ + }, + "links": { + "type": "array", + "description": "links to other JSON files that can be either Thing Models or naming rules", + "items": { + "type": "object", + "required": [ "rel", "href", "type" ], + "properties": { + "rel": { + "type": "string", + "enum": [ + "tm:extends", + "aov:reference", + "aov:typedReference", + "aov:capability", + "aov:component", + "dtv:naming" + ] + }, + "aov:refType": { + "type": "string", + "description": "custom reference type name, needed when 'rel' is 'aov:typedReference'" + }, + "href": { + "type": "string", + "description": "path to linked JSON file" + }, + "type": { + "type": "string" + } + }, + "allOf": [ { - "body": { - "type": "object", + "if": { "properties": { - "arg1": { - "type": "string" - }, - "arg2": { - "type": "integer", - "minimum": -2147483648, - "maximum": 2147483647 + "rel": { + "const": "aov:typedReference" } } + }, + "then": { + "required": [ "aov:refType" ] + }, + "else": { + "not": { + "required": [ "aov:refType" ] + } } }, { - "description": "reference to an external schema definition (must be an object)", - "body": { "dtv:ref": "./EXAMPLESCHEMA.json" } - } - ] - }, - "output": { - "description": "output values as properties in object type", - "$ref": "#/definitions/dataSchema_action", - "defaultSnippets": [ - { - "body": { - "type": "object", + "if": { "properties": { - "status": { - "type": "string" - }, - "result": { - "type": "integer", - "minimum": -2147483648, - "maximum": 2147483647 + "rel": { + "const": "dtv:naming" + } + } + }, + "then": { + "properties": { + "type": { + "description": "naming rules must be written in JSON format", + "const": "application/json" + } + } + }, + "else": { + "properties": { + "type": { + "description": "Thing Models must be written in JSON format", + "const": "application/tm+json" } } } - }, - { - "description": "reference to an external schema definition (must be an object)", - "body": { "dtv:ref": "./EXAMPLESCHEMA.json" } } ] }, - "idempotent": { - "type": "boolean", - "description": "true if the action is idempotent" - }, - "safe": { - "type": "boolean", - "description": "true if caching the action's output is safe" - }, - "forms": { - "type": "array", - "minItems": 1, - "items": { - "$ref": "#/definitions/form_element_action" + "defaultSnippets": [ + { + "description": "example naming 'links' value -- replace './EXAMPLE.SchemaNames.json' with path to your own schema names declaration file", + "body": [ + { + "rel": "dtv:naming", + "href": "./EXAMPLE.SchemaNames.json", + "type": "application/json" + } + ] }, - "defaultSnippets": [ - { - "description": "example 'forms' value for actions", - "body": [ + { + "description": "example extends 'links' value -- replace './EXAMPLE.ParentThingModel.TM.json' with path to a real Thing Model that is to be extended", + "body": [ + { + "rel": "tm:extends", + "href": "./EXAMPLE.ParentThingModel.TM.json", + "type": "application/tm+json" + } + ] + } + ] + }, + "forms": { + "type": "array", + "items": { + "$ref": "#/definitions/form_element_root" + }, + "defaultSnippets": [ + { + "description": "example root-level 'forms' values for interacting with all properties and events", + "body": [ + { + "contentType": "application/json", + "dtv:topic": "example/SomeTopic/write", + "op": "writemultipleproperties" + }, + { + "contentType": "application/json", + "dtv:topic": "example/SomeTopic/read", + "op": "readallproperties" + }, + { + "contentType": "application/json", + "dtv:topic": "example/SomeTopic/AllEvents", + "op": "subscribeallevents" + } + ] + } + ] + }, + "properties": { + "type": "object", + "description": "properties are values stored on a server that can be read or written by clients", + "additionalProperties": { + "allOf": [ { "$ref": "#/definitions/dataSchema_affordance" } ], + "type": "object", + "properties": { + "readOnly": { + "type": "boolean", + "description": "true if the property is read-only" + }, + "aov:namespace": { + "type": "string" + }, + "aov:contains": { + "description": "list of names of other property affordances that this property logically contains", + "type": "array", + "items": { + "type": "string" + } + }, + "aov:containedIn": { + "description": "name of another property affordance in which this property is logically contained", + "type": "string" + }, + "dtv:placeholder": { + "type": "boolean", + "description": "true if the property is a placeholder for a dynamic collection of properties" + }, + "forms": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/form_element_property" + }, + "defaultSnippets": [ { - "href": "dtmi:test:SomeURI;1", - "contentType": "application/json", - "dtv:topic": "example/SomeTopic/DoSomething", - "op": "invokeaction" + "description": "example 'forms' values for properties", + "body": [ + { + "contentType": "application/json", + "dtv:topic": "example/SomeTopic/MyProp1/write", + "op": "writeproperty" + }, + { + "contentType": "application/json", + "dtv:topic": "example/SomeTopic/MyProp1/read", + "op": "readproperty" + } + ] } ] } - ] - } - } - }, - "defaultSnippets": [ - { - "description": "example 'actions' value", - "body": { - "MyAction": { + } + }, + "defaultSnippets": [ + { + "description": "example 'properties' value", + "body": { + "MyProperty": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647, + "readOnly": false, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "example/SomeTopic/MyProp1/write", + "op": "writeproperty" + }, + { + "contentType": "application/json", + "dtv:topic": "example/SomeTopic/MyProp1/read", + "op": "readproperty" + } + ] + } + } + } + ] + }, + "actions": { + "type": "object", + "description": "actions are round-trip messages initiated by clients to request a server to perform an operation and return the result to the client", + "additionalProperties": { + "type": "object", + "properties": { + "aov:namespace": { + "type": "string" + }, "input": { - "type": "object", - "properties": { - "arg1": { - "type": "string" + "description": "input arguments as properties in object type", + "$ref": "#/definitions/dataSchema_action", + "defaultSnippets": [ + { + "body": { + "type": "object", + "properties": { + "arg1": { + "type": "string" + }, + "arg2": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + } + } + } }, - "arg2": { - "type": "integer", - "minimum": -2147483648, - "maximum": 2147483647 + { + "description": "reference to an external schema definition (must be an object)", + "body": { "dtv:ref": "./EXAMPLESCHEMA.json" } } - } + ] }, "output": { - "type": "object", - "properties": { - "status": { - "type": "string" + "description": "output values as properties in object type", + "$ref": "#/definitions/dataSchema_action", + "defaultSnippets": [ + { + "body": { + "type": "object", + "properties": { + "status": { + "type": "string" + }, + "result": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + } + } + } }, - "result": { - "type": "integer", - "minimum": -2147483648, - "maximum": 2147483647 + { + "description": "reference to an external schema definition (must be an object)", + "body": { "dtv:ref": "./EXAMPLESCHEMA.json" } } - } + ] }, - "forms": [ - { - "href": "dtmi:test:SomeURI;1", - "contentType": "application/json", - "dtv:topic": "example/SomeTopic/DoSomething", - "op": "invokeaction" - } - ] - } - } - } - ] - }, - "events": { - "type": "object", - "description": "events are one-way messages sent from servers to clients to indicate occurrences and status changes", - "additionalProperties": { - "type": "object", - "required": [ "data" ], - "properties": { - "data": { - "$ref": "#/definitions/dataSchema_affordance", - "description": "the data schema of the event" - }, - "dtv:placeholder": { - "type": "boolean", - "description": "true if the event is a placeholder for a dynamic collection of events" - }, - "forms": { - "type": "array", - "minItems": 1, - "items": { - "$ref": "#/definitions/form_element_event" - }, - "defaultSnippets": [ - { - "description": "example 'forms' value for events", - "body": [ + "idempotent": { + "type": "boolean", + "description": "true if the action is idempotent" + }, + "safe": { + "type": "boolean", + "description": "true if caching the action's output is safe" + }, + "aov:memberOf": { + "description": "name of a group of actions to which this action belongs", + "type": "string" + }, + "forms": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/form_element_action" + }, + "defaultSnippets": [ { - "href": "dtmi:test:SomeURI;1", - "contentType": "application/json", - "dtv:topic": "example/SomeTopic/MyEvent", - "op": "subscribeevent" + "description": "example 'forms' value for actions", + "body": [ + { + "contentType": "application/json", + "dtv:topic": "example/SomeTopic/DoSomething", + "op": "invokeaction" + } + ] } ] } - ] - } - } - }, - "defaultSnippets": [ - { - "description": "example 'events' value", - "body": { - "MyEvent": { + } + }, + "defaultSnippets": [ + { + "description": "example 'actions' value", + "body": { + "MyAction": { + "input": { + "type": "object", + "properties": { + "arg1": { + "type": "string" + }, + "arg2": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + } + } + }, + "output": { + "type": "object", + "properties": { + "status": { + "type": "string" + }, + "result": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + } + } + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "example/SomeTopic/DoSomething", + "op": "invokeaction" + } + ] + } + } + } + ] + }, + "events": { + "type": "object", + "description": "events are one-way messages sent from servers to clients to indicate occurrences and status changes", + "additionalProperties": { + "type": "object", + "required": [ "data" ], + "properties": { "data": { - "type": "integer", - "minimum": -2147483648, - "maximum": 2147483647 + "$ref": "#/definitions/dataSchema_affordance", + "description": "the data schema of the event" }, - "forms": [ - { - "href": "dtmi:test:SomeURI;1", - "contentType": "application/json", - "dtv:topic": "example/SomeTopic/MyEvent", - "op": "subscribeevent" + "aov:namespace": { + "type": "string" + }, + "aov:contains": { + "description": "list of names of other event affordances that this event logically contains", + "type": "array", + "items": { + "type": "string" } - ] + }, + "aov:containedIn": { + "description": "name of another event affordance in which this event is logically contained", + "type": "string" + }, + "dtv:placeholder": { + "type": "boolean", + "description": "true if the event is a placeholder for a dynamic collection of events" + }, + "forms": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/form_element_event" + }, + "defaultSnippets": [ + { + "description": "example 'forms' value for events", + "body": [ + { + "contentType": "application/json", + "dtv:topic": "example/SomeTopic/MyEvent", + "op": "subscribeevent" + } + ] + } + ] + } } - } + }, + "defaultSnippets": [ + { + "description": "example 'events' value", + "body": { + "MyEvent": { + "data": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "example/SomeTopic/MyEvent", + "op": "subscribeevent" + } + ] + } + } + } + ] } - ] + } } + ] + } + }, + "anyOf": [ + { + "$ref": "#/definitions/aioThingModel" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/aioThingModel" } } ] diff --git a/codegen2/test/thing-models/.vscode/settings.json b/codegen2/test/thing-models/.vscode/settings.json index 3e93c0bd92..8ce7a1138b 100644 --- a/codegen2/test/thing-models/.vscode/settings.json +++ b/codegen2/test/thing-models/.vscode/settings.json @@ -3,7 +3,7 @@ "json.schemas": [ { "fileMatch": [ "**/*.TM.json" ], - "url": "../../../schema/aio-tm-json-schema.json" + "url": "../../schema/aio-tm-json-schema.json" } ] } From c373893e6425adc013abdf0814b217265bc6616a Mon Sep 17 00:00:00 2001 From: "John (JD) Douceur" Date: Tue, 20 Jan 2026 13:56:43 -0800 Subject: [PATCH 42/52] support Golden Path properties in ProtocolCompiler --- .../TDValues.cs | 12 + .../ThingValidator.cs | 614 +++++++++++++++--- .../Model/TDAction.cs | 36 +- .../Model/TDCommon.cs | 13 + .../Model/TDDataSchema.cs | 64 +- .../Model/TDEvent.cs | 50 +- .../Model/TDForm.cs | 2 +- .../Model/TDLink.cs | 17 +- .../Model/TDProperty.cs | 44 +- .../Model/TDSchemaReference.cs | 2 +- .../Model/TDThing.cs | 52 +- .../test-cases/failure/LinkTypeNotJson.json | 2 +- .../SchemaDefinitionIntegerMaxNotInteger.json | 2 +- .../SchemaDefinitionIntegerMinNotInteger.json | 2 +- 14 files changed, 780 insertions(+), 132 deletions(-) create mode 100644 codegen2/src/Azure.Iot.Operations.TDParser/Model/TDCommon.cs diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/TDValues.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/TDValues.cs index fac4cc3414..c656bece5b 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/TDValues.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/TDValues.cs @@ -4,8 +4,20 @@ public static class TDValues { + public const string ContextUriWotTd = "https://www.w3.org/2022/wot/td/v1.1"; + public const string ContextUriAioProtocol = "http://azure.com/DigitalTwins/dtmi#"; + public const string ContextUriAioPlatform = "http://azure.com/IoT/operations/tm"; + public const string ContextPrefixAioProtocol = "dtv"; + public const string ContextPrefixAioPlatform = "aov"; + + public const string RelationExtends = "tm:extends"; + public const string RelationReference = "aov:reference"; + public const string RelationTypedReference = "aov:typedReference"; + public const string RelationCapability = "aov:capability"; + public const string RelationComponent = "aov:component"; public const string RelationSchemaNaming = "dtv:naming"; + public const string ContentTypeTmJson = "application/tm+json"; public const string ContentTypeJson = "application/json"; public const string ContentTypeRaw = "application/octet-stream"; public const string ContentTypeCustom = ""; diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs index 63420e9aed..9e6efb96c8 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs @@ -9,10 +9,6 @@ public class ThingValidator { - private const string TdContextUri = "https://www.w3.org/2022/wot/td/v1.1"; - private const string AioContextUriBase = "http://azure.com/DigitalTwins/dtmi#"; - private const string AioContextPrefix = "dtv"; - private const string Iso8601DurationExample = "P3Y6M4DT12H30M5S"; private const string DecimalExample = "1234567890.0987654321"; private const string AnArbitraryString = "Pretty12345Tricky67890"; @@ -32,10 +28,11 @@ public bool TryValidateThng(TDThing thing, HashSet serializ { bool hasError = false; - if (!TryValidateContext(thing.Context)) + if (!TryValidateContext(thing.Context, out bool platContextPresent)) { hasError = true; } + long contextTokenIndex = thing.Context?.TokenIndex ?? -1; if (!TryValidateType(thing.Type)) { @@ -47,12 +44,22 @@ public bool TryValidateThng(TDThing thing, HashSet serializ hasError = true; } - if (!TryValidateLinks(thing.Links)) + if (!TryValidateCompositeAndEvent(thing.IsComposite, thing.IsEvent, platContextPresent, contextTokenIndex)) + { + hasError = true; + } + + if (!TryValidateTypeRef(thing.TypeRef, platContextPresent, contextTokenIndex)) + { + hasError = true; + } + + if (!TryValidateLinks(thing.Links, platContextPresent, contextTokenIndex)) { hasError = true; } - if (!TryValidateSchemaDefinitions(thing.SchemaDefinitions)) + if (!TryValidateSchemaDefinitions(thing.SchemaDefinitions, platContextPresent, contextTokenIndex)) { hasError = true; } @@ -62,17 +69,17 @@ public bool TryValidateThng(TDThing thing, HashSet serializ hasError = true; } - if (!TryValidateActions(thing.Actions, thing.SchemaDefinitions, serializationFormats)) + if (!TryValidateActions(thing.Actions, thing.SchemaDefinitions, serializationFormats, platContextPresent, contextTokenIndex)) { hasError = true; } - if (!TryValidateProperties(thing.Properties, thing.SchemaDefinitions, serializationFormats)) + if (!TryValidateProperties(thing.Properties, thing.SchemaDefinitions, serializationFormats, platContextPresent, contextTokenIndex)) { hasError = true; } - if (!TryValidateEvents(thing.Events, thing.SchemaDefinitions, serializationFormats)) + if (!TryValidateEvents(thing.Events, thing.SchemaDefinitions, serializationFormats, platContextPresent, contextTokenIndex)) { hasError = true; } @@ -106,7 +113,7 @@ public bool TryValidateThng(TDThing thing, HashSet serializ if ((thing.Actions?.Entries?.Count ?? 0) == 0 && (thing.Properties?.Entries?.Count ?? 0) == 0 && (thing.Events?.Entries?.Count ?? 0) == 0) { - errorReporter.ReportWarning("Thing Description has no actions, properties, or events defined.", -1); + errorReporter.ReportWarning("Thing Model has no actions, properties, or events defined.", -1); } return !hasError; @@ -128,9 +135,12 @@ private bool TryValidateThingPropertyNames(Dictionary propertyName propertyName.Key != TDThing.OptionalName && propertyName.Key != TDThing.ActionsName && propertyName.Key != TDThing.PropertiesName && - propertyName.Key != TDThing.EventsName) + propertyName.Key != TDThing.EventsName && + propertyName.Key != TDThing.IsCompositeName && + propertyName.Key != TDThing.IsEventName && + propertyName.Key != TDThing.TypeRefName) { - if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{TDValues.ContextPrefixAioProtocol}:") && !propertyName.Key.StartsWith($"{TDValues.ContextPrefixAioPlatform}:")) { errorReporter.ReportWarning($"Thing has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); } @@ -264,7 +274,7 @@ private bool TryValidateCrossFormConsistency(ArrayTracker? rootForms, Ma { if (properties?.Entries == null || properties.Entries.Count == 0) { - errorReporter.ReportError(ErrorCondition.Unusable, $"Root-level form has '{TDForm.OpName}' property with value '{TDValues.OpReadAllProps}' to read the aggregation of all properties, but Thing Description has no properties defined.", + errorReporter.ReportError(ErrorCondition.Unusable, $"Root-level form has '{TDForm.OpName}' property with value '{TDValues.OpReadAllProps}' to read the aggregation of all properties, but Thing Model has no properties defined.", readAllForm.Value.Op!.Elements!.First(op => op.Value.Value == TDValues.OpReadAllProps).TokenIndex, properties?.TokenIndex ?? -1); hasError = true; @@ -281,7 +291,7 @@ private bool TryValidateCrossFormConsistency(ArrayTracker? rootForms, Ma { if (properties?.Entries == null || properties.Entries.Count(p => p.Value.Value.ReadOnly?.Value.Value != true && (p.Value.Value.Forms?.Elements?.Any(f => f.Value.Op?.Elements?.Any(op => op.Value.Value == TDValues.OpWriteProp) ?? true) ?? true)) == 0) { - errorReporter.ReportError(ErrorCondition.Unusable, $"Root-level form has '{TDForm.OpName}' property with value '{TDValues.OpWriteMultProps}' to write a selected aggregation of writable properties, but Thing Description has no writable properties.", + errorReporter.ReportError(ErrorCondition.Unusable, $"Root-level form has '{TDForm.OpName}' property with value '{TDValues.OpWriteMultProps}' to write a selected aggregation of writable properties, but Thing Model has no writable properties.", writeMultiForm.Value.Op!.Elements!.First(op => op.Value.Value == TDValues.OpWriteMultProps).TokenIndex, properties?.TokenIndex ?? -1); hasError = true; @@ -388,7 +398,7 @@ private bool TryValidateCrossFormConsistency(ArrayTracker? rootForms, Ma { if (subAllForm != null) { - errorReporter.ReportError(ErrorCondition.Unusable, $"Root-level form has '{TDForm.OpName}' property with value '{TDValues.OpSubAllEvents}' to subscribe to the aggregation of all events, but Thing Description has no events defined.", + errorReporter.ReportError(ErrorCondition.Unusable, $"Root-level form has '{TDForm.OpName}' property with value '{TDValues.OpSubAllEvents}' to subscribe to the aggregation of all events, but Thing Model has no events defined.", subAllForm.Value.Op!.Elements!.First(op => op.Value.Value == TDValues.OpSubAllEvents).TokenIndex, events?.TokenIndex ?? -1); hasError = true; @@ -411,25 +421,25 @@ private bool TryValidateCrossFormConsistency(ArrayTracker? rootForms, Ma return !hasError; } - private bool TryValidateContext(ArrayTracker? context) + private bool TryValidateContext(ArrayTracker? context, out bool platContextPresent) { + platContextPresent = false; + bool protContextPresent = false; + bool tdContextPresent = false; bool hasError = false; if (context?.Elements == null) { - errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Thing Description is missing required '{TDThing.ContextName}' property.", -1); + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Thing Model is missing required '{TDThing.ContextName}' property.", -1); return false; } - bool tdContextPresent = false; - bool aioContextPresent = false; - foreach (ValueTracker contextSpecifier in context.Elements) { if (contextSpecifier.Value?.Remote?.Value != null) { string remoteContext = contextSpecifier.Value.Remote.Value.Value; - if (remoteContext != TdContextUri) + if (remoteContext != TDValues.ContextUriWotTd) { errorReporter.ReportWarning($"Unrecognized remote {TDThing.ContextName} \"{remoteContext}\"; value will be ignored.", contextSpecifier.TokenIndex); } @@ -442,19 +452,27 @@ private bool TryValidateContext(ArrayTracker? context) { foreach (KeyValuePair> localContext in contextSpecifier.Value.Local.Entries) { - string prefix = localContext.Key; - if (localContext.Key != AioContextPrefix) - { - errorReporter.ReportWarning($"Unrecognized local {TDThing.ContextName} term \"{localContext.Key}\"; value will be ignored.", contextSpecifier.TokenIndex); - } - else if (localContext.Value.Value.Value != AioContextUriBase) - { - errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Local {TDThing.ContextName} term \"{localContext.Key}\" has incorrect URI value \"{localContext.Value.Value.Value}\".", contextSpecifier.TokenIndex); - hasError = true; - } - else + switch (localContext.Key) { - aioContextPresent = true; + case TDValues.ContextPrefixAioProtocol: + protContextPresent = true; + if (localContext.Value.Value.Value != TDValues.ContextUriAioProtocol) + { + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Local {TDThing.ContextName} term \"{localContext.Key}\" has incorrect URI value \"{localContext.Value.Value.Value}\"; value must be \"{TDValues.ContextUriAioProtocol}\".", contextSpecifier.TokenIndex); + hasError = true; + } + break; + case TDValues.ContextPrefixAioPlatform: + platContextPresent = true; + if (localContext.Value.Value.Value != TDValues.ContextUriAioPlatform) + { + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Local {TDThing.ContextName} term \"{localContext.Key}\" has incorrect URI value \"{localContext.Value.Value.Value}\"; value must be \"{TDValues.ContextUriAioPlatform}\".", contextSpecifier.TokenIndex); + hasError = true; + } + break; + default: + errorReporter.ReportWarning($"Unrecognized local {TDThing.ContextName} term \"{localContext.Key}\"; value will be ignored.", contextSpecifier.TokenIndex); + break; } } } @@ -462,13 +480,13 @@ private bool TryValidateContext(ArrayTracker? context) if (!tdContextPresent) { - errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Thing Description is missing required '{TDThing.ContextName}' remote URI \"{TdContextUri}\".", context.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Thing Model is missing required '{TDThing.ContextName}' remote URI \"{TDValues.ContextUriWotTd}\".", context.TokenIndex); hasError = true; } - if (!aioContextPresent) + if (!protContextPresent) { - errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Thing Description is missing required '{TDThing.ContextName}' local term \"{AioContextPrefix}\" with URI value \"{AioContextUriBase}\".", context.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Thing Model is missing required '{TDThing.ContextName}' local term \"{TDValues.ContextPrefixAioProtocol}\" with URI value \"{TDValues.ContextUriAioProtocol}\".", context.TokenIndex); hasError = true; } @@ -479,19 +497,19 @@ private bool TryValidateType(ValueTracker? type) { if (type == null) { - errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Thing Description is missing required '{TDThing.TypeName}' property.", -1); + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Thing Model is missing required '{TDThing.TypeName}' property.", -1); return false; } if (string.IsNullOrWhiteSpace(type.Value.Value)) { - errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Thing Description '{TDThing.TypeName}' property has empty value.", type.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Thing Model '{TDThing.TypeName}' property has empty value.", type.TokenIndex); return false; } if (type.Value.Value != TDValues.TypeThingModel) { - errorReporter?.ReportError(ErrorCondition.PropertyInvalid, $"Thing Description '{TDThing.TypeName}' property value '{type.Value.Value}' is not correct; value must be `{TDValues.TypeThingModel}`.", type.TokenIndex); + errorReporter?.ReportError(ErrorCondition.PropertyInvalid, $"Thing Model '{TDThing.TypeName}' property value '{type.Value.Value}' is not correct; value must be `{TDValues.TypeThingModel}`.", type.TokenIndex); return false; } @@ -502,26 +520,79 @@ private bool TryValidateTitle(ValueTracker? title) { if (title == null) { - errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Thing Description is missing required '{TDThing.TitleName}' property.", -1); + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Thing Model is missing required '{TDThing.TitleName}' property.", -1); return false; } if (string.IsNullOrWhiteSpace(title.Value.Value)) { - errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Thing Description '{TDThing.TitleName}' property has empty value.", title.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Thing Model '{TDThing.TitleName}' property has empty value.", title.TokenIndex); return false; } if (!TitleRegex.IsMatch(title.Value.Value)) { - errorReporter?.ReportError(ErrorCondition.PropertyInvalid, $"Thing Description '{TDThing.TitleName}' property value \"{title.Value.Value}\" does not conform to codegen type naming rules -- it must start with an uppercase letter and contain only alphanumeric characters", title.TokenIndex); + errorReporter?.ReportError(ErrorCondition.PropertyInvalid, $"Thing Model '{TDThing.TitleName}' property value \"{title.Value.Value}\" does not conform to codegen type naming rules -- it must start with an uppercase letter and contain only alphanumeric characters", title.TokenIndex); + return false; + } + + return true; + } + + private bool TryValidateCompositeAndEvent(ValueTracker? isComposite, ValueTracker? isEvent, bool platContextPresent, long contextTokenIndex) + { + bool hasError = false; + + if (isComposite != null) + { + if (!platContextPresent) + { + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Thing Model '{TDThing.IsCompositeName}' property requires the Azure Operations Platform context in the '{TDThing.ContextName}' property.", isComposite.TokenIndex, contextTokenIndex); + hasError = true; + } + } + + if (isEvent != null) + { + if (!platContextPresent) + { + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Thing Model '{TDThing.IsEventName}' property requires the Azure Operations Platform context in the '{TDThing.ContextName}' property.", isEvent.TokenIndex, contextTokenIndex); + hasError = true; + } + } + + if (isComposite?.Value.Value == true && isEvent?.Value.Value == true) + { + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"Thing Model '{TDThing.IsCompositeName}' property cannot be true if '{TDThing.IsEventName}' property is true.", isComposite.TokenIndex, isEvent.TokenIndex); + hasError = true; + } + + return !hasError; + } + + private bool TryValidateTypeRef(ValueTracker? typeRef, bool platContextPresent, long contextTokenIndex) + { + if (typeRef == null) + { + return true; + } + + if (!platContextPresent) + { + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Thing Model '{TDThing.TypeRefName}' property requires the Azure Operations Platform context in the '{TDThing.ContextName}' property.", typeRef.TokenIndex, contextTokenIndex); + return false; + } + + if (string.IsNullOrWhiteSpace(typeRef.Value.Value)) + { + errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Thing Model '{TDThing.TypeRefName}' property has empty value.", typeRef.TokenIndex); return false; } return true; } - private bool TryValidateLinks(ArrayTracker? links) + private bool TryValidateLinks(ArrayTracker? links, bool platContextPresent, long contextTokenIndex) { if (links?.Elements == null) { @@ -538,46 +609,94 @@ private bool TryValidateLinks(ArrayTracker? links) errorReporter.ReportWarning($"Link element is missing '{TDLink.RelName}' property; element will be ignored.", link.TokenIndex); continue; } - if (link.Value.Rel.Value.Value != TDValues.RelationSchemaNaming) + + if (link.Value.Rel.Value.Value != TDValues.RelationExtends && + link.Value.Rel.Value.Value != TDValues.RelationReference && + link.Value.Rel.Value.Value != TDValues.RelationTypedReference && + link.Value.Rel.Value.Value != TDValues.RelationCapability && + link.Value.Rel.Value.Value != TDValues.RelationComponent && + link.Value.Rel.Value.Value != TDValues.RelationSchemaNaming) { - errorReporter.ReportWarning($"Link element {TDLink.RelName} property has unrecognized value '{link.Value.Rel.Value.Value}'; element will be ignored.", link.Value.Rel.TokenIndex); + errorReporter.ReportWarning($"Link element '{TDLink.RelName}' property has unrecognized value '{link.Value.Rel.Value.Value}'; element will be ignored.", link.Value.Rel.TokenIndex); continue; } - relSchemaNamerCount++; + if (link.Value.Rel.Value.Value.StartsWith($"{TDValues.ContextPrefixAioPlatform}:") && !platContextPresent) + { + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Link element '{TDLink.RelName}' property has value '{link.Value.Rel.Value.Value}', which requires the Azure Operations Platform context in the '{TDThing.ContextName}' property.", link.Value.Rel.TokenIndex, contextTokenIndex); + hasError = true; + } + + if (link.Value.Rel.Value.Value == TDValues.RelationSchemaNaming) + { + relSchemaNamerCount++; + } + + string requiredContentType = link.Value.Rel.Value.Value switch + { + TDValues.RelationExtends => TDValues.ContentTypeTmJson, + TDValues.RelationReference => TDValues.ContentTypeTmJson, + TDValues.RelationTypedReference => TDValues.ContentTypeTmJson, + TDValues.RelationCapability => TDValues.ContentTypeTmJson, + TDValues.RelationComponent => TDValues.ContentTypeTmJson, + TDValues.RelationSchemaNaming => TDValues.ContentTypeJson, + _ => throw new NotSupportedException($"Unsupported '{TDLink.RelName}' property value '{link.Value.Rel.Value.Value}'"), + }; + + if (link.Value.RefType == null) + { + if (link.Value.Rel.Value.Value == TDValues.RelationTypedReference) + { + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Link element with {TDLink.RelName}='{link.Value.Rel.Value.Value}' is missing required '{TDLink.RefTypeName}' property.", link.TokenIndex); + hasError = true; + } + } + else + { + if (link.Value.Rel.Value.Value != TDValues.RelationTypedReference) + { + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"Link element with {TDLink.RelName}='{link.Value.Rel.Value.Value}' does not support '{TDLink.RefTypeName}' property.", link.TokenIndex); + hasError = true; + } + else if (string.IsNullOrWhiteSpace(link.Value.RefType.Value.Value)) + { + errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Link element with {TDLink.RelName}='{link.Value.Rel.Value.Value}' has empty '{TDLink.RefTypeName}' property value.", link.Value.RefType.TokenIndex); + hasError = true; + } + } if (link.Value.Href == null) { - errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Link element with {TDLink.RelName}='{TDValues.RelationSchemaNaming}' is missing required '{TDLink.HrefName}' property.", link.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Link element with {TDLink.RelName}='{link.Value.Rel.Value.Value}' is missing required '{TDLink.HrefName}' property.", link.TokenIndex); hasError = true; } else if (string.IsNullOrWhiteSpace(link.Value.Href.Value.Value)) { - errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Link element with {TDLink.RelName}='{TDValues.RelationSchemaNaming}' has empty '{TDLink.HrefName}' property value.", link.Value.Href.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Link element with {TDLink.RelName}='{link.Value.Rel.Value.Value}' has empty '{TDLink.HrefName}' property value.", link.Value.Href.TokenIndex); hasError = true; } if (link.Value.Type == null) { - errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Link element with {TDLink.RelName}='{TDValues.RelationSchemaNaming}' is missing required '{TDLink.TypeName}' property.", link.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Link element with {TDLink.RelName}='{link.Value.Rel.Value.Value}' is missing required '{TDLink.TypeName}' property.", link.TokenIndex); hasError = true; } else if (string.IsNullOrWhiteSpace(link.Value.Type.Value.Value)) { - errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Link element with {TDLink.RelName}='{TDValues.RelationSchemaNaming}' has empty '{TDLink.TypeName}' property value.", link.Value.Type.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Link element with {TDLink.RelName}='{link.Value.Rel.Value.Value}' has empty '{TDLink.TypeName}' property value.", link.Value.Type.TokenIndex); hasError = true; } - else if (link.Value.Type.Value.Value != TDValues.ContentTypeJson) + else if (link.Value.Type.Value.Value != requiredContentType) { - errorReporter.ReportError(ErrorCondition.PropertyUnsupportedValue, $"Link element with {TDLink.RelName}='{TDValues.RelationSchemaNaming}' has '{TDLink.TypeName}' property with unsupported value '{link.Value.Type.Value.Value}'.", link.Value.Type.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyUnsupportedValue, $"Link element with {TDLink.RelName}='{link.Value.Rel.Value.Value}' has '{TDLink.TypeName}' property with unsupported value '{link.Value.Type.Value.Value}'; expected '{requiredContentType}'.", link.Value.Type.TokenIndex, link.Value.Rel.TokenIndex); hasError = true; } foreach (KeyValuePair propertyName in link.Value.PropertyNames) { - if (propertyName.Key != TDLink.HrefName && propertyName.Key != TDLink.TypeName && propertyName.Key != TDLink.RelName) + if (propertyName.Key != TDLink.HrefName && propertyName.Key != TDLink.TypeName && propertyName.Key != TDLink.RelName && propertyName.Key != TDLink.RefTypeName) { - if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{TDValues.ContextPrefixAioProtocol}:")) { errorReporter.ReportWarning($"Link has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); } @@ -592,14 +711,14 @@ private bool TryValidateLinks(ArrayTracker? links) if (relSchemaNamerCount > 1) { - errorReporter.ReportError(ErrorCondition.Duplication, $"Thing Description has multiple links with '{TDLink.RelName}' property value '{TDValues.RelationSchemaNaming}'; only one is allowed.", links.TokenIndex); + errorReporter.ReportError(ErrorCondition.Duplication, $"Thing Model has multiple links with '{TDLink.RelName}' property value '{TDValues.RelationSchemaNaming}'; only one is allowed.", links.TokenIndex); hasError = true; } return !hasError; } - private bool TryValidateSchemaDefinitions(MapTracker? schemaDefinitions) + private bool TryValidateSchemaDefinitions(MapTracker? schemaDefinitions, bool platContextPresent, long contextTokenIndex) { if (schemaDefinitions?.Entries == null) { @@ -610,7 +729,7 @@ private bool TryValidateSchemaDefinitions(MapTracker? schemaDefini foreach (KeyValuePair> schemaDefinition in schemaDefinitions.Entries) { - if (!TryValidateDataSchema(schemaDefinition.Value, null, DataSchemaKind.SchemaDefinition)) + if (!TryValidateDataSchema(schemaDefinition.Value, null, platContextPresent, contextTokenIndex, DataSchemaKind.SchemaDefinition)) { hasError = true; } @@ -619,7 +738,7 @@ private bool TryValidateSchemaDefinitions(MapTracker? schemaDefini return !hasError; } - private bool TryValidateActions(MapTracker? actions, MapTracker? schemaDefinitions, HashSet serializationFormats) + private bool TryValidateActions(MapTracker? actions, MapTracker? schemaDefinitions, HashSet serializationFormats, bool platContextPresent, long contextTokenIndex) { if (actions?.Entries == null) { @@ -630,7 +749,7 @@ private bool TryValidateActions(MapTracker? actions, MapTracker> action in actions.Entries) { - if (!TryValidateAction(action.Key, action.Value, schemaDefinitions, out ValueTracker? contentType)) + if (!TryValidateAction(action.Key, action.Value, schemaDefinitions, out ValueTracker? contentType, platContextPresent, contextTokenIndex)) { hasError = true; } @@ -643,7 +762,7 @@ private bool TryValidateActions(MapTracker? actions, MapTracker action, MapTracker? schemaDefinitions, out ValueTracker? contentType) + private bool TryValidateAction(string name, ValueTracker action, MapTracker? schemaDefinitions, out ValueTracker? contentType, bool platContextPresent, long contextTokenIndex) { if (!TryValidateForms(action.Value.Forms, FormsKind.Action, schemaDefinitions, out contentType)) { @@ -652,21 +771,51 @@ private bool TryValidateAction(string name, ValueTracker action, MapTr bool hasError = false; - if (action.Value.Input != null && !TryValidateActionDataSchema(action.Value.Input, TDAction.InputName, contentType)) + if (action.Value.Namespace != null) + { + if (!platContextPresent) + { + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Action element '{TDAction.NamespaceName}' property requires the Azure Operations Platform context in the '{TDThing.ContextName}' property.", action.Value.Namespace.TokenIndex, contextTokenIndex); + hasError = true; + } + + if (string.IsNullOrWhiteSpace(action.Value.Namespace.Value.Value)) + { + errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Action element '{TDAction.NamespaceName}' property has empty value.", action.Value.Namespace.TokenIndex); + hasError = true; + } + } + + if (action.Value.MemberOf != null) + { + if (!platContextPresent) + { + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Action element '{TDAction.MemberOfName}' property requires the Azure Operations Platform context in the '{TDThing.ContextName}' property.", action.Value.MemberOf.TokenIndex, contextTokenIndex); + hasError = true; + } + + if (string.IsNullOrWhiteSpace(action.Value.MemberOf.Value.Value)) + { + errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Action element '{TDAction.MemberOfName}' property has empty value.", action.Value.MemberOf.TokenIndex); + hasError = true; + } + } + + if (action.Value.Input != null && !TryValidateActionDataSchema(action.Value.Input, TDAction.InputName, contentType, platContextPresent, contextTokenIndex)) { hasError = true; } - if (action.Value.Output != null && !TryValidateActionDataSchema(action.Value.Output, TDAction.OutputName, contentType)) + if (action.Value.Output != null && !TryValidateActionDataSchema(action.Value.Output, TDAction.OutputName, contentType, platContextPresent, contextTokenIndex)) { hasError = true; } foreach (KeyValuePair propertyName in action.Value.PropertyNames) { - if (propertyName.Key != TDAction.DescriptionName && propertyName.Key != TDAction.InputName && propertyName.Key != TDAction.OutputName && propertyName.Key != TDAction.IdempotentName && propertyName.Key != TDAction.SafeName && propertyName.Key != TDAction.FormsName) + if (propertyName.Key != TDAction.DescriptionName && propertyName.Key != TDAction.InputName && propertyName.Key != TDAction.OutputName && propertyName.Key != TDAction.IdempotentName && propertyName.Key != TDAction.SafeName && propertyName.Key != TDAction.FormsName && propertyName.Key != TDAction.NamespaceName && propertyName.Key != TDAction.MemberOfName) { - if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{TDValues.ContextPrefixAioProtocol}:")) { errorReporter.ReportWarning($"Action '{name}' has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); } @@ -681,7 +830,7 @@ private bool TryValidateAction(string name, ValueTracker action, MapTr return !hasError; } - private bool TryValidateActionDataSchema(ValueTracker dataSchema, string propertyName, ValueTracker? contentType) + private bool TryValidateActionDataSchema(ValueTracker dataSchema, string propertyName, ValueTracker? contentType, bool platContextPresent, long contextTokenIndex) where T : TDDataSchema, IDeserializable { bool isStructuredObject = dataSchema.Value.Type?.Value.Value == TDValues.TypeObject && dataSchema.Value.Properties != null; @@ -693,10 +842,10 @@ private bool TryValidateActionDataSchema(ValueTracker dataSchema, string p return false; } - return TryValidateDataSchema(dataSchema, null, DataSchemaKind.Action, contentType); + return TryValidateDataSchema(dataSchema, null, platContextPresent, contextTokenIndex, DataSchemaKind.Action, contentType); } - private bool TryValidateProperties(MapTracker? properties, MapTracker? schemaDefinitions, HashSet serializationFormats) + private bool TryValidateProperties(MapTracker? properties, MapTracker? schemaDefinitions, HashSet serializationFormats, bool platContextPresent, long contextTokenIndex) { if (properties?.Entries == null) { @@ -707,7 +856,7 @@ private bool TryValidateProperties(MapTracker? properties, MapTracke foreach (KeyValuePair> property in properties.Entries) { - if (!TryValidateProperty(property.Key, property.Value, schemaDefinitions, out ValueTracker? contentType)) + if (!TryValidateProperty(property.Key, property.Value, schemaDefinitions, out ValueTracker? contentType, platContextPresent, contextTokenIndex)) { hasError = true; } @@ -717,22 +866,80 @@ private bool TryValidateProperties(MapTracker? properties, MapTracke } } + if (!hasError) + { + Dictionary> containsMap = properties.Entries.Where(e => e.Value.Value.Contains != null).ToDictionary(e => e.Key, e => e.Value.Value.Contains!); + Dictionary> containedInMap = properties.Entries.Where(e => e.Value.Value.ContainedIn != null).ToDictionary(e => e.Key, e => e.Value.Value.ContainedIn!); + + if (!TryValidateContainmentConsistency("Property", containsMap, containedInMap, properties.Entries.Keys, properties.TokenIndex)) + { + hasError = true; + } + } + return !hasError; } - private bool TryValidateProperty(string name, ValueTracker property, MapTracker? schemaDefinitions, out ValueTracker? contentType) + private bool TryValidateProperty(string name, ValueTracker property, MapTracker? schemaDefinitions, out ValueTracker? contentType, bool platContextPresent, long contextTokenIndex) { if (!TryValidatePropertyForms(name, property.Value.Forms, schemaDefinitions, property.Value.ReadOnly, out contentType)) { return false; } - if (!TryValidateDataSchema(property, (propName) => propName == TDProperty.ReadOnlyName || propName == TDProperty.PlaceholderName || propName == TDProperty.FormsName, DataSchemaKind.Property, contentType)) + bool hasError = false; + + if (property.Value.Namespace != null) { - return false; + if (!platContextPresent) + { + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Property element '{TDProperty.NamespaceName}' property requires the Azure Operations Platform context in the '{TDThing.ContextName}' property.", property.Value.Namespace.TokenIndex, contextTokenIndex); + hasError = true; + } + + if (string.IsNullOrWhiteSpace(property.Value.Namespace.Value.Value)) + { + errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Property element '{TDProperty.NamespaceName}' property has empty value.", property.Value.Namespace.TokenIndex); + hasError = true; + } } - return true; + if (property.Value.Contains?.Elements != null) + { + if (!platContextPresent) + { + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Property element '{TDProperty.ContainsName}' property requires the Azure Operations Platform context in the '{TDThing.ContextName}' property.", property.Value.Contains.TokenIndex, contextTokenIndex); + hasError = true; + } + + if (property.Value.Contains.Elements.Count == 0) + { + errorReporter.ReportError(ErrorCondition.ElementMissing, $"Property element '{TDProperty.ContainsName}' array value contains no elements.", property.Value.Contains.TokenIndex); + hasError = true; + } + } + + if (property.Value.ContainedIn != null) + { + if (!platContextPresent) + { + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Property element '{TDProperty.ContainedInName}' property requires the Azure Operations Platform context in the '{TDThing.ContextName}' property.", property.Value.ContainedIn.TokenIndex, contextTokenIndex); + hasError = true; + } + + if (string.IsNullOrWhiteSpace(property.Value.ContainedIn.Value.Value)) + { + errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Property element '{TDProperty.ContainedInName}' property has empty value.", property.Value.ContainedIn.TokenIndex); + hasError = true; + } + } + + if (!TryValidateDataSchema(property, (propName) => propName == TDProperty.ReadOnlyName || propName == TDProperty.PlaceholderName || propName == TDProperty.FormsName || propName == TDProperty.ContainsName || propName == TDProperty.ContainedInName || propName == TDProperty.NamespaceName, platContextPresent, contextTokenIndex, DataSchemaKind.Property, contentType)) + { + hasError = true; + } + + return !hasError; } private bool TryValidatePropertyForms(string name, ArrayTracker? forms, MapTracker? schemaDefinitions, ValueTracker? readOnly, out ValueTracker? contentType) @@ -789,7 +996,7 @@ private bool TryValidatePropertyForms(string name, ArrayTracker? forms, return !hasError; } - private bool TryValidateEvents(MapTracker? evts, MapTracker? schemaDefinitions, HashSet serializationFormats) + private bool TryValidateEvents(MapTracker? evts, MapTracker? schemaDefinitions, HashSet serializationFormats, bool platContextPresent, long contextTokenIndex) { if (evts?.Entries == null) { @@ -800,7 +1007,7 @@ private bool TryValidateEvents(MapTracker? evts, MapTracker> evt in evts.Entries) { - if (!TryValidateEvent(evt.Key, evt.Value, schemaDefinitions, out ValueTracker? contentType)) + if (!TryValidateEvent(evt.Key, evt.Value, schemaDefinitions, out ValueTracker? contentType, platContextPresent, contextTokenIndex)) { hasError = true; } @@ -810,10 +1017,21 @@ private bool TryValidateEvents(MapTracker? evts, MapTracker> containsMap = evts.Entries.Where(e => e.Value.Value.Contains != null).ToDictionary(e => e.Key, e => e.Value.Value.Contains!); + Dictionary> containedInMap = evts.Entries.Where(e => e.Value.Value.ContainedIn != null).ToDictionary(e => e.Key, e => e.Value.Value.ContainedIn!); + + if (!TryValidateContainmentConsistency("Property", containsMap, containedInMap, evts.Entries.Keys, evts.TokenIndex)) + { + hasError = true; + } + } + return !hasError; } - private bool TryValidateEvent(string name, ValueTracker evt, MapTracker? schemaDefinitions, out ValueTracker? contentType) + private bool TryValidateEvent(string name, ValueTracker evt, MapTracker? schemaDefinitions, out ValueTracker? contentType, bool platContextPresent, long contextTokenIndex) { if (!TryValidateForms(evt.Value.Forms, FormsKind.Event, schemaDefinitions, out contentType)) { @@ -822,16 +1040,55 @@ private bool TryValidateEvent(string name, ValueTracker evt, MapTracker bool hasError = false; - if (evt.Value.Data != null && !TryValidateDataSchema(evt.Value.Data, null, DataSchemaKind.Event, contentType)) + if (evt.Value.Namespace != null) + { + if (!platContextPresent) + { + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Event element '{TDEvent.NamespaceName}' property requires the Azure Operations Platform context in the '{TDThing.ContextName}' property.", evt.Value.Namespace.TokenIndex, contextTokenIndex); + hasError = true; + } + } + + if (evt.Value.Contains?.Elements != null) + { + if (!platContextPresent) + { + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Event element '{TDEvent.ContainsName}' property requires the Azure Operations Platform context in the '{TDThing.ContextName}' property.", evt.Value.Contains.TokenIndex, contextTokenIndex); + hasError = true; + } + + if (evt.Value.Contains.Elements.Count == 0) + { + errorReporter.ReportError(ErrorCondition.ElementMissing, $"Event element '{TDEvent.ContainsName}' array value contains no elements.", evt.Value.Contains.TokenIndex); + hasError = true; + } + } + + if (evt.Value.ContainedIn != null) + { + if (!platContextPresent) + { + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Event element '{TDEvent.ContainedInName}' property requires the Azure Operations Platform context in the '{TDThing.ContextName}' property.", evt.Value.ContainedIn.TokenIndex, contextTokenIndex); + hasError = true; + } + + if (string.IsNullOrWhiteSpace(evt.Value.ContainedIn.Value.Value)) + { + errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Event element '{TDEvent.ContainedInName}' property has empty value.", evt.Value.ContainedIn.TokenIndex); + hasError = true; + } + } + + if (evt.Value.Data != null && !TryValidateDataSchema(evt.Value.Data, null, platContextPresent, contextTokenIndex, DataSchemaKind.Event, contentType)) { hasError = true; } foreach (KeyValuePair propertyName in evt.Value.PropertyNames) { - if (propertyName.Key != TDEvent.DescriptionName && propertyName.Key != TDEvent.DataName && propertyName.Key != TDEvent.PlaceholderName && propertyName.Key != TDEvent.FormsName) + if (propertyName.Key != TDEvent.DescriptionName && propertyName.Key != TDEvent.DataName && propertyName.Key != TDEvent.PlaceholderName && propertyName.Key != TDEvent.FormsName && propertyName.Key != TDEvent.ContainsName && propertyName.Key != TDEvent.ContainedInName && propertyName.Key != TDEvent.NamespaceName) { - if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{TDValues.ContextPrefixAioProtocol}:")) { errorReporter.ReportWarning($"Event '{name}' has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); } @@ -855,7 +1112,7 @@ private bool TryValidateForms(ArrayTracker? forms, FormsKind formsKind, return true; } - if (forms.Elements!.Count == 0) + if (forms.Elements.Count == 0) { errorReporter.ReportError(ErrorCondition.ElementMissing, $"Property '{TDEvent.FormsName}' array value contains no elements; at least one form is required.", forms.TokenIndex); return false; @@ -875,7 +1132,7 @@ private bool TryValidateForms(ArrayTracker? forms, FormsKind formsKind, { if (formContentType.Value.Value != contentType.Value.Value) { - errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"'{TDThing.FormsName}' array contains forms with different '{TDForm.ContentTypeName}' property values '{contentType.Value.Value}' and '{formContentType.Value.Value}'.", contentType.TokenIndex, formContentType.TokenIndex); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"'{TDCommon.FormsName}' array contains forms with different '{TDForm.ContentTypeName}' property values '{contentType.Value.Value}' and '{formContentType.Value.Value}'.", contentType.TokenIndex, formContentType.TokenIndex); hasError = true; } } @@ -894,7 +1151,7 @@ private bool TryValidateForms(ArrayTracker? forms, FormsKind formsKind, ValueTracker? oplessForm = forms.Elements.FirstOrDefault(f => f.Value.Op == null); if (oplessForm != null && forms.Elements.Count > 1) { - errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"'{TDThing.FormsName}' array contains a form with no '{TDForm.OpName}' property, so it must be the only form in the array.", oplessForm.TokenIndex, forms.TokenIndex); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"'{TDCommon.FormsName}' array contains a form with no '{TDForm.OpName}' property, so it must be the only form in the array.", oplessForm.TokenIndex, forms.TokenIndex); return false; } @@ -902,7 +1159,7 @@ private bool TryValidateForms(ArrayTracker? forms, FormsKind formsKind, foreach (IGrouping> dupOpGroup in aggregateOps.GroupBy(op => op.Value.Value).Where(g => g.Count() > 1)) { - errorReporter.ReportError(ErrorCondition.Duplication, $"'{TDThing.FormsName}' array contains '{TDForm.OpName}' properties that duplicate value '{dupOpGroup.Key}'.", dupOpGroup.First().TokenIndex, dupOpGroup.Skip(1).First().TokenIndex); + errorReporter.ReportError(ErrorCondition.Duplication, $"'{TDCommon.FormsName}' array contains '{TDForm.OpName}' properties that duplicate value '{dupOpGroup.Key}'.", dupOpGroup.First().TokenIndex, dupOpGroup.Skip(1).First().TokenIndex); hasError = true; } @@ -952,7 +1209,7 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map { if (formsKind == FormsKind.Root && !(form.Value.Op?.Elements?.Any(op => op.Value.Value == TDValues.OpSubAllEvents) ?? false)) { - errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"'{TDForm.ServiceGroupIdName}' property is not allowed in root-level '{TDThing.FormsName}' property without an '{TDForm.OpName}' property value of '{TDValues.OpSubAllEvents}'.", form.Value.ServiceGroupId.TokenIndex); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"'{TDForm.ServiceGroupIdName}' property is not allowed in root-level '{TDCommon.FormsName}' property without an '{TDForm.OpName}' property value of '{TDValues.OpSubAllEvents}'.", form.Value.ServiceGroupId.TokenIndex); hasError = true; } else if (formsKind == FormsKind.Property) @@ -1134,7 +1391,7 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map { if (propertyName.Key != TDForm.ContentTypeName && propertyName.Key != TDForm.AdditionalResponsesName && propertyName.Key != TDForm.HeaderInfoName && propertyName.Key != TDForm.HeaderCodeName && propertyName.Key != TDForm.ServiceGroupIdName && propertyName.Key != TDForm.TopicName && propertyName.Key != TDForm.OpName) { - if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{TDValues.ContextPrefixAioProtocol}:")) { errorReporter.ReportWarning($"Form has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); } @@ -1150,6 +1407,50 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map return !hasError; } + private bool TryValidateContainmentConsistency(string affordanceType, Dictionary> containsMap, Dictionary> containedInMap, ICollection affordanceKeys, long affordanceTokenIndex) + { + bool hasError = false; + + foreach (KeyValuePair> containsEntry in containsMap) + { + foreach (ValueTracker containedKey in containsEntry.Value.Elements ?? []) + { + if (!affordanceKeys.Contains(containedKey.Value.Value)) + { + errorReporter.ReportError(ErrorCondition.ItemNotFound, $"{affordanceType} '{containsEntry.Key}' declares it contains {affordanceType} '{containedKey.Value.Value}', but no such {affordanceType} in model.", containedKey.TokenIndex, affordanceTokenIndex); + hasError = true; + } + else if (containedInMap.TryGetValue(containedKey.Value.Value, out ValueTracker? container)) + { + if (container.Value.Value != containsEntry.Key) + { + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"{affordanceType} '{containsEntry.Key}' declares it contains {affordanceType} '{containedKey.Value.Value}', but that {affordanceType} declares it is contained in '{container.Value.Value}'.", containedKey.TokenIndex, container.TokenIndex); + hasError = true; + } + } + } + } + + foreach (KeyValuePair> containedInEntry in containedInMap) + { + if (!affordanceKeys.Contains(containedInEntry.Value.Value.Value)) + { + errorReporter.ReportError(ErrorCondition.ItemNotFound, $"{affordanceType} '{containedInEntry.Key}' declares it is contained in {affordanceType} '{containedInEntry.Value.Value.Value}', but no such {affordanceType} in model.", containedInEntry.Value.TokenIndex, affordanceTokenIndex); + hasError = true; + } + else if (containsMap.TryGetValue(containedInEntry.Value.Value.Value, out ArrayTracker? contains)) + { + if (!(contains.Elements?.Any(e => e.Value.Value == containedInEntry.Key) ?? false)) + { + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"{affordanceType} '{containedInEntry.Key}' declares it is contained in {affordanceType} '{containedInEntry.Value.Value.Value}', but that {affordanceType} declares a contained set that does not include '{containedInEntry.Key}'.", containedInEntry.Value.TokenIndex, contains.TokenIndex); + hasError = true; + } + } + } + + return !hasError; + } + private bool TryValidateTopic(ValueTracker topic, FormsKind formsKind, bool hasOpRead, bool hasOpWrite, bool hasOpSub, bool isReadOnly) { FormsKind effectiveFormsKind = formsKind switch @@ -1396,7 +1697,7 @@ private bool TryValidateSchemaReference(ValueTracker schemaRe { if (propertyName.Key != TDSchemaReference.SuccessName && propertyName.Key != TDSchemaReference.ContentTypeName && propertyName.Key != TDSchemaReference.SchemaName) { - if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{TDValues.ContextPrefixAioProtocol}:")) { errorReporter.ReportWarning($"Schema reference has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); } @@ -1411,7 +1712,7 @@ private bool TryValidateSchemaReference(ValueTracker schemaRe return !hasError; } - private bool TryValidateDataSchema(ValueTracker dataSchema, Func? propertyApprover, DataSchemaKind dataSchemaKind = DataSchemaKind.Undistinguished, ValueTracker? contentType = null) + private bool TryValidateDataSchema(ValueTracker dataSchema, Func? propertyApprover, bool platContextPresent, long contextTokenIndex, DataSchemaKind dataSchemaKind = DataSchemaKind.Undistinguished, ValueTracker? contentType = null) where T : TDDataSchema, IDeserializable { if (dataSchema.Value.Ref != null && dataSchemaKind != DataSchemaKind.Action && dataSchemaKind != DataSchemaKind.Property && dataSchemaKind != DataSchemaKind.Event) @@ -1432,6 +1733,21 @@ private bool TryValidateDataSchema(ValueTracker dataSchema, Func(ValueTracker dataSchema, Func(ValueTracker dataSchema, Func< TDDataSchema.RefName, TDDataSchema.TitleName, TDDataSchema.DescriptionName, + TDDataSchema.TypeRefName, }; if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, propertyApprover, "a schema via a reference", tokenIndex)) { @@ -1545,6 +1862,7 @@ private bool TryValidateStringConst(ValueTracker dataSchema, ValueTracker< TDDataSchema.TitleName, TDDataSchema.DescriptionName, TDDataSchema.ConstName, + TDDataSchema.TypeRefName, }; if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, null, "a constant string schema", constProperty.TokenIndex)) { @@ -1591,6 +1909,7 @@ private bool TryValidateNumberConst(ValueTracker dataSchema, ValueTracker< TDDataSchema.MinimumName, TDDataSchema.MaximumName, TDDataSchema.ConstName, + TDDataSchema.TypeRefName, }; if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, null, "a constant number schema", constProperty.TokenIndex)) { @@ -1637,6 +1956,7 @@ private bool TryValidateIntegerConst(ValueTracker dataSchema, ValueTracker TDDataSchema.MinimumName, TDDataSchema.MaximumName, TDDataSchema.ConstName, + TDDataSchema.TypeRefName, }; if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, null, "a constant integer schema", constProperty.TokenIndex)) { @@ -1668,6 +1988,7 @@ private bool TryValidateBooleanConst(ValueTracker dataSchema, ValueTracker TDDataSchema.TitleName, TDDataSchema.DescriptionName, TDDataSchema.ConstName, + TDDataSchema.TypeRefName, }; if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, null, "a constant boolean schema", constProperty.TokenIndex)) { @@ -1685,7 +2006,7 @@ private bool TryValidateResidualProperties(Dictionary propertyName { if (propertyApprover?.Invoke(propertyName.Key) != true && !supportedProperties.Contains(propertyName.Key)) { - if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{AioContextPrefix}:")) + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{TDValues.ContextPrefixAioProtocol}:")) { errorReporter.ReportWarning($"Data schema has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); } @@ -1700,18 +2021,18 @@ private bool TryValidateResidualProperties(Dictionary propertyName return !hasError; } - private bool TryValidateObjectDataSchema(ValueTracker dataSchema, DataSchemaKind dataSchemaKind, Func? propertyApprover) + private bool TryValidateObjectDataSchema(ValueTracker dataSchema, DataSchemaKind dataSchemaKind, Func? propertyApprover, bool platContextPresent, long contextTokenIndex) where T : TDDataSchema, IDeserializable { if (dataSchema.Value.Properties?.Entries == null && dataSchema.Value.AdditionalProperties == null) { - errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Data schema with '{TDDataSchema.TypeName}' of '{TDValues.TypeObject}' must have either '{TDDataSchema.PropertiesName}' or 'dtv:additionalProperties' property.", dataSchema.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Data schema with '{TDDataSchema.TypeName}' of '{TDValues.TypeObject}' must have either '{TDDataSchema.PropertiesName}' or '{TDDataSchema.AdditionalPropertiesName}' property.", dataSchema.TokenIndex); return false; } if (dataSchema.Value.Properties?.Entries != null && dataSchema.Value.AdditionalProperties != null) { - errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"Data schema with '{TDDataSchema.TypeName}' of '{TDValues.TypeObject}' cannot have both '{TDDataSchema.PropertiesName}' and 'dtv:additionalProperties' properties.", dataSchema.Value.Properties.TokenIndex, dataSchema.Value.AdditionalProperties.TokenIndex); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"Data schema with '{TDDataSchema.TypeName}' of '{TDValues.TypeObject}' cannot have both '{TDDataSchema.PropertiesName}' and '{TDDataSchema.AdditionalPropertiesName}' properties.", dataSchema.Value.Properties.TokenIndex, dataSchema.Value.AdditionalProperties.TokenIndex); return false; } @@ -1807,6 +2128,7 @@ private bool TryValidateObjectDataSchema(ValueTracker dataSchema, DataSche TDDataSchema.DescriptionName, TDDataSchema.PropertiesName, TDDataSchema.ConstName, + TDDataSchema.TypeRefName, }; if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, propertyApprover, "a constant object", dataSchema.Value.Const.TokenIndex)) { @@ -1817,7 +2139,22 @@ private bool TryValidateObjectDataSchema(ValueTracker dataSchema, DataSche { foreach (KeyValuePair> property in dataSchema.Value.Properties.Entries) { - if (!TryValidateDataSchema(property.Value, null)) + if (property.Value.Value.Namespace != null) + { + if (!platContextPresent) + { + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Data schema '{TDDataSchema.NamespaceName}' property requires the Azure Operations Platform context in the '{TDThing.ContextName}' property.", property.Value.Value.Namespace.TokenIndex, contextTokenIndex); + hasError = true; + } + + if (string.IsNullOrWhiteSpace(property.Value.Value.Namespace.Value.Value)) + { + errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Data schema '{TDDataSchema.NamespaceName}' property has empty value.", property.Value.Value.Namespace.TokenIndex); + hasError = true; + } + } + + if (!TryValidateDataSchema(property.Value, (propName) => propName == TDDataSchema.NamespaceName, platContextPresent, contextTokenIndex)) { hasError = true; } @@ -1862,6 +2199,7 @@ private bool TryValidateObjectDataSchema(ValueTracker dataSchema, DataSche TDDataSchema.PropertiesName, TDDataSchema.RequiredName, TDDataSchema.ErrorMessageName, + TDDataSchema.TypeRefName, }; if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, propertyApprover, "a structured object", dataSchema.Value.Properties.TokenIndex)) { @@ -1876,7 +2214,7 @@ private bool TryValidateObjectDataSchema(ValueTracker dataSchema, DataSche } else { - if (!TryValidateDataSchema(dataSchema.Value.AdditionalProperties!, null)) + if (!TryValidateDataSchema(dataSchema.Value.AdditionalProperties!, null, platContextPresent, contextTokenIndex)) { hasError = true; } @@ -1887,6 +2225,7 @@ private bool TryValidateObjectDataSchema(ValueTracker dataSchema, DataSche TDDataSchema.TitleName, TDDataSchema.DescriptionName, TDDataSchema.AdditionalPropertiesName, + TDDataSchema.TypeRefName, }; if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, propertyApprover, "a map", dataSchema.Value.AdditionalProperties!.TokenIndex)) { @@ -1897,7 +2236,7 @@ private bool TryValidateObjectDataSchema(ValueTracker dataSchema, DataSche return !hasError; } - private bool TryValidateArrayDataSchema(ValueTracker dataSchema, Func? propertyApprover) + private bool TryValidateArrayDataSchema(ValueTracker dataSchema, Func? propertyApprover, bool platContextPresent, long contextTokenIndex) where T : TDDataSchema, IDeserializable { if (dataSchema.Value.Items == null) @@ -1908,7 +2247,7 @@ private bool TryValidateArrayDataSchema(ValueTracker dataSchema, Func(ValueTracker dataSchema, Func(ValueTracker dataSchema, Func(ValueTracker dataSchema, DataSchemaKind dataSchemaKind, Func? propertyApprover) + private bool TryValidateStringDataSchema(ValueTracker dataSchema, DataSchemaKind dataSchemaKind, Func? propertyApprover, bool platContextPresent, long contextTokenIndex) where T : TDDataSchema, IDeserializable { bool hasError = false; @@ -1955,6 +2295,7 @@ private bool TryValidateStringDataSchema(ValueTracker dataSchema, DataSche TDDataSchema.TitleName, TDDataSchema.DescriptionName, TDDataSchema.EnumName, + TDDataSchema.TypeRefName, }; if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, propertyApprover, "an enumerated string", dataSchema.Value.Enum.TokenIndex)) { @@ -2049,6 +2390,7 @@ private bool TryValidateStringDataSchema(ValueTracker dataSchema, DataSche TDDataSchema.FormatName, TDDataSchema.ContentEncodingName, TDDataSchema.PatternName, + TDDataSchema.TypeRefName, }; if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, propertyApprover, "a string schema")) { @@ -2060,7 +2402,7 @@ private bool TryValidateStringDataSchema(ValueTracker dataSchema, DataSche return !hasError; } - private bool TryValidateNumberDataSchema(ValueTracker dataSchema, DataSchemaKind dataSchemaKind, Func? propertyApprover) + private bool TryValidateNumberDataSchema(ValueTracker dataSchema, DataSchemaKind dataSchemaKind, Func? propertyApprover, bool platContextPresent, long contextTokenIndex) where T : TDDataSchema, IDeserializable { bool hasError = false; @@ -2085,6 +2427,30 @@ private bool TryValidateNumberDataSchema(ValueTracker dataSchema, DataSche } else { + if (dataSchema.Value.ScaleFactor != null) + { + if (!platContextPresent) + { + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"The '{TDDataSchema.ScaleFactorName}' property requires the Azure Operations Platform context in the '{TDThing.ContextName}' property.", dataSchema.Value.ScaleFactor.TokenIndex, contextTokenIndex); + hasError = true; + } + } + + if (dataSchema.Value.DecimalPlaces != null) + { + if (!platContextPresent) + { + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"The '{TDDataSchema.DecimalPlacesName}' property requires the Azure Operations Platform context in the '{TDThing.ContextName}' property.", dataSchema.Value.DecimalPlaces.TokenIndex, contextTokenIndex); + hasError = true; + } + + if (!double.IsInteger(dataSchema.Value.DecimalPlaces.Value.Value)) + { + errorReporter.ReportError(ErrorCondition.TypeMismatch, $"The '{TDDataSchema.DecimalPlacesName}' property value must be an integer.", dataSchema.Value.DecimalPlaces.TokenIndex); + hasError = true; + } + } + HashSet supportedProperties = new() { TDDataSchema.TypeName, @@ -2092,6 +2458,9 @@ private bool TryValidateNumberDataSchema(ValueTracker dataSchema, DataSche TDDataSchema.DescriptionName, TDDataSchema.MinimumName, TDDataSchema.MaximumName, + TDDataSchema.ScaleFactorName, + TDDataSchema.DecimalPlacesName, + TDDataSchema.TypeRefName, }; if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, propertyApprover, "a number schema")) { @@ -2102,19 +2471,19 @@ private bool TryValidateNumberDataSchema(ValueTracker dataSchema, DataSche return !hasError; } - private bool TryValidateIntegerDataSchema(ValueTracker dataSchema, DataSchemaKind dataSchemaKind, Func? propertyApprover) + private bool TryValidateIntegerDataSchema(ValueTracker dataSchema, DataSchemaKind dataSchemaKind, Func? propertyApprover, bool platContextPresent, long contextTokenIndex) where T : TDDataSchema, IDeserializable { bool hasError = false; if (dataSchema.Value.Minimum?.Value.Value != null && !double.IsInteger(dataSchema.Value.Minimum.Value.Value)) { - errorReporter.ReportError(ErrorCondition.TypeMismatch, $"The '{TDDataSchema.MinimumName}' property value must be an integer.", dataSchema.Value.Minimum.TokenIndex); + errorReporter.ReportError(ErrorCondition.TypeMismatch, $"The '{TDDataSchema.MinimumName}' property value must be an integer.", dataSchema.Value.Minimum.TokenIndex, dataSchema.Value.Type!.TokenIndex); hasError = true; } if (dataSchema.Value.Maximum?.Value.Value != null && !double.IsInteger(dataSchema.Value.Maximum.Value.Value)) { - errorReporter.ReportError(ErrorCondition.TypeMismatch, $"The '{TDDataSchema.MaximumName}' property value must be an integer.", dataSchema.Value.Maximum.TokenIndex); + errorReporter.ReportError(ErrorCondition.TypeMismatch, $"The '{TDDataSchema.MaximumName}' property value must be an integer.", dataSchema.Value.Maximum.TokenIndex, dataSchema.Value.Type!.TokenIndex); hasError = true; } @@ -2143,6 +2512,36 @@ private bool TryValidateIntegerDataSchema(ValueTracker dataSchema, DataSch } else { + if (dataSchema.Value.ScaleFactor != null) + { + if (!platContextPresent) + { + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"The '{TDDataSchema.ScaleFactorName}' property requires the Azure Operations Platform context in the '{TDThing.ContextName}' property.", dataSchema.Value.ScaleFactor.TokenIndex, contextTokenIndex); + hasError = true; + } + + if (!double.IsInteger(dataSchema.Value.ScaleFactor.Value.Value)) + { + errorReporter.ReportError(ErrorCondition.TypeMismatch, $"The '{TDDataSchema.ScaleFactorName}' property value must be an integer.", dataSchema.Value.ScaleFactor.TokenIndex, dataSchema.Value.Type!.TokenIndex); + hasError = true; + } + } + + if (dataSchema.Value.DecimalPlaces != null) + { + if (!platContextPresent) + { + errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"The '{TDDataSchema.DecimalPlacesName}' property requires the Azure Operations Platform context in the '{TDThing.ContextName}' property.", dataSchema.Value.DecimalPlaces.TokenIndex, contextTokenIndex); + hasError = true; + } + + if (!double.IsInteger(dataSchema.Value.DecimalPlaces.Value.Value)) + { + errorReporter.ReportError(ErrorCondition.TypeMismatch, $"The '{TDDataSchema.DecimalPlacesName}' property value must be an integer.", dataSchema.Value.DecimalPlaces.TokenIndex); + hasError = true; + } + } + HashSet supportedProperties = new() { TDDataSchema.TypeName, @@ -2150,6 +2549,9 @@ private bool TryValidateIntegerDataSchema(ValueTracker dataSchema, DataSch TDDataSchema.DescriptionName, TDDataSchema.MinimumName, TDDataSchema.MaximumName, + TDDataSchema.ScaleFactorName, + TDDataSchema.DecimalPlacesName, + TDDataSchema.TypeRefName, }; if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, propertyApprover, "an integer schema")) { @@ -2184,6 +2586,7 @@ private bool TryValidateBooleanDataSchema(ValueTracker dataSchema, DataSch TDDataSchema.TypeName, TDDataSchema.TitleName, TDDataSchema.DescriptionName, + TDDataSchema.TypeRefName, }; if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, propertyApprover, "a Boolean schema")) { @@ -2213,6 +2616,7 @@ private bool TryValidateNullDataSchema(ValueTracker dataSchema, DataSchema TDDataSchema.TypeName, TDDataSchema.TitleName, TDDataSchema.DescriptionName, + TDDataSchema.TypeRefName, }; if (!TryValidateResidualProperties(dataSchema.Value.PropertyNames, supportedProperties, propertyApprover, "a null schema")) { diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAction.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAction.cs index 832fbf675e..4e887be189 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAction.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDAction.cs @@ -6,12 +6,14 @@ public class TDAction : IEquatable, IDeserializable { - public const string DescriptionName = "description"; + public const string DescriptionName = TDCommon.DescriptionName; public const string InputName = "input"; public const string OutputName = "output"; public const string IdempotentName = "idempotent"; public const string SafeName = "safe"; - public const string FormsName = "forms"; + public const string FormsName = TDCommon.FormsName; + public const string NamespaceName = TDCommon.NamespaceName; + public const string MemberOfName = "aov:memberOf"; public ValueTracker? Description { get; set; } @@ -25,6 +27,10 @@ public class TDAction : IEquatable, IDeserializable public ArrayTracker? Forms { get; set; } + public ValueTracker? Namespace { get; set; } + + public ValueTracker? MemberOf { get; set; } + public Dictionary PropertyNames { get; set; } = new(); public virtual bool Equals(TDAction? other) @@ -40,13 +46,15 @@ public virtual bool Equals(TDAction? other) Output == other.Output && Idempotent == other.Idempotent && Safe == other.Safe && - Forms == other.Forms; + Forms == other.Forms && + Namespace == other.Namespace && + MemberOf == other.MemberOf; } } public override int GetHashCode() { - return (Description, Input, Output, Idempotent, Safe, Forms).GetHashCode(); + return (Description, Input, Output, Idempotent, Safe, Forms, Namespace, MemberOf).GetHashCode(); } public static bool operator ==(TDAction? left, TDAction? right) @@ -130,6 +138,20 @@ public IEnumerable Traverse() yield return item; } } + if (Namespace != null) + { + foreach (ITraversable item in Namespace.Traverse()) + { + yield return item; + } + } + if (MemberOf != null) + { + foreach (ITraversable item in MemberOf.Traverse()) + { + yield return item; + } + } } public static TDAction Deserialize(ref Utf8JsonReader reader) @@ -169,6 +191,12 @@ public static TDAction Deserialize(ref Utf8JsonReader reader) case FormsName: action.Forms = ArrayTracker.Deserialize(ref reader, FormsName); break; + case NamespaceName: + action.Namespace = ValueTracker.Deserialize(ref reader, NamespaceName); + break; + case MemberOfName: + action.MemberOf = ValueTracker.Deserialize(ref reader, MemberOfName); + break; default: reader.Skip(); break; diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDCommon.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDCommon.cs new file mode 100644 index 0000000000..ce472e7574 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDCommon.cs @@ -0,0 +1,13 @@ +namespace Azure.Iot.Operations.TDParser.Model +{ + public static class TDCommon + { + public const string ContainedInName = "aov:containedIn"; + public const string ContainsName = "aov:contains"; + public const string ContentTypeName = "contentType"; + public const string DescriptionName = "description"; + public const string FormsName = "forms"; + public const string NamespaceName = "aov:namespace"; + public const string TitleName = "title"; + } +} diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs index 2d31845f4c..a3ec258ca0 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDDataSchema.cs @@ -8,12 +8,14 @@ public class TDDataSchema : IEquatable, IDeserializable { public const string RefName = "dtv:ref"; - public const string TitleName = "title"; - public const string DescriptionName = "description"; + public const string TitleName = TDCommon.TitleName; + public const string DescriptionName = TDCommon.DescriptionName; public const string TypeName = "type"; public const string ConstName = "const"; public const string MinimumName = "minimum"; public const string MaximumName = "maximum"; + public const string ScaleFactorName = "aov:scaleFactor"; + public const string DecimalPlacesName = "aov:decimalPlaces"; public const string FormatName = "format"; public const string PatternName = "pattern"; public const string ContentEncodingName = "contentEncoding"; @@ -23,6 +25,8 @@ public class TDDataSchema : IEquatable, IDeserializable? Ref { get; set; } @@ -38,6 +42,10 @@ public class TDDataSchema : IEquatable, IDeserializable? Maximum { get; set; } + public ValueTracker? ScaleFactor { get; set; } + + public ValueTracker? DecimalPlaces { get; set; } + public ValueTracker? Format { get; set; } public ValueTracker? Pattern { get; set; } @@ -56,11 +64,15 @@ public class TDDataSchema : IEquatable, IDeserializable? Items { get; set; } + public ValueTracker? TypeRef { get; set; } + + public ValueTracker? Namespace { get; set; } + public Dictionary PropertyNames { get; set; } = new(); public override int GetHashCode() { - return (Title, Description, Type, Const, Minimum, Maximum, Format, Pattern, ContentEncoding, AdditionalProperties, Enum, Required, ErrorMessage, Properties, Items).GetHashCode(); + return (Title, Description, Type, Const, Minimum, Maximum, ScaleFactor, DecimalPlaces, Format, Pattern, ContentEncoding, AdditionalProperties, Enum, Required, ErrorMessage, Properties, Items, TypeRef, Namespace).GetHashCode(); } public virtual bool Equals(TDDataSchema? other) @@ -78,6 +90,8 @@ public virtual bool Equals(TDDataSchema? other) Const == other.Const && Minimum == other.Minimum && Maximum == other.Maximum && + ScaleFactor == other.ScaleFactor && + DecimalPlaces == other.DecimalPlaces && Format == other.Format && Pattern == other.Pattern && ContentEncoding == other.ContentEncoding && @@ -86,7 +100,9 @@ public virtual bool Equals(TDDataSchema? other) ((Required == null && other.Required == null) || (Required?.Elements != null && other.Required?.Elements != null && Required.Elements.SequenceEqual(other.Required.Elements))) && ErrorMessage == other.ErrorMessage && Properties?.Entries?.Count == other.Properties?.Entries?.Count && (Properties == null || Properties!.Entries!.OrderBy(kv => kv.Key).SequenceEqual(other.Properties!.Entries!.OrderBy(kv => kv.Key))) && - ((Items == null && other.Items == null) || (Items?.Equals(other.Items) ?? false)); + ((Items == null && other.Items == null) || (Items?.Equals(other.Items) ?? false)) && + TypeRef == other.TypeRef && + Namespace == other.Namespace; } } @@ -206,6 +222,20 @@ public virtual IEnumerable Traverse() yield return item; } } + if (ScaleFactor != null) + { + foreach (ITraversable item in ScaleFactor.Traverse()) + { + yield return item; + } + } + if (DecimalPlaces != null) + { + foreach (ITraversable item in DecimalPlaces.Traverse()) + { + yield return item; + } + } if (Format != null) { foreach (ITraversable item in Format.Traverse()) @@ -269,6 +299,20 @@ public virtual IEnumerable Traverse() yield return item; } } + if (TypeRef != null) + { + foreach (ITraversable item in TypeRef.Traverse()) + { + yield return item; + } + } + if (Namespace != null) + { + foreach (ITraversable item in Namespace.Traverse()) + { + yield return item; + } + } } protected static bool TryLoadPropertyValues(TDDataSchema dataSchema, string propertyName, ref Utf8JsonReader reader) @@ -296,6 +340,12 @@ protected static bool TryLoadPropertyValues(TDDataSchema dataSchema, string prop case MaximumName: dataSchema.Maximum = ValueTracker.Deserialize(ref reader, MaximumName); return true; + case ScaleFactorName: + dataSchema.ScaleFactor = ValueTracker.Deserialize(ref reader, ScaleFactorName); + return true; + case DecimalPlacesName: + dataSchema.DecimalPlaces = ValueTracker.Deserialize(ref reader, DecimalPlacesName); + return true; case FormatName: dataSchema.Format = ValueTracker.Deserialize(ref reader, FormatName); return true; @@ -323,6 +373,12 @@ protected static bool TryLoadPropertyValues(TDDataSchema dataSchema, string prop case ItemsName: dataSchema.Items = ValueTracker.Deserialize(ref reader, ItemsName); return true; + case TypeRefName: + dataSchema.TypeRef = ValueTracker.Deserialize(ref reader, TypeRefName); + return true; + case NamespaceName: + dataSchema.Namespace = ValueTracker.Deserialize(ref reader, NamespaceName); + return true; default: return false; } diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDEvent.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDEvent.cs index 0e9d3a5e67..0ec9e50a32 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDEvent.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDEvent.cs @@ -6,10 +6,13 @@ public class TDEvent : IEquatable, IDeserializable { - public const string DescriptionName = "description"; + public const string DescriptionName = TDCommon.DescriptionName; public const string DataName = "data"; public const string PlaceholderName = "dtv:placeholder"; - public const string FormsName = "forms"; + public const string FormsName = TDCommon.FormsName; + public const string ContainsName = TDCommon.ContainsName; + public const string ContainedInName = TDCommon.ContainedInName; + public const string NamespaceName = TDCommon.NamespaceName; public ValueTracker? Description { get; set; } @@ -21,6 +24,12 @@ public class TDEvent : IEquatable, IDeserializable public Dictionary PropertyNames { get; set; } = new(); + public ArrayTracker? Contains { get; set; } + + public ValueTracker? ContainedIn { get; set; } + + public ValueTracker? Namespace { get; set; } + public virtual bool Equals(TDEvent? other) { if (other == null) @@ -32,13 +41,16 @@ public virtual bool Equals(TDEvent? other) return Description == other.Description && Data == other.Data && Placeholder == other.Placeholder && - Forms == other.Forms; + Forms == other.Forms && + Contains == other.Contains && + ContainedIn == other.ContainedIn && + Namespace == other.Namespace; } } public override int GetHashCode() { - return (Description, Data, Placeholder, Forms).GetHashCode(); + return (Description, Data, Placeholder, Forms, Contains, ContainedIn, Namespace).GetHashCode(); } public static bool operator ==(TDEvent? left, TDEvent? right) @@ -108,6 +120,27 @@ public IEnumerable Traverse() yield return item; } } + if (Contains != null) + { + foreach (ITraversable item in Contains.Traverse()) + { + yield return item; + } + } + if (ContainedIn != null) + { + foreach (ITraversable item in ContainedIn.Traverse()) + { + yield return item; + } + } + if (Namespace != null) + { + foreach (ITraversable item in Namespace.Traverse()) + { + yield return item; + } + } } public static TDEvent Deserialize(ref Utf8JsonReader reader) @@ -141,6 +174,15 @@ public static TDEvent Deserialize(ref Utf8JsonReader reader) case FormsName: evt.Forms = ArrayTracker.Deserialize(ref reader, FormsName); break; + case ContainsName: + evt.Contains = ArrayTracker.Deserialize(ref reader, ContainsName); + break; + case ContainedInName: + evt.ContainedIn = ValueTracker.Deserialize(ref reader, ContainedInName); + break; + case NamespaceName: + evt.Namespace = ValueTracker.Deserialize(ref reader, NamespaceName); + break; default: reader.Skip(); break; diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDForm.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDForm.cs index b665a3d8cd..8f4b4466f2 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDForm.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDForm.cs @@ -6,7 +6,7 @@ public class TDForm : IEquatable, IDeserializable { - public const string ContentTypeName = "contentType"; + public const string ContentTypeName = TDCommon.ContentTypeName; public const string AdditionalResponsesName = "additionalResponses"; public const string HeaderInfoName = "dtv:headerInfo"; public const string HeaderCodeName = "dtv:headerCode"; diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDLink.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDLink.cs index 06c430904c..cf40d03d37 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDLink.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDLink.cs @@ -9,6 +9,7 @@ public class TDLink : IEquatable, IDeserializable public const string HrefName = "href"; public const string TypeName = "type"; public const string RelName = "rel"; + public const string RefTypeName = "aov:refType"; public ValueTracker? Href { get; set; } @@ -16,6 +17,8 @@ public class TDLink : IEquatable, IDeserializable public ValueTracker? Rel { get; set; } + public ValueTracker? RefType { get; set; } + public Dictionary PropertyNames { get; set; } = new(); public virtual bool Equals(TDLink? other) @@ -26,13 +29,13 @@ public virtual bool Equals(TDLink? other) } else { - return Href == other.Href && Type == other.Type && Rel == other.Rel; + return Href == other.Href && Type == other.Type && Rel == other.Rel && RefType == other.RefType; } } public override int GetHashCode() { - return (Href, Type, Rel).GetHashCode(); + return (Href, Type, Rel, RefType).GetHashCode(); } public static bool operator ==(TDLink? left, TDLink? right) @@ -95,6 +98,13 @@ public IEnumerable Traverse() yield return item; } } + if (RefType != null) + { + foreach (ITraversable item in RefType.Traverse()) + { + yield return item; + } + } } public static TDLink Deserialize(ref Utf8JsonReader reader) @@ -125,6 +135,9 @@ public static TDLink Deserialize(ref Utf8JsonReader reader) case RelName: link.Rel = ValueTracker.Deserialize(ref reader, RelName); break; + case RefTypeName: + link.RefType = ValueTracker.Deserialize(ref reader, RefTypeName); + break; default: reader.Skip(); break; diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDProperty.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDProperty.cs index fdc5fdb6fb..000f32ee6d 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDProperty.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDProperty.cs @@ -8,7 +8,9 @@ public class TDProperty : TDDataSchema, IEquatable, IDeserializable< { public const string ReadOnlyName = "readOnly"; public const string PlaceholderName = "dtv:placeholder"; - public const string FormsName = "forms"; + public const string FormsName = TDCommon.FormsName; + public const string ContainsName = TDCommon.ContainsName; + public const string ContainedInName = TDCommon.ContainedInName; public ValueTracker? ReadOnly { get; set; } @@ -16,6 +18,12 @@ public class TDProperty : TDDataSchema, IEquatable, IDeserializable< public ArrayTracker? Forms { get; set; } + public ArrayTracker? Contains { get; set; } + + public ValueTracker? ContainedIn { get; set; } + + public ValueTracker? Namespace { get; set; } + public virtual bool Equals(TDProperty? other) { if (other == null) @@ -27,13 +35,16 @@ public virtual bool Equals(TDProperty? other) return base.Equals(other) && ReadOnly == other.ReadOnly && Placeholder == other.Placeholder && - Forms == other.Forms; + Forms == other.Forms && + Contains == other.Contains && + ContainedIn == other.ContainedIn && + Namespace == other.Namespace; } } public override int GetHashCode() { - return (base.GetHashCode(), ReadOnly, Placeholder, Forms).GetHashCode(); + return (base.GetHashCode(), ReadOnly, Placeholder, Forms, Contains, ContainedIn, Namespace).GetHashCode(); } public static bool operator ==(TDProperty? left, TDProperty? right) @@ -101,6 +112,27 @@ public override IEnumerable Traverse() yield return item; } } + if (Contains != null) + { + foreach (ITraversable item in Contains.Traverse()) + { + yield return item; + } + } + if (ContainedIn != null) + { + foreach (ITraversable item in ContainedIn.Traverse()) + { + yield return item; + } + } + if (Namespace != null) + { + foreach (ITraversable item in Namespace.Traverse()) + { + yield return item; + } + } } public static new TDProperty Deserialize(ref Utf8JsonReader reader) @@ -133,6 +165,12 @@ public override IEnumerable Traverse() case FormsName: prop.Forms = ArrayTracker.Deserialize(ref reader, FormsName); break; + case ContainsName: + prop.Contains = ArrayTracker.Deserialize(ref reader, ContainsName); + break; + case ContainedInName: + prop.ContainedIn = ValueTracker.Deserialize(ref reader, ContainedInName); + break; default: reader.Skip(); break; diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDSchemaReference.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDSchemaReference.cs index 2483758525..4b73e2312f 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDSchemaReference.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDSchemaReference.cs @@ -7,7 +7,7 @@ public class TDSchemaReference : IEquatable, IDeserializable { public const string SuccessName = "success"; - public const string ContentTypeName = "contentType"; + public const string ContentTypeName = TDCommon.ContentTypeName; public const string SchemaName = "schema"; public ValueTracker? Success { get; set; } diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDThing.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDThing.cs index df9753d25c..65e45f705a 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDThing.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDThing.cs @@ -8,15 +8,18 @@ public class TDThing : IEquatable, IDeserializable { public const string ContextName = "@context"; public const string TypeName = "@type"; - public const string TitleName = "title"; - public const string DescriptionName = "description"; + public const string TitleName = TDCommon.TitleName; + public const string DescriptionName = TDCommon.DescriptionName; public const string LinksName = "links"; public const string SchemaDefinitionsName = "schemaDefinitions"; - public const string FormsName = "forms"; + public const string FormsName = TDCommon.FormsName; public const string OptionalName = "tm:optional"; public const string ActionsName = "actions"; public const string PropertiesName = "properties"; public const string EventsName = "events"; + public const string IsCompositeName = "aov:isComposite"; + public const string IsEventName = "aov:isEvent"; + public const string TypeRefName = "aov:typeRef"; public ArrayTracker? Context { get; set; } @@ -40,6 +43,12 @@ public class TDThing : IEquatable, IDeserializable public MapTracker? Events { get; set; } + public ValueTracker? IsComposite { get; set; } + + public ValueTracker? IsEvent { get; set; } + + public ValueTracker? TypeRef { get; set; } + public Dictionary PropertyNames { get; set; } = new(); public virtual bool Equals(TDThing? other) @@ -60,13 +69,16 @@ public virtual bool Equals(TDThing? other) Optional == other.Optional && Actions == other.Actions && Properties == other.Properties && - Events == other.Events; + Events == other.Events && + IsComposite == other.IsComposite && + IsEvent == other.IsEvent && + TypeRef == other.TypeRef; } } public override int GetHashCode() { - return (Context, Type, Title, Description, Links, SchemaDefinitions, Forms, Optional, Actions, Properties, Events).GetHashCode(); + return (Context, Type, Title, Description, Links, SchemaDefinitions, Forms, Optional, Actions, Properties, Events, IsComposite, IsEvent, TypeRef).GetHashCode(); } public static bool operator ==(TDThing? left, TDThing? right) @@ -185,6 +197,27 @@ public IEnumerable Traverse() yield return item; } } + if (IsComposite != null) + { + foreach (ITraversable item in IsComposite.Traverse()) + { + yield return item; + } + } + if (IsEvent != null) + { + foreach (ITraversable item in IsEvent.Traverse()) + { + yield return item; + } + } + if (TypeRef != null) + { + foreach (ITraversable item in TypeRef.Traverse()) + { + yield return item; + } + } } public static TDThing Deserialize(ref Utf8JsonReader reader) @@ -239,6 +272,15 @@ public static TDThing Deserialize(ref Utf8JsonReader reader) case EventsName: thing.Events = MapTracker.Deserialize(ref reader, EventsName); break; + case IsCompositeName: + thing.IsComposite = ValueTracker.Deserialize(ref reader, IsCompositeName); + break; + case IsEventName: + thing.IsEvent = ValueTracker.Deserialize(ref reader, IsEventName); + break; + case TypeRefName: + thing.TypeRef = ValueTracker.Deserialize(ref reader, TypeRefName); + break; default: reader.Skip(); break; diff --git a/codegen2/test/test-cases/failure/LinkTypeNotJson.json b/codegen2/test/test-cases/failure/LinkTypeNotJson.json index 226c81277e..2d404fa795 100644 --- a/codegen2/test/test-cases/failure/LinkTypeNotJson.json +++ b/codegen2/test/test-cases/failure/LinkTypeNotJson.json @@ -9,7 +9,7 @@ "condition": "PropertyUnsupportedValue", "filename": "LinkTypeNotJson.TM.json", "line": 12, - "cfLine": 0, + "cfLine": 10, "crossRef": "" } ] diff --git a/codegen2/test/test-cases/failure/SchemaDefinitionIntegerMaxNotInteger.json b/codegen2/test/test-cases/failure/SchemaDefinitionIntegerMaxNotInteger.json index 65b3ca95e2..f76246b742 100644 --- a/codegen2/test/test-cases/failure/SchemaDefinitionIntegerMaxNotInteger.json +++ b/codegen2/test/test-cases/failure/SchemaDefinitionIntegerMaxNotInteger.json @@ -9,7 +9,7 @@ "condition": "TypeMismatch", "filename": "SchemaDefinitionIntegerMaxNotInteger.TM.json", "line": 12, - "cfLine": 0, + "cfLine": 10, "crossRef": "" } ] diff --git a/codegen2/test/test-cases/failure/SchemaDefinitionIntegerMinNotInteger.json b/codegen2/test/test-cases/failure/SchemaDefinitionIntegerMinNotInteger.json index 7c050eb7da..5ed84341b4 100644 --- a/codegen2/test/test-cases/failure/SchemaDefinitionIntegerMinNotInteger.json +++ b/codegen2/test/test-cases/failure/SchemaDefinitionIntegerMinNotInteger.json @@ -9,7 +9,7 @@ "condition": "TypeMismatch", "filename": "SchemaDefinitionIntegerMinNotInteger.TM.json", "line": 11, - "cfLine": 0, + "cfLine": 10, "crossRef": "" } ] From 71538ccce480751446d265b62e7ee8b31433f369 Mon Sep 17 00:00:00 2001 From: "John (JD) Douceur" Date: Wed, 21 Jan 2026 10:21:15 -0800 Subject: [PATCH 43/52] add 55 test cases for Golden Path properties --- .../TDValues.cs | 2 +- .../ThingValidator.cs | 22 +++++--- .../Model/TDProperty.cs | 14 +---- .../.gitignore | 0 .../test-cases/failure/ActionContainedIn.json | 16 ++++++ .../test-cases/failure/ActionContains.json | 16 ++++++ ...mptyHref.json => ActionMemberOfEmpty.json} | 4 +- .../ActionMemberOfWithoutAovContext.json | 16 ++++++ .../failure/ActionNamespaceEmpty.json | 16 ++++++ .../ActionNamespaceWithoutAovContext.json | 16 ++++++ .../failure/ContextAovWrongUri.json | 16 ++++++ .../failure/EventContainedInEmpty.json | 16 ++++++ .../EventContainedInEventContainsOther.json | 16 ++++++ .../failure/EventContainedInNoEvent.json | 16 ++++++ .../EventContainedInWithoutAovContext.json | 16 ++++++ .../failure/EventContainsEmpty.json | 16 ++++++ .../EventContainsEventContainedInOther.json | 16 ++++++ .../failure/EventContainsNoEvent.json | 16 ++++++ .../EventContainsWithoutAovContext.json | 16 ++++++ .../test-cases/failure/EventMemberOf.json | 16 ++++++ .../failure/EventNamespaceEmpty.json | 16 ++++++ .../EventNamespaceWithoutAovContext.json | 16 ++++++ .../failure/IsCompositeAndIsEvent.json | 16 ++++++ .../failure/IsCompositeWithoutAovContext.json | 16 ++++++ .../failure/IsEventWithoutAovContext.json | 16 ++++++ .../failure/LinkCapabilityTypeJsonNotTm.json | 16 ++++++ .../LinkCapabilityWithoutAovContext.json | 16 ++++++ .../failure/LinkComponentTypeJsonNotTm.json | 16 ++++++ .../LinkComponentWithoutAovContext.json | 16 ++++++ .../failure/LinkExtendsTypeJsonNotTm.json | 16 ++++++ .../failure/LinkNamingEmptyHref.json | 16 ++++++ ...mptyType.json => LinkNamingEmptyType.json} | 4 +- ...{LinkNoHref.json => LinkNamingNoHref.json} | 4 +- ...{LinkNoType.json => LinkNamingNoType.json} | 4 +- ...onFile.json => LinkNamingNonJsonFile.json} | 4 +- ...le.json => LinkNamingNonexistentFile.json} | 4 +- ...otJson.json => LinkNamingTypeNotJson.json} | 4 +- ...son => LinkNamingUnsupportedProperty.json} | 4 +- .../failure/LinkReferenceRefType.json | 16 ++++++ .../failure/LinkReferenceTypeJsonNotTm.json | 16 ++++++ .../LinkReferenceWithoutAovContext.json | 16 ++++++ .../failure/LinkTypedReferenceNoRefType.json | 16 ++++++ .../LinkTypedReferenceRefTypeEmpty.json | 16 ++++++ .../LinkTypedReferenceTypeJsonNotTm.json | 16 ++++++ .../LinkTypedReferenceWithoutAovContext.json | 16 ++++++ ...pleLinks.json => MultipleLinksNaming.json} | 4 +- .../failure/PropertyContainedInEmpty.json | 16 ++++++ .../PropertyContainedInNoProperty.json | 16 ++++++ ...pertyContainedInPropertyContainsOther.json | 16 ++++++ .../PropertyContainedInWithoutAovContext.json | 16 ++++++ .../failure/PropertyContainsEmpty.json | 16 ++++++ .../failure/PropertyContainsNoProperty.json | 16 ++++++ ...pertyContainsPropertyContainedInOther.json | 16 ++++++ .../PropertyContainsWithoutAovContext.json | 16 ++++++ .../test-cases/failure/PropertyMemberOf.json | 16 ++++++ .../failure/PropertyNamespaceEmpty.json | 16 ++++++ .../PropertyNamespaceWithoutAovContext.json | 16 ++++++ .../test/test-cases/failure/TypeRefEmpty.json | 16 ++++++ .../failure/TypeRefWithoutAovContext.json | 16 ++++++ .../EventContainedInEventNoContains.json | 7 +++ .../EventContainsEventNoContainedIn.json | 7 +++ .../test-cases/success/LinkCapability.json | 7 +++ .../test-cases/success/LinkComponent.json | 7 +++ .../test-cases/success/LinkOtherAovRel.json | 7 +++ .../test-cases/success/LinkReference.json | 7 +++ .../success/LinkTypedReference.json | 7 +++ ...PropertyContainedInPropertyNoContains.json | 7 +++ ...PropertyContainsPropertyNoContainedIn.json | 7 +++ .../ActionContainedIn.TM.json | 25 +++++++++ .../invalidAioBinding/ActionContains.TM.json | 25 +++++++++ .../ActionMemberOfEmpty.TM.json | 25 +++++++++ .../ActionMemberOfWithoutAovContext.TM.json | 24 +++++++++ .../ActionNamespaceEmpty.TM.json | 25 +++++++++ .../ActionNamespaceWithoutAovContext.TM.json | 24 +++++++++ .../ContextAovWrongUri.TM.json | 24 +++++++++ .../EventContainedInEmpty.TM.json | 40 ++++++++++++++ ...EventContainedInEventContainsOther.TM.json | 53 +++++++++++++++++++ .../EventContainedInNoEvent.TM.json | 40 ++++++++++++++ .../EventContainedInWithoutAovContext.TM.json | 39 ++++++++++++++ .../EventContainsEmpty.TM.json | 40 ++++++++++++++ ...EventContainsEventContainedInOther.TM.json | 53 +++++++++++++++++++ .../EventContainsNoEvent.TM.json | 40 ++++++++++++++ .../EventContainsWithoutAovContext.TM.json | 39 ++++++++++++++ .../invalidAioBinding/EventMemberOf.TM.json | 28 ++++++++++ .../EventNamespaceEmpty.TM.json | 28 ++++++++++ .../EventNamespaceWithoutAovContext.TM.json | 27 ++++++++++ .../IsCompositeAndIsEvent.TM.json | 26 +++++++++ .../IsCompositeWithoutAovContext.TM.json | 24 +++++++++ .../IsEventWithoutAovContext.TM.json | 24 +++++++++ .../LinkCapabilityTypeJsonNotTm.TM.json | 31 +++++++++++ .../LinkCapabilityWithoutAovContext.TM.json | 30 +++++++++++ .../LinkComponentTypeJsonNotTm.TM.json | 31 +++++++++++ .../LinkComponentWithoutAovContext.TM.json | 30 +++++++++++ .../LinkExtendsTypeJsonNotTm.TM.json | 30 +++++++++++ ...ef.TM.json => LinkNamingEmptyHref.TM.json} | 0 ...pe.TM.json => LinkNamingEmptyType.TM.json} | 0 ...oHref.TM.json => LinkNamingNoHref.TM.json} | 0 ...oType.TM.json => LinkNamingNoType.TM.json} | 0 ....TM.json => LinkNamingNonJsonFile.TM.json} | 0 ...json => LinkNamingNonexistentFile.TM.json} | 0 ....TM.json => LinkNamingTypeNotJson.TM.json} | 0 ... => LinkNamingUnsupportedProperty.TM.json} | 0 .../LinkReferenceRefType.TM.json | 32 +++++++++++ .../LinkReferenceTypeJsonNotTm.TM.json | 31 +++++++++++ .../LinkReferenceWithoutAovContext.TM.json | 30 +++++++++++ .../LinkTypedReferenceNoRefType.TM.json | 31 +++++++++++ .../LinkTypedReferenceRefTypeEmpty.TM.json | 32 +++++++++++ .../LinkTypedReferenceTypeJsonNotTm.TM.json | 32 +++++++++++ ...inkTypedReferenceWithoutAovContext.TM.json | 31 +++++++++++ ...ks.TM.json => MultipleLinksNaming.TM.json} | 0 .../PropertyContainedInEmpty.TM.json | 36 +++++++++++++ .../PropertyContainedInNoProperty.TM.json | 36 +++++++++++++ ...tyContainedInPropertyContainsOther.TM.json | 47 ++++++++++++++++ ...opertyContainedInWithoutAovContext.TM.json | 35 ++++++++++++ .../PropertyContainsEmpty.TM.json | 36 +++++++++++++ .../PropertyContainsNoProperty.TM.json | 36 +++++++++++++ ...tyContainsPropertyContainedInOther.TM.json | 47 ++++++++++++++++ .../PropertyContainsWithoutAovContext.TM.json | 35 ++++++++++++ .../PropertyMemberOf.TM.json | 26 +++++++++ .../PropertyNamespaceEmpty.TM.json | 26 +++++++++ ...PropertyNamespaceWithoutAovContext.TM.json | 25 +++++++++ .../invalidAioBinding/TypeRefEmpty.TM.json | 25 +++++++++ .../TypeRefWithoutAovContext.TM.json | 24 +++++++++ .../EventContainedInEventNoContains.TM.json | 40 ++++++++++++++ .../EventContainsEventNoContainedIn.TM.json | 40 ++++++++++++++ .../thing-models/valid/LinkCapability.TM.json | 31 +++++++++++ .../thing-models/valid/LinkComponent.TM.json | 31 +++++++++++ .../valid/LinkOtherAovRel.TM.json | 30 +++++++++++ .../thing-models/valid/LinkReference.TM.json | 31 +++++++++++ .../valid/LinkTypedReference.TM.json | 32 +++++++++++ ...pertyContainedInPropertyNoContains.TM.json | 36 +++++++++++++ ...pertyContainsPropertyNoContainedIn.TM.json | 36 +++++++++++++ 132 files changed, 2619 insertions(+), 39 deletions(-) rename codegen2/test/{Azure.Iot.Operations.ProtocolCompiler.UnitTests => }/.gitignore (100%) create mode 100644 codegen2/test/test-cases/failure/ActionContainedIn.json create mode 100644 codegen2/test/test-cases/failure/ActionContains.json rename codegen2/test/test-cases/failure/{LinkEmptyHref.json => ActionMemberOfEmpty.json} (61%) create mode 100644 codegen2/test/test-cases/failure/ActionMemberOfWithoutAovContext.json create mode 100644 codegen2/test/test-cases/failure/ActionNamespaceEmpty.json create mode 100644 codegen2/test/test-cases/failure/ActionNamespaceWithoutAovContext.json create mode 100644 codegen2/test/test-cases/failure/ContextAovWrongUri.json create mode 100644 codegen2/test/test-cases/failure/EventContainedInEmpty.json create mode 100644 codegen2/test/test-cases/failure/EventContainedInEventContainsOther.json create mode 100644 codegen2/test/test-cases/failure/EventContainedInNoEvent.json create mode 100644 codegen2/test/test-cases/failure/EventContainedInWithoutAovContext.json create mode 100644 codegen2/test/test-cases/failure/EventContainsEmpty.json create mode 100644 codegen2/test/test-cases/failure/EventContainsEventContainedInOther.json create mode 100644 codegen2/test/test-cases/failure/EventContainsNoEvent.json create mode 100644 codegen2/test/test-cases/failure/EventContainsWithoutAovContext.json create mode 100644 codegen2/test/test-cases/failure/EventMemberOf.json create mode 100644 codegen2/test/test-cases/failure/EventNamespaceEmpty.json create mode 100644 codegen2/test/test-cases/failure/EventNamespaceWithoutAovContext.json create mode 100644 codegen2/test/test-cases/failure/IsCompositeAndIsEvent.json create mode 100644 codegen2/test/test-cases/failure/IsCompositeWithoutAovContext.json create mode 100644 codegen2/test/test-cases/failure/IsEventWithoutAovContext.json create mode 100644 codegen2/test/test-cases/failure/LinkCapabilityTypeJsonNotTm.json create mode 100644 codegen2/test/test-cases/failure/LinkCapabilityWithoutAovContext.json create mode 100644 codegen2/test/test-cases/failure/LinkComponentTypeJsonNotTm.json create mode 100644 codegen2/test/test-cases/failure/LinkComponentWithoutAovContext.json create mode 100644 codegen2/test/test-cases/failure/LinkExtendsTypeJsonNotTm.json create mode 100644 codegen2/test/test-cases/failure/LinkNamingEmptyHref.json rename codegen2/test/test-cases/failure/{LinkEmptyType.json => LinkNamingEmptyType.json} (61%) rename codegen2/test/test-cases/failure/{LinkNoHref.json => LinkNamingNoHref.json} (62%) rename codegen2/test/test-cases/failure/{LinkNoType.json => LinkNamingNoType.json} (62%) rename codegen2/test/test-cases/failure/{LinkNonJsonFile.json => LinkNamingNonJsonFile.json} (60%) rename codegen2/test/test-cases/failure/{LinkNonexistentFile.json => LinkNamingNonexistentFile.json} (59%) rename codegen2/test/test-cases/failure/{LinkTypeNotJson.json => LinkNamingTypeNotJson.json} (62%) rename codegen2/test/test-cases/failure/{LinkUnsupportedProperty.json => LinkNamingUnsupportedProperty.json} (58%) create mode 100644 codegen2/test/test-cases/failure/LinkReferenceRefType.json create mode 100644 codegen2/test/test-cases/failure/LinkReferenceTypeJsonNotTm.json create mode 100644 codegen2/test/test-cases/failure/LinkReferenceWithoutAovContext.json create mode 100644 codegen2/test/test-cases/failure/LinkTypedReferenceNoRefType.json create mode 100644 codegen2/test/test-cases/failure/LinkTypedReferenceRefTypeEmpty.json create mode 100644 codegen2/test/test-cases/failure/LinkTypedReferenceTypeJsonNotTm.json create mode 100644 codegen2/test/test-cases/failure/LinkTypedReferenceWithoutAovContext.json rename codegen2/test/test-cases/failure/{MultipleLinks.json => MultipleLinksNaming.json} (61%) create mode 100644 codegen2/test/test-cases/failure/PropertyContainedInEmpty.json create mode 100644 codegen2/test/test-cases/failure/PropertyContainedInNoProperty.json create mode 100644 codegen2/test/test-cases/failure/PropertyContainedInPropertyContainsOther.json create mode 100644 codegen2/test/test-cases/failure/PropertyContainedInWithoutAovContext.json create mode 100644 codegen2/test/test-cases/failure/PropertyContainsEmpty.json create mode 100644 codegen2/test/test-cases/failure/PropertyContainsNoProperty.json create mode 100644 codegen2/test/test-cases/failure/PropertyContainsPropertyContainedInOther.json create mode 100644 codegen2/test/test-cases/failure/PropertyContainsWithoutAovContext.json create mode 100644 codegen2/test/test-cases/failure/PropertyMemberOf.json create mode 100644 codegen2/test/test-cases/failure/PropertyNamespaceEmpty.json create mode 100644 codegen2/test/test-cases/failure/PropertyNamespaceWithoutAovContext.json create mode 100644 codegen2/test/test-cases/failure/TypeRefEmpty.json create mode 100644 codegen2/test/test-cases/failure/TypeRefWithoutAovContext.json create mode 100644 codegen2/test/test-cases/success/EventContainedInEventNoContains.json create mode 100644 codegen2/test/test-cases/success/EventContainsEventNoContainedIn.json create mode 100644 codegen2/test/test-cases/success/LinkCapability.json create mode 100644 codegen2/test/test-cases/success/LinkComponent.json create mode 100644 codegen2/test/test-cases/success/LinkOtherAovRel.json create mode 100644 codegen2/test/test-cases/success/LinkReference.json create mode 100644 codegen2/test/test-cases/success/LinkTypedReference.json create mode 100644 codegen2/test/test-cases/success/PropertyContainedInPropertyNoContains.json create mode 100644 codegen2/test/test-cases/success/PropertyContainsPropertyNoContainedIn.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/ActionContainedIn.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/ActionContains.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/ActionMemberOfEmpty.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/ActionMemberOfWithoutAovContext.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/ActionNamespaceEmpty.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/ActionNamespaceWithoutAovContext.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/ContextAovWrongUri.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/EventContainedInEmpty.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/EventContainedInEventContainsOther.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/EventContainedInNoEvent.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/EventContainedInWithoutAovContext.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/EventContainsEmpty.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/EventContainsEventContainedInOther.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/EventContainsNoEvent.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/EventContainsWithoutAovContext.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/EventMemberOf.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/EventNamespaceEmpty.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/EventNamespaceWithoutAovContext.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/IsCompositeAndIsEvent.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/IsCompositeWithoutAovContext.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/IsEventWithoutAovContext.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/LinkCapabilityTypeJsonNotTm.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/LinkCapabilityWithoutAovContext.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/LinkComponentTypeJsonNotTm.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/LinkComponentWithoutAovContext.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/LinkExtendsTypeJsonNotTm.TM.json rename codegen2/test/thing-models/invalidAioBinding/{LinkEmptyHref.TM.json => LinkNamingEmptyHref.TM.json} (100%) rename codegen2/test/thing-models/invalidAioBinding/{LinkEmptyType.TM.json => LinkNamingEmptyType.TM.json} (100%) rename codegen2/test/thing-models/invalidAioBinding/{LinkNoHref.TM.json => LinkNamingNoHref.TM.json} (100%) rename codegen2/test/thing-models/invalidAioBinding/{LinkNoType.TM.json => LinkNamingNoType.TM.json} (100%) rename codegen2/test/thing-models/invalidAioBinding/{LinkNonJsonFile.TM.json => LinkNamingNonJsonFile.TM.json} (100%) rename codegen2/test/thing-models/invalidAioBinding/{LinkNonexistentFile.TM.json => LinkNamingNonexistentFile.TM.json} (100%) rename codegen2/test/thing-models/invalidAioBinding/{LinkTypeNotJson.TM.json => LinkNamingTypeNotJson.TM.json} (100%) rename codegen2/test/thing-models/invalidAioBinding/{LinkUnsupportedProperty.TM.json => LinkNamingUnsupportedProperty.TM.json} (100%) create mode 100644 codegen2/test/thing-models/invalidAioBinding/LinkReferenceRefType.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/LinkReferenceTypeJsonNotTm.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/LinkReferenceWithoutAovContext.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/LinkTypedReferenceNoRefType.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/LinkTypedReferenceRefTypeEmpty.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/LinkTypedReferenceTypeJsonNotTm.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/LinkTypedReferenceWithoutAovContext.TM.json rename codegen2/test/thing-models/invalidAioBinding/{MultipleLinks.TM.json => MultipleLinksNaming.TM.json} (100%) create mode 100644 codegen2/test/thing-models/invalidAioBinding/PropertyContainedInEmpty.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/PropertyContainedInNoProperty.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/PropertyContainedInPropertyContainsOther.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/PropertyContainedInWithoutAovContext.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/PropertyContainsEmpty.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/PropertyContainsNoProperty.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/PropertyContainsPropertyContainedInOther.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/PropertyContainsWithoutAovContext.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/PropertyMemberOf.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/PropertyNamespaceEmpty.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/PropertyNamespaceWithoutAovContext.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/TypeRefEmpty.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/TypeRefWithoutAovContext.TM.json create mode 100644 codegen2/test/thing-models/valid/EventContainedInEventNoContains.TM.json create mode 100644 codegen2/test/thing-models/valid/EventContainsEventNoContainedIn.TM.json create mode 100644 codegen2/test/thing-models/valid/LinkCapability.TM.json create mode 100644 codegen2/test/thing-models/valid/LinkComponent.TM.json create mode 100644 codegen2/test/thing-models/valid/LinkOtherAovRel.TM.json create mode 100644 codegen2/test/thing-models/valid/LinkReference.TM.json create mode 100644 codegen2/test/thing-models/valid/LinkTypedReference.TM.json create mode 100644 codegen2/test/thing-models/valid/PropertyContainedInPropertyNoContains.TM.json create mode 100644 codegen2/test/thing-models/valid/PropertyContainsPropertyNoContainedIn.TM.json diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/TDValues.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/TDValues.cs index c656bece5b..59ce3a1042 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/TDValues.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/TDValues.cs @@ -6,7 +6,7 @@ public static class TDValues { public const string ContextUriWotTd = "https://www.w3.org/2022/wot/td/v1.1"; public const string ContextUriAioProtocol = "http://azure.com/DigitalTwins/dtmi#"; - public const string ContextUriAioPlatform = "http://azure.com/IoT/operations/tm"; + public const string ContextUriAioPlatform = "http://azure.com/IoT/operations/tm#"; public const string ContextPrefixAioProtocol = "dtv"; public const string ContextPrefixAioPlatform = "aov"; diff --git a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs index 9e6efb96c8..f72e9254d0 100644 --- a/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs +++ b/codegen2/src/Azure.Iot.Operations.CodeGeneration/ThingValidator.cs @@ -647,7 +647,7 @@ private bool TryValidateLinks(ArrayTracker? links, bool platContextPrese { if (link.Value.Rel.Value.Value == TDValues.RelationTypedReference) { - errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Link element with {TDLink.RelName}='{link.Value.Rel.Value.Value}' is missing required '{TDLink.RefTypeName}' property.", link.TokenIndex); + errorReporter.ReportError(ErrorCondition.PropertyMissing, $"Link element with {TDLink.RelName}='{link.Value.Rel.Value.Value}' is missing required '{TDLink.RefTypeName}' property.", link.TokenIndex, link.Value.Rel.TokenIndex); hasError = true; } } @@ -655,7 +655,7 @@ private bool TryValidateLinks(ArrayTracker? links, bool platContextPrese { if (link.Value.Rel.Value.Value != TDValues.RelationTypedReference) { - errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"Link element with {TDLink.RelName}='{link.Value.Rel.Value.Value}' does not support '{TDLink.RefTypeName}' property.", link.TokenIndex); + errorReporter.ReportError(ErrorCondition.ValuesInconsistent, $"Link element with {TDLink.RelName}='{link.Value.Rel.Value.Value}' does not support '{TDLink.RefTypeName}' property.", link.Value.RefType.TokenIndex, link.Value.Rel.TokenIndex); hasError = true; } else if (string.IsNullOrWhiteSpace(link.Value.RefType.Value.Value)) @@ -696,7 +696,7 @@ private bool TryValidateLinks(ArrayTracker? links, bool platContextPrese { if (propertyName.Key != TDLink.HrefName && propertyName.Key != TDLink.TypeName && propertyName.Key != TDLink.RelName && propertyName.Key != TDLink.RefTypeName) { - if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{TDValues.ContextPrefixAioProtocol}:")) + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{TDValues.ContextPrefixAioProtocol}:") && !propertyName.Key.StartsWith($"{TDValues.ContextPrefixAioPlatform}:")) { errorReporter.ReportWarning($"Link has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); } @@ -815,7 +815,7 @@ private bool TryValidateAction(string name, ValueTracker action, MapTr { if (propertyName.Key != TDAction.DescriptionName && propertyName.Key != TDAction.InputName && propertyName.Key != TDAction.OutputName && propertyName.Key != TDAction.IdempotentName && propertyName.Key != TDAction.SafeName && propertyName.Key != TDAction.FormsName && propertyName.Key != TDAction.NamespaceName && propertyName.Key != TDAction.MemberOfName) { - if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{TDValues.ContextPrefixAioProtocol}:")) + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{TDValues.ContextPrefixAioProtocol}:") && !propertyName.Key.StartsWith($"{TDValues.ContextPrefixAioPlatform}:")) { errorReporter.ReportWarning($"Action '{name}' has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); } @@ -1047,6 +1047,12 @@ private bool TryValidateEvent(string name, ValueTracker evt, MapTracker errorReporter.ReportError(ErrorCondition.PropertyInvalid, $"Event element '{TDEvent.NamespaceName}' property requires the Azure Operations Platform context in the '{TDThing.ContextName}' property.", evt.Value.Namespace.TokenIndex, contextTokenIndex); hasError = true; } + + if (string.IsNullOrWhiteSpace(evt.Value.Namespace.Value.Value)) + { + errorReporter.ReportError(ErrorCondition.PropertyEmpty, $"Event element '{TDProperty.NamespaceName}' property has empty value.", evt.Value.Namespace.TokenIndex); + hasError = true; + } } if (evt.Value.Contains?.Elements != null) @@ -1088,7 +1094,7 @@ private bool TryValidateEvent(string name, ValueTracker evt, MapTracker { if (propertyName.Key != TDEvent.DescriptionName && propertyName.Key != TDEvent.DataName && propertyName.Key != TDEvent.PlaceholderName && propertyName.Key != TDEvent.FormsName && propertyName.Key != TDEvent.ContainsName && propertyName.Key != TDEvent.ContainedInName && propertyName.Key != TDEvent.NamespaceName) { - if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{TDValues.ContextPrefixAioProtocol}:")) + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{TDValues.ContextPrefixAioProtocol}:") && !propertyName.Key.StartsWith($"{TDValues.ContextPrefixAioPlatform}:")) { errorReporter.ReportWarning($"Event '{name}' has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); } @@ -1391,7 +1397,7 @@ private bool TryValidateForm(ValueTracker form, FormsKind formsKind, Map { if (propertyName.Key != TDForm.ContentTypeName && propertyName.Key != TDForm.AdditionalResponsesName && propertyName.Key != TDForm.HeaderInfoName && propertyName.Key != TDForm.HeaderCodeName && propertyName.Key != TDForm.ServiceGroupIdName && propertyName.Key != TDForm.TopicName && propertyName.Key != TDForm.OpName) { - if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{TDValues.ContextPrefixAioProtocol}:")) + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{TDValues.ContextPrefixAioProtocol}:") && !propertyName.Key.StartsWith($"{TDValues.ContextPrefixAioPlatform}:")) { errorReporter.ReportWarning($"Form has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); } @@ -1697,7 +1703,7 @@ private bool TryValidateSchemaReference(ValueTracker schemaRe { if (propertyName.Key != TDSchemaReference.SuccessName && propertyName.Key != TDSchemaReference.ContentTypeName && propertyName.Key != TDSchemaReference.SchemaName) { - if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{TDValues.ContextPrefixAioProtocol}:")) + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{TDValues.ContextPrefixAioProtocol}:") && !propertyName.Key.StartsWith($"{TDValues.ContextPrefixAioPlatform}:")) { errorReporter.ReportWarning($"Schema reference has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); } @@ -2006,7 +2012,7 @@ private bool TryValidateResidualProperties(Dictionary propertyName { if (propertyApprover?.Invoke(propertyName.Key) != true && !supportedProperties.Contains(propertyName.Key)) { - if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{TDValues.ContextPrefixAioProtocol}:")) + if (propertyName.Key.Contains(':') && !propertyName.Key.StartsWith($"{TDValues.ContextPrefixAioProtocol}:") && !propertyName.Key.StartsWith($"{TDValues.ContextPrefixAioPlatform}:")) { errorReporter.ReportWarning($"Data schema has unrecognized '{propertyName.Key}' property, which will be ignored.", propertyName.Value); } diff --git a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDProperty.cs b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDProperty.cs index 000f32ee6d..72257bbafc 100644 --- a/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDProperty.cs +++ b/codegen2/src/Azure.Iot.Operations.TDParser/Model/TDProperty.cs @@ -22,8 +22,6 @@ public class TDProperty : TDDataSchema, IEquatable, IDeserializable< public ValueTracker? ContainedIn { get; set; } - public ValueTracker? Namespace { get; set; } - public virtual bool Equals(TDProperty? other) { if (other == null) @@ -37,14 +35,13 @@ public virtual bool Equals(TDProperty? other) Placeholder == other.Placeholder && Forms == other.Forms && Contains == other.Contains && - ContainedIn == other.ContainedIn && - Namespace == other.Namespace; + ContainedIn == other.ContainedIn; } } public override int GetHashCode() { - return (base.GetHashCode(), ReadOnly, Placeholder, Forms, Contains, ContainedIn, Namespace).GetHashCode(); + return (base.GetHashCode(), ReadOnly, Placeholder, Forms, Contains, ContainedIn).GetHashCode(); } public static bool operator ==(TDProperty? left, TDProperty? right) @@ -126,13 +123,6 @@ public override IEnumerable Traverse() yield return item; } } - if (Namespace != null) - { - foreach (ITraversable item in Namespace.Traverse()) - { - yield return item; - } - } } public static new TDProperty Deserialize(ref Utf8JsonReader reader) diff --git a/codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/.gitignore b/codegen2/test/.gitignore similarity index 100% rename from codegen2/test/Azure.Iot.Operations.ProtocolCompiler.UnitTests/.gitignore rename to codegen2/test/.gitignore diff --git a/codegen2/test/test-cases/failure/ActionContainedIn.json b/codegen2/test/test-cases/failure/ActionContainedIn.json new file mode 100644 index 0000000000..d501c4a8bd --- /dev/null +++ b/codegen2/test/test-cases/failure/ActionContainedIn.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionContainedIn.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "ActionContainedIn.TM.json", + "line": 11, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/ActionContains.json b/codegen2/test/test-cases/failure/ActionContains.json new file mode 100644 index 0000000000..f2d96ee24e --- /dev/null +++ b/codegen2/test/test-cases/failure/ActionContains.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionContains.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "ActionContains.TM.json", + "line": 11, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/LinkEmptyHref.json b/codegen2/test/test-cases/failure/ActionMemberOfEmpty.json similarity index 61% rename from codegen2/test/test-cases/failure/LinkEmptyHref.json rename to codegen2/test/test-cases/failure/ActionMemberOfEmpty.json index b08731eb13..f4ae0bba25 100644 --- a/codegen2/test/test-cases/failure/LinkEmptyHref.json +++ b/codegen2/test/test-cases/failure/ActionMemberOfEmpty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/LinkEmptyHref.TM.json" ], + "thingFiles": [ "invalidAioBinding/ActionMemberOfEmpty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyEmpty", - "filename": "LinkEmptyHref.TM.json", + "filename": "ActionMemberOfEmpty.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/test-cases/failure/ActionMemberOfWithoutAovContext.json b/codegen2/test/test-cases/failure/ActionMemberOfWithoutAovContext.json new file mode 100644 index 0000000000..19108d122f --- /dev/null +++ b/codegen2/test/test-cases/failure/ActionMemberOfWithoutAovContext.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionMemberOfWithoutAovContext.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "ActionMemberOfWithoutAovContext.TM.json", + "line": 10, + "cfLine": 2, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/ActionNamespaceEmpty.json b/codegen2/test/test-cases/failure/ActionNamespaceEmpty.json new file mode 100644 index 0000000000..52e96c0137 --- /dev/null +++ b/codegen2/test/test-cases/failure/ActionNamespaceEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionNamespaceEmpty.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "ActionNamespaceEmpty.TM.json", + "line": 11, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/ActionNamespaceWithoutAovContext.json b/codegen2/test/test-cases/failure/ActionNamespaceWithoutAovContext.json new file mode 100644 index 0000000000..a06e2319b6 --- /dev/null +++ b/codegen2/test/test-cases/failure/ActionNamespaceWithoutAovContext.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ActionNamespaceWithoutAovContext.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "ActionNamespaceWithoutAovContext.TM.json", + "line": 10, + "cfLine": 2, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/ContextAovWrongUri.json b/codegen2/test/test-cases/failure/ContextAovWrongUri.json new file mode 100644 index 0000000000..5258c04721 --- /dev/null +++ b/codegen2/test/test-cases/failure/ContextAovWrongUri.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ContextAovWrongUri.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "ContextAovWrongUri.TM.json", + "line": 5, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/EventContainedInEmpty.json b/codegen2/test/test-cases/failure/EventContainedInEmpty.json new file mode 100644 index 0000000000..e8b36134bb --- /dev/null +++ b/codegen2/test/test-cases/failure/EventContainedInEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventContainedInEmpty.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "EventContainedInEmpty.TM.json", + "line": 30, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/EventContainedInEventContainsOther.json b/codegen2/test/test-cases/failure/EventContainedInEventContainsOther.json new file mode 100644 index 0000000000..c9608c3ee2 --- /dev/null +++ b/codegen2/test/test-cases/failure/EventContainedInEventContainsOther.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventContainedInEventContainsOther.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "EventContainedInEventContainsOther.TM.json", + "line": 31, + "cfLine": 18, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/EventContainedInNoEvent.json b/codegen2/test/test-cases/failure/EventContainedInNoEvent.json new file mode 100644 index 0000000000..56cdf4dc38 --- /dev/null +++ b/codegen2/test/test-cases/failure/EventContainedInNoEvent.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventContainedInNoEvent.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ItemNotFound", + "filename": "EventContainedInNoEvent.TM.json", + "line": 30, + "cfLine": 13, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/EventContainedInWithoutAovContext.json b/codegen2/test/test-cases/failure/EventContainedInWithoutAovContext.json new file mode 100644 index 0000000000..36fff7619e --- /dev/null +++ b/codegen2/test/test-cases/failure/EventContainedInWithoutAovContext.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventContainedInWithoutAovContext.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "EventContainedInWithoutAovContext.TM.json", + "line": 29, + "cfLine": 2, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/EventContainsEmpty.json b/codegen2/test/test-cases/failure/EventContainsEmpty.json new file mode 100644 index 0000000000..0bc014fcbe --- /dev/null +++ b/codegen2/test/test-cases/failure/EventContainsEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventContainsEmpty.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ElementMissing", + "filename": "EventContainsEmpty.TM.json", + "line": 18, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/EventContainsEventContainedInOther.json b/codegen2/test/test-cases/failure/EventContainsEventContainedInOther.json new file mode 100644 index 0000000000..24c81ce847 --- /dev/null +++ b/codegen2/test/test-cases/failure/EventContainsEventContainedInOther.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventContainsEventContainedInOther.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "EventContainsEventContainedInOther.TM.json", + "line": 18, + "cfLine": 31, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/EventContainsNoEvent.json b/codegen2/test/test-cases/failure/EventContainsNoEvent.json new file mode 100644 index 0000000000..50d651c4a0 --- /dev/null +++ b/codegen2/test/test-cases/failure/EventContainsNoEvent.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventContainsNoEvent.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ItemNotFound", + "filename": "EventContainsNoEvent.TM.json", + "line": 18, + "cfLine": 13, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/EventContainsWithoutAovContext.json b/codegen2/test/test-cases/failure/EventContainsWithoutAovContext.json new file mode 100644 index 0000000000..a768526aa2 --- /dev/null +++ b/codegen2/test/test-cases/failure/EventContainsWithoutAovContext.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventContainsWithoutAovContext.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "EventContainsWithoutAovContext.TM.json", + "line": 17, + "cfLine": 2, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/EventMemberOf.json b/codegen2/test/test-cases/failure/EventMemberOf.json new file mode 100644 index 0000000000..36faad93da --- /dev/null +++ b/codegen2/test/test-cases/failure/EventMemberOf.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventMemberOf.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "EventMemberOf.TM.json", + "line": 18, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/EventNamespaceEmpty.json b/codegen2/test/test-cases/failure/EventNamespaceEmpty.json new file mode 100644 index 0000000000..b92bdf833c --- /dev/null +++ b/codegen2/test/test-cases/failure/EventNamespaceEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventNamespaceEmpty.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "EventNamespaceEmpty.TM.json", + "line": 18, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/EventNamespaceWithoutAovContext.json b/codegen2/test/test-cases/failure/EventNamespaceWithoutAovContext.json new file mode 100644 index 0000000000..c05df5a972 --- /dev/null +++ b/codegen2/test/test-cases/failure/EventNamespaceWithoutAovContext.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/EventNamespaceWithoutAovContext.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "EventNamespaceWithoutAovContext.TM.json", + "line": 17, + "cfLine": 2, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/IsCompositeAndIsEvent.json b/codegen2/test/test-cases/failure/IsCompositeAndIsEvent.json new file mode 100644 index 0000000000..35672faabe --- /dev/null +++ b/codegen2/test/test-cases/failure/IsCompositeAndIsEvent.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/IsCompositeAndIsEvent.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "IsCompositeAndIsEvent.TM.json", + "line": 9, + "cfLine": 10, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/IsCompositeWithoutAovContext.json b/codegen2/test/test-cases/failure/IsCompositeWithoutAovContext.json new file mode 100644 index 0000000000..37785eb1c2 --- /dev/null +++ b/codegen2/test/test-cases/failure/IsCompositeWithoutAovContext.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/IsCompositeWithoutAovContext.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "IsCompositeWithoutAovContext.TM.json", + "line": 8, + "cfLine": 2, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/IsEventWithoutAovContext.json b/codegen2/test/test-cases/failure/IsEventWithoutAovContext.json new file mode 100644 index 0000000000..e037b9000e --- /dev/null +++ b/codegen2/test/test-cases/failure/IsEventWithoutAovContext.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/IsEventWithoutAovContext.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "IsEventWithoutAovContext.TM.json", + "line": 8, + "cfLine": 2, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/LinkCapabilityTypeJsonNotTm.json b/codegen2/test/test-cases/failure/LinkCapabilityTypeJsonNotTm.json new file mode 100644 index 0000000000..abe6dc83e2 --- /dev/null +++ b/codegen2/test/test-cases/failure/LinkCapabilityTypeJsonNotTm.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/LinkCapabilityTypeJsonNotTm.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "LinkCapabilityTypeJsonNotTm.TM.json", + "line": 13, + "cfLine": 11, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/LinkCapabilityWithoutAovContext.json b/codegen2/test/test-cases/failure/LinkCapabilityWithoutAovContext.json new file mode 100644 index 0000000000..40cd03f15b --- /dev/null +++ b/codegen2/test/test-cases/failure/LinkCapabilityWithoutAovContext.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/LinkCapabilityWithoutAovContext.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "LinkCapabilityWithoutAovContext.TM.json", + "line": 10, + "cfLine": 2, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/LinkComponentTypeJsonNotTm.json b/codegen2/test/test-cases/failure/LinkComponentTypeJsonNotTm.json new file mode 100644 index 0000000000..1f8fac20c1 --- /dev/null +++ b/codegen2/test/test-cases/failure/LinkComponentTypeJsonNotTm.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/LinkComponentTypeJsonNotTm.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "LinkComponentTypeJsonNotTm.TM.json", + "line": 13, + "cfLine": 11, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/LinkComponentWithoutAovContext.json b/codegen2/test/test-cases/failure/LinkComponentWithoutAovContext.json new file mode 100644 index 0000000000..0b5e35b2e3 --- /dev/null +++ b/codegen2/test/test-cases/failure/LinkComponentWithoutAovContext.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/LinkComponentWithoutAovContext.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "LinkComponentWithoutAovContext.TM.json", + "line": 10, + "cfLine": 2, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/LinkExtendsTypeJsonNotTm.json b/codegen2/test/test-cases/failure/LinkExtendsTypeJsonNotTm.json new file mode 100644 index 0000000000..aaacfd9e6e --- /dev/null +++ b/codegen2/test/test-cases/failure/LinkExtendsTypeJsonNotTm.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/LinkExtendsTypeJsonNotTm.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "LinkExtendsTypeJsonNotTm.TM.json", + "line": 12, + "cfLine": 10, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/LinkNamingEmptyHref.json b/codegen2/test/test-cases/failure/LinkNamingEmptyHref.json new file mode 100644 index 0000000000..80f3cd1093 --- /dev/null +++ b/codegen2/test/test-cases/failure/LinkNamingEmptyHref.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/LinkNamingEmptyHref.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "LinkNamingEmptyHref.TM.json", + "line": 11, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/LinkEmptyType.json b/codegen2/test/test-cases/failure/LinkNamingEmptyType.json similarity index 61% rename from codegen2/test/test-cases/failure/LinkEmptyType.json rename to codegen2/test/test-cases/failure/LinkNamingEmptyType.json index dc38611f85..9f4463e84b 100644 --- a/codegen2/test/test-cases/failure/LinkEmptyType.json +++ b/codegen2/test/test-cases/failure/LinkNamingEmptyType.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/LinkEmptyType.TM.json" ], + "thingFiles": [ "invalidAioBinding/LinkNamingEmptyType.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyEmpty", - "filename": "LinkEmptyType.TM.json", + "filename": "LinkNamingEmptyType.TM.json", "line": 12, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/test-cases/failure/LinkNoHref.json b/codegen2/test/test-cases/failure/LinkNamingNoHref.json similarity index 62% rename from codegen2/test/test-cases/failure/LinkNoHref.json rename to codegen2/test/test-cases/failure/LinkNamingNoHref.json index 7d29340985..0aa56a1969 100644 --- a/codegen2/test/test-cases/failure/LinkNoHref.json +++ b/codegen2/test/test-cases/failure/LinkNamingNoHref.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/LinkNoHref.TM.json" ], + "thingFiles": [ "invalidAioBinding/LinkNamingNoHref.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", - "filename": "LinkNoHref.TM.json", + "filename": "LinkNamingNoHref.TM.json", "line": 9, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/test-cases/failure/LinkNoType.json b/codegen2/test/test-cases/failure/LinkNamingNoType.json similarity index 62% rename from codegen2/test/test-cases/failure/LinkNoType.json rename to codegen2/test/test-cases/failure/LinkNamingNoType.json index 3396f0c006..a4a944ffee 100644 --- a/codegen2/test/test-cases/failure/LinkNoType.json +++ b/codegen2/test/test-cases/failure/LinkNamingNoType.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/LinkNoType.TM.json" ], + "thingFiles": [ "invalidAioBinding/LinkNamingNoType.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyMissing", - "filename": "LinkNoType.TM.json", + "filename": "LinkNamingNoType.TM.json", "line": 9, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/test-cases/failure/LinkNonJsonFile.json b/codegen2/test/test-cases/failure/LinkNamingNonJsonFile.json similarity index 60% rename from codegen2/test/test-cases/failure/LinkNonJsonFile.json rename to codegen2/test/test-cases/failure/LinkNamingNonJsonFile.json index 16f5bd7cdd..5a9802f863 100644 --- a/codegen2/test/test-cases/failure/LinkNonJsonFile.json +++ b/codegen2/test/test-cases/failure/LinkNamingNonJsonFile.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/LinkNonJsonFile.TM.json" ], + "thingFiles": [ "invalidAioBinding/LinkNamingNonJsonFile.TM.json" ], "lang": "none" }, "errors": [ { "condition": "JsonInvalid", - "filename": "LinkNonJsonFile.TM.json", + "filename": "LinkNamingNonJsonFile.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/test-cases/failure/LinkNonexistentFile.json b/codegen2/test/test-cases/failure/LinkNamingNonexistentFile.json similarity index 59% rename from codegen2/test/test-cases/failure/LinkNonexistentFile.json rename to codegen2/test/test-cases/failure/LinkNamingNonexistentFile.json index b8acb356e6..cafcdeb799 100644 --- a/codegen2/test/test-cases/failure/LinkNonexistentFile.json +++ b/codegen2/test/test-cases/failure/LinkNamingNonexistentFile.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/LinkNonexistentFile.TM.json" ], + "thingFiles": [ "invalidAioBinding/LinkNamingNonexistentFile.TM.json" ], "lang": "none" }, "errors": [ { "condition": "ItemNotFound", - "filename": "LinkNonexistentFile.TM.json", + "filename": "LinkNamingNonexistentFile.TM.json", "line": 11, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/test-cases/failure/LinkTypeNotJson.json b/codegen2/test/test-cases/failure/LinkNamingTypeNotJson.json similarity index 62% rename from codegen2/test/test-cases/failure/LinkTypeNotJson.json rename to codegen2/test/test-cases/failure/LinkNamingTypeNotJson.json index 2d404fa795..ef3eca0919 100644 --- a/codegen2/test/test-cases/failure/LinkTypeNotJson.json +++ b/codegen2/test/test-cases/failure/LinkNamingTypeNotJson.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/LinkTypeNotJson.TM.json" ], + "thingFiles": [ "invalidAioBinding/LinkNamingTypeNotJson.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupportedValue", - "filename": "LinkTypeNotJson.TM.json", + "filename": "LinkNamingTypeNotJson.TM.json", "line": 12, "cfLine": 10, "crossRef": "" diff --git a/codegen2/test/test-cases/failure/LinkUnsupportedProperty.json b/codegen2/test/test-cases/failure/LinkNamingUnsupportedProperty.json similarity index 58% rename from codegen2/test/test-cases/failure/LinkUnsupportedProperty.json rename to codegen2/test/test-cases/failure/LinkNamingUnsupportedProperty.json index 562aad7999..2bb9a92c49 100644 --- a/codegen2/test/test-cases/failure/LinkUnsupportedProperty.json +++ b/codegen2/test/test-cases/failure/LinkNamingUnsupportedProperty.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/LinkUnsupportedProperty.TM.json" ], + "thingFiles": [ "invalidAioBinding/LinkNamingUnsupportedProperty.TM.json" ], "lang": "none" }, "errors": [ { "condition": "PropertyUnsupported", - "filename": "LinkUnsupportedProperty.TM.json", + "filename": "LinkNamingUnsupportedProperty.TM.json", "line": 13, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/test-cases/failure/LinkReferenceRefType.json b/codegen2/test/test-cases/failure/LinkReferenceRefType.json new file mode 100644 index 0000000000..a10d0ce840 --- /dev/null +++ b/codegen2/test/test-cases/failure/LinkReferenceRefType.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/LinkReferenceRefType.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "LinkReferenceRefType.TM.json", + "line": 12, + "cfLine": 11, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/LinkReferenceTypeJsonNotTm.json b/codegen2/test/test-cases/failure/LinkReferenceTypeJsonNotTm.json new file mode 100644 index 0000000000..06f7515ed3 --- /dev/null +++ b/codegen2/test/test-cases/failure/LinkReferenceTypeJsonNotTm.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/LinkReferenceTypeJsonNotTm.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "LinkReferenceTypeJsonNotTm.TM.json", + "line": 13, + "cfLine": 11, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/LinkReferenceWithoutAovContext.json b/codegen2/test/test-cases/failure/LinkReferenceWithoutAovContext.json new file mode 100644 index 0000000000..1c4c56c9e6 --- /dev/null +++ b/codegen2/test/test-cases/failure/LinkReferenceWithoutAovContext.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/LinkReferenceWithoutAovContext.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "LinkReferenceWithoutAovContext.TM.json", + "line": 10, + "cfLine": 2, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/LinkTypedReferenceNoRefType.json b/codegen2/test/test-cases/failure/LinkTypedReferenceNoRefType.json new file mode 100644 index 0000000000..28c23f068f --- /dev/null +++ b/codegen2/test/test-cases/failure/LinkTypedReferenceNoRefType.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/LinkTypedReferenceNoRefType.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyMissing", + "filename": "LinkTypedReferenceNoRefType.TM.json", + "line": 10, + "cfLine": 11, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/LinkTypedReferenceRefTypeEmpty.json b/codegen2/test/test-cases/failure/LinkTypedReferenceRefTypeEmpty.json new file mode 100644 index 0000000000..f15842b418 --- /dev/null +++ b/codegen2/test/test-cases/failure/LinkTypedReferenceRefTypeEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/LinkTypedReferenceRefTypeEmpty.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "LinkTypedReferenceRefTypeEmpty.TM.json", + "line": 12, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/LinkTypedReferenceTypeJsonNotTm.json b/codegen2/test/test-cases/failure/LinkTypedReferenceTypeJsonNotTm.json new file mode 100644 index 0000000000..8a1b8c7397 --- /dev/null +++ b/codegen2/test/test-cases/failure/LinkTypedReferenceTypeJsonNotTm.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/LinkTypedReferenceTypeJsonNotTm.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupportedValue", + "filename": "LinkTypedReferenceTypeJsonNotTm.TM.json", + "line": 14, + "cfLine": 11, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/LinkTypedReferenceWithoutAovContext.json b/codegen2/test/test-cases/failure/LinkTypedReferenceWithoutAovContext.json new file mode 100644 index 0000000000..2eec4a7413 --- /dev/null +++ b/codegen2/test/test-cases/failure/LinkTypedReferenceWithoutAovContext.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/LinkTypedReferenceWithoutAovContext.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "LinkTypedReferenceWithoutAovContext.TM.json", + "line": 10, + "cfLine": 2, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/MultipleLinks.json b/codegen2/test/test-cases/failure/MultipleLinksNaming.json similarity index 61% rename from codegen2/test/test-cases/failure/MultipleLinks.json rename to codegen2/test/test-cases/failure/MultipleLinksNaming.json index 868238fa78..e6ac3fe54b 100644 --- a/codegen2/test/test-cases/failure/MultipleLinks.json +++ b/codegen2/test/test-cases/failure/MultipleLinksNaming.json @@ -1,13 +1,13 @@ { "success": false, "commandLine": { - "thingFiles": [ "invalidAioBinding/MultipleLinks.TM.json" ], + "thingFiles": [ "invalidAioBinding/MultipleLinksNaming.TM.json" ], "lang": "none" }, "errors": [ { "condition": "Duplication", - "filename": "MultipleLinks.TM.json", + "filename": "MultipleLinksNaming.TM.json", "line": 8, "cfLine": 0, "crossRef": "" diff --git a/codegen2/test/test-cases/failure/PropertyContainedInEmpty.json b/codegen2/test/test-cases/failure/PropertyContainedInEmpty.json new file mode 100644 index 0000000000..ea8ed4c6ea --- /dev/null +++ b/codegen2/test/test-cases/failure/PropertyContainedInEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyContainedInEmpty.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "PropertyContainedInEmpty.TM.json", + "line": 24, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/PropertyContainedInNoProperty.json b/codegen2/test/test-cases/failure/PropertyContainedInNoProperty.json new file mode 100644 index 0000000000..dc01073528 --- /dev/null +++ b/codegen2/test/test-cases/failure/PropertyContainedInNoProperty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyContainedInNoProperty.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ItemNotFound", + "filename": "PropertyContainedInNoProperty.TM.json", + "line": 24, + "cfLine": 11, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/PropertyContainedInPropertyContainsOther.json b/codegen2/test/test-cases/failure/PropertyContainedInPropertyContainsOther.json new file mode 100644 index 0000000000..68be98a91d --- /dev/null +++ b/codegen2/test/test-cases/failure/PropertyContainedInPropertyContainsOther.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyContainedInPropertyContainsOther.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "PropertyContainedInPropertyContainsOther.TM.json", + "line": 25, + "cfLine": 14, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/PropertyContainedInWithoutAovContext.json b/codegen2/test/test-cases/failure/PropertyContainedInWithoutAovContext.json new file mode 100644 index 0000000000..391470f9d5 --- /dev/null +++ b/codegen2/test/test-cases/failure/PropertyContainedInWithoutAovContext.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyContainedInWithoutAovContext.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "PropertyContainedInWithoutAovContext.TM.json", + "line": 23, + "cfLine": 2, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/PropertyContainsEmpty.json b/codegen2/test/test-cases/failure/PropertyContainsEmpty.json new file mode 100644 index 0000000000..5f20ba403b --- /dev/null +++ b/codegen2/test/test-cases/failure/PropertyContainsEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyContainsEmpty.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ElementMissing", + "filename": "PropertyContainsEmpty.TM.json", + "line": 14, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/PropertyContainsNoProperty.json b/codegen2/test/test-cases/failure/PropertyContainsNoProperty.json new file mode 100644 index 0000000000..07ddbd7920 --- /dev/null +++ b/codegen2/test/test-cases/failure/PropertyContainsNoProperty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyContainsNoProperty.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ItemNotFound", + "filename": "PropertyContainsNoProperty.TM.json", + "line": 14, + "cfLine": 11, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/PropertyContainsPropertyContainedInOther.json b/codegen2/test/test-cases/failure/PropertyContainsPropertyContainedInOther.json new file mode 100644 index 0000000000..de78099433 --- /dev/null +++ b/codegen2/test/test-cases/failure/PropertyContainsPropertyContainedInOther.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyContainsPropertyContainedInOther.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "ValuesInconsistent", + "filename": "PropertyContainsPropertyContainedInOther.TM.json", + "line": 14, + "cfLine": 25, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/PropertyContainsWithoutAovContext.json b/codegen2/test/test-cases/failure/PropertyContainsWithoutAovContext.json new file mode 100644 index 0000000000..d0542d1fe4 --- /dev/null +++ b/codegen2/test/test-cases/failure/PropertyContainsWithoutAovContext.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyContainsWithoutAovContext.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "PropertyContainsWithoutAovContext.TM.json", + "line": 13, + "cfLine": 2, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/PropertyMemberOf.json b/codegen2/test/test-cases/failure/PropertyMemberOf.json new file mode 100644 index 0000000000..3ae572e53f --- /dev/null +++ b/codegen2/test/test-cases/failure/PropertyMemberOf.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyMemberOf.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "PropertyMemberOf.TM.json", + "line": 14, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/PropertyNamespaceEmpty.json b/codegen2/test/test-cases/failure/PropertyNamespaceEmpty.json new file mode 100644 index 0000000000..351aed1cba --- /dev/null +++ b/codegen2/test/test-cases/failure/PropertyNamespaceEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyNamespaceEmpty.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "PropertyNamespaceEmpty.TM.json", + "line": 14, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/PropertyNamespaceWithoutAovContext.json b/codegen2/test/test-cases/failure/PropertyNamespaceWithoutAovContext.json new file mode 100644 index 0000000000..34366b1a64 --- /dev/null +++ b/codegen2/test/test-cases/failure/PropertyNamespaceWithoutAovContext.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/PropertyNamespaceWithoutAovContext.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "PropertyNamespaceWithoutAovContext.TM.json", + "line": 13, + "cfLine": 2, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/TypeRefEmpty.json b/codegen2/test/test-cases/failure/TypeRefEmpty.json new file mode 100644 index 0000000000..fffc75fbd0 --- /dev/null +++ b/codegen2/test/test-cases/failure/TypeRefEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/TypeRefEmpty.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "TypeRefEmpty.TM.json", + "line": 9, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/TypeRefWithoutAovContext.json b/codegen2/test/test-cases/failure/TypeRefWithoutAovContext.json new file mode 100644 index 0000000000..78a45b9711 --- /dev/null +++ b/codegen2/test/test-cases/failure/TypeRefWithoutAovContext.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/TypeRefWithoutAovContext.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "TypeRefWithoutAovContext.TM.json", + "line": 8, + "cfLine": 2, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/success/EventContainedInEventNoContains.json b/codegen2/test/test-cases/success/EventContainedInEventNoContains.json new file mode 100644 index 0000000000..d946a85d37 --- /dev/null +++ b/codegen2/test/test-cases/success/EventContainedInEventNoContains.json @@ -0,0 +1,7 @@ +{ + "success": true, + "commandLine": { + "thingFiles": [ "valid/EventContainedInEventNoContains.TM.json" ], + "lang": "none" + } +} diff --git a/codegen2/test/test-cases/success/EventContainsEventNoContainedIn.json b/codegen2/test/test-cases/success/EventContainsEventNoContainedIn.json new file mode 100644 index 0000000000..751522699f --- /dev/null +++ b/codegen2/test/test-cases/success/EventContainsEventNoContainedIn.json @@ -0,0 +1,7 @@ +{ + "success": true, + "commandLine": { + "thingFiles": [ "valid/EventContainsEventNoContainedIn.TM.json" ], + "lang": "none" + } +} diff --git a/codegen2/test/test-cases/success/LinkCapability.json b/codegen2/test/test-cases/success/LinkCapability.json new file mode 100644 index 0000000000..5ff8f2e8fc --- /dev/null +++ b/codegen2/test/test-cases/success/LinkCapability.json @@ -0,0 +1,7 @@ +{ + "success": true, + "commandLine": { + "thingFiles": [ "valid/LinkCapability.TM.json" ], + "lang": "none" + } +} diff --git a/codegen2/test/test-cases/success/LinkComponent.json b/codegen2/test/test-cases/success/LinkComponent.json new file mode 100644 index 0000000000..a2768d7a71 --- /dev/null +++ b/codegen2/test/test-cases/success/LinkComponent.json @@ -0,0 +1,7 @@ +{ + "success": true, + "commandLine": { + "thingFiles": [ "valid/LinkComponent.TM.json" ], + "lang": "none" + } +} diff --git a/codegen2/test/test-cases/success/LinkOtherAovRel.json b/codegen2/test/test-cases/success/LinkOtherAovRel.json new file mode 100644 index 0000000000..b220c3b3f9 --- /dev/null +++ b/codegen2/test/test-cases/success/LinkOtherAovRel.json @@ -0,0 +1,7 @@ +{ + "success": true, + "commandLine": { + "thingFiles": [ "valid/LinkOtherAovRel.TM.json" ], + "lang": "none" + } +} diff --git a/codegen2/test/test-cases/success/LinkReference.json b/codegen2/test/test-cases/success/LinkReference.json new file mode 100644 index 0000000000..43bd6a51f3 --- /dev/null +++ b/codegen2/test/test-cases/success/LinkReference.json @@ -0,0 +1,7 @@ +{ + "success": true, + "commandLine": { + "thingFiles": [ "valid/LinkReference.TM.json" ], + "lang": "none" + } +} diff --git a/codegen2/test/test-cases/success/LinkTypedReference.json b/codegen2/test/test-cases/success/LinkTypedReference.json new file mode 100644 index 0000000000..94e756f4a4 --- /dev/null +++ b/codegen2/test/test-cases/success/LinkTypedReference.json @@ -0,0 +1,7 @@ +{ + "success": true, + "commandLine": { + "thingFiles": [ "valid/LinkTypedReference.TM.json" ], + "lang": "none" + } +} diff --git a/codegen2/test/test-cases/success/PropertyContainedInPropertyNoContains.json b/codegen2/test/test-cases/success/PropertyContainedInPropertyNoContains.json new file mode 100644 index 0000000000..9aa168456d --- /dev/null +++ b/codegen2/test/test-cases/success/PropertyContainedInPropertyNoContains.json @@ -0,0 +1,7 @@ +{ + "success": true, + "commandLine": { + "thingFiles": [ "valid/PropertyContainedInPropertyNoContains.TM.json" ], + "lang": "none" + } +} diff --git a/codegen2/test/test-cases/success/PropertyContainsPropertyNoContainedIn.json b/codegen2/test/test-cases/success/PropertyContainsPropertyNoContainedIn.json new file mode 100644 index 0000000000..d129086b21 --- /dev/null +++ b/codegen2/test/test-cases/success/PropertyContainsPropertyNoContainedIn.json @@ -0,0 +1,7 @@ +{ + "success": true, + "commandLine": { + "thingFiles": [ "valid/PropertyContainsPropertyNoContainedIn.TM.json" ], + "lang": "none" + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/ActionContainedIn.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionContainedIn.TM.json new file mode 100644 index 0000000000..82083705ce --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/ActionContainedIn.TM.json @@ -0,0 +1,25 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + "noop": { + "aov:containedIn": [ "somethingElse" ], + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/TestThing/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/ActionContains.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionContains.TM.json new file mode 100644 index 0000000000..a5d4d9cb55 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/ActionContains.TM.json @@ -0,0 +1,25 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + "noop": { + "aov:contains": "something", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/TestThing/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/ActionMemberOfEmpty.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionMemberOfEmpty.TM.json new file mode 100644 index 0000000000..6d3e0ab222 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/ActionMemberOfEmpty.TM.json @@ -0,0 +1,25 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + "noop": { + "aov:memberOf": "", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/TestThing/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/ActionMemberOfWithoutAovContext.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionMemberOfWithoutAovContext.TM.json new file mode 100644 index 0000000000..ec04114ad1 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/ActionMemberOfWithoutAovContext.TM.json @@ -0,0 +1,24 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + "noop": { + "aov:memberOf": "MyActionGroup", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/TestThing/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/ActionNamespaceEmpty.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionNamespaceEmpty.TM.json new file mode 100644 index 0000000000..a1c7f5fbde --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/ActionNamespaceEmpty.TM.json @@ -0,0 +1,25 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + "noop": { + "aov:namespace": "", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/TestThing/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/ActionNamespaceWithoutAovContext.TM.json b/codegen2/test/thing-models/invalidAioBinding/ActionNamespaceWithoutAovContext.TM.json new file mode 100644 index 0000000000..0589d8de52 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/ActionNamespaceWithoutAovContext.TM.json @@ -0,0 +1,24 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + "noop": { + "aov:namespace": "MyNamespace", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/TestThing/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/ContextAovWrongUri.TM.json b/codegen2/test/thing-models/invalidAioBinding/ContextAovWrongUri.TM.json new file mode 100644 index 0000000000..a41dc443b1 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/ContextAovWrongUri.TM.json @@ -0,0 +1,24 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/SomethingcElse/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + "noop": { + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/TestThing/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/EventContainedInEmpty.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventContainedInEmpty.TM.json new file mode 100644 index 0000000000..364cc5b9e1 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/EventContainedInEmpty.TM.json @@ -0,0 +1,40 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + }, + "events": { + "alpha": { + "data": { + "type": "string" + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{senderId}", + "op": "subscribeevent" + } + ] + }, + "beta": { + "data": { + "type": "string" + }, + "aov:containedIn": "", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/beta/{senderId}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/EventContainedInEventContainsOther.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventContainedInEventContainsOther.TM.json new file mode 100644 index 0000000000..849e9b8cdd --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/EventContainedInEventContainsOther.TM.json @@ -0,0 +1,53 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + }, + "events": { + "alpha": { + "data": { + "type": "string" + }, + "aov:contains": [ "gamma" ], + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{senderId}", + "op": "subscribeevent" + } + ] + }, + "beta": { + "data": { + "type": "string" + }, + "aov:containedIn": "alpha", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/beta/{senderId}", + "op": "subscribeevent" + } + ] + }, + "gamma": { + "data": { + "type": "string" + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/gamma/{senderId}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/EventContainedInNoEvent.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventContainedInNoEvent.TM.json new file mode 100644 index 0000000000..120d89059c --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/EventContainedInNoEvent.TM.json @@ -0,0 +1,40 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + }, + "events": { + "alpha": { + "data": { + "type": "string" + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{senderId}", + "op": "subscribeevent" + } + ] + }, + "beta": { + "data": { + "type": "string" + }, + "aov:containedIn": "gamma", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/beta/{senderId}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/EventContainedInWithoutAovContext.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventContainedInWithoutAovContext.TM.json new file mode 100644 index 0000000000..258236b6a0 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/EventContainedInWithoutAovContext.TM.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + }, + "events": { + "alpha": { + "data": { + "type": "string" + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{senderId}", + "op": "subscribeevent" + } + ] + }, + "beta": { + "data": { + "type": "string" + }, + "aov:containedIn": "alpha", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/beta/{senderId}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/EventContainsEmpty.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventContainsEmpty.TM.json new file mode 100644 index 0000000000..e5c759487e --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/EventContainsEmpty.TM.json @@ -0,0 +1,40 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + }, + "events": { + "alpha": { + "data": { + "type": "string" + }, + "aov:contains": [ ], + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{senderId}", + "op": "subscribeevent" + } + ] + }, + "beta": { + "data": { + "type": "string" + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/beta/{senderId}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/EventContainsEventContainedInOther.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventContainsEventContainedInOther.TM.json new file mode 100644 index 0000000000..d8254ec710 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/EventContainsEventContainedInOther.TM.json @@ -0,0 +1,53 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + }, + "events": { + "alpha": { + "data": { + "type": "string" + }, + "aov:contains": [ "beta" ], + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{senderId}", + "op": "subscribeevent" + } + ] + }, + "beta": { + "data": { + "type": "string" + }, + "aov:containedIn": "gamma", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/beta/{senderId}", + "op": "subscribeevent" + } + ] + }, + "gamma": { + "data": { + "type": "string" + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/gamma/{senderId}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/EventContainsNoEvent.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventContainsNoEvent.TM.json new file mode 100644 index 0000000000..b5de749744 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/EventContainsNoEvent.TM.json @@ -0,0 +1,40 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + }, + "events": { + "alpha": { + "data": { + "type": "string" + }, + "aov:contains": [ "gamma" ], + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{senderId}", + "op": "subscribeevent" + } + ] + }, + "beta": { + "data": { + "type": "string" + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/beta/{senderId}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/EventContainsWithoutAovContext.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventContainsWithoutAovContext.TM.json new file mode 100644 index 0000000000..146938884c --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/EventContainsWithoutAovContext.TM.json @@ -0,0 +1,39 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + }, + "events": { + "alpha": { + "data": { + "type": "string" + }, + "aov:contains": [ "beta" ], + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{senderId}", + "op": "subscribeevent" + } + ] + }, + "beta": { + "data": { + "type": "string" + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/beta/{senderId}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/EventMemberOf.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventMemberOf.TM.json new file mode 100644 index 0000000000..f8d7f0964d --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/EventMemberOf.TM.json @@ -0,0 +1,28 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + }, + "events": { + "alpha": { + "data": { + "type": "string" + }, + "aov:memberOf": "MyPropertyGroup", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{senderId}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/EventNamespaceEmpty.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventNamespaceEmpty.TM.json new file mode 100644 index 0000000000..2ffab44326 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/EventNamespaceEmpty.TM.json @@ -0,0 +1,28 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + }, + "events": { + "alpha": { + "data": { + "type": "string" + }, + "aov:namespace": "", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{senderId}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/EventNamespaceWithoutAovContext.TM.json b/codegen2/test/thing-models/invalidAioBinding/EventNamespaceWithoutAovContext.TM.json new file mode 100644 index 0000000000..53fcf3f2aa --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/EventNamespaceWithoutAovContext.TM.json @@ -0,0 +1,27 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + }, + "events": { + "alpha": { + "data": { + "type": "string" + }, + "aov:namespace": "MyNamespace", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{senderId}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/IsCompositeAndIsEvent.TM.json b/codegen2/test/thing-models/invalidAioBinding/IsCompositeAndIsEvent.TM.json new file mode 100644 index 0000000000..c23f413ec6 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/IsCompositeAndIsEvent.TM.json @@ -0,0 +1,26 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "aov:isComposite": true, + "aov:isEvent": true, + "actions": { + "noop": { + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/IsCompositeWithoutAovContext.TM.json b/codegen2/test/thing-models/invalidAioBinding/IsCompositeWithoutAovContext.TM.json new file mode 100644 index 0000000000..d831ebe0da --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/IsCompositeWithoutAovContext.TM.json @@ -0,0 +1,24 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "aov:isComposite": true, + "actions": { + "noop": { + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/IsEventWithoutAovContext.TM.json b/codegen2/test/thing-models/invalidAioBinding/IsEventWithoutAovContext.TM.json new file mode 100644 index 0000000000..741da9281f --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/IsEventWithoutAovContext.TM.json @@ -0,0 +1,24 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "aov:isEvent": true, + "actions": { + "noop": { + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/LinkCapabilityTypeJsonNotTm.TM.json b/codegen2/test/thing-models/invalidAioBinding/LinkCapabilityTypeJsonNotTm.TM.json new file mode 100644 index 0000000000..7d885bdad5 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/LinkCapabilityTypeJsonNotTm.TM.json @@ -0,0 +1,31 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "links": [ + { + "rel": "aov:capability", + "href": "http://example.com/BasicOnOffTM", + "type": "application/json" + } + ], + "actions": { + "noop": { + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/TestThing/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/LinkCapabilityWithoutAovContext.TM.json b/codegen2/test/thing-models/invalidAioBinding/LinkCapabilityWithoutAovContext.TM.json new file mode 100644 index 0000000000..d31aa2acf7 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/LinkCapabilityWithoutAovContext.TM.json @@ -0,0 +1,30 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "links": [ + { + "rel": "aov:capability", + "href": "http://example.com/BasicOnOffTM", + "type": "application/tm+json" + } + ], + "actions": { + "noop": { + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/TestThing/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/LinkComponentTypeJsonNotTm.TM.json b/codegen2/test/thing-models/invalidAioBinding/LinkComponentTypeJsonNotTm.TM.json new file mode 100644 index 0000000000..3dba5b3cf2 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/LinkComponentTypeJsonNotTm.TM.json @@ -0,0 +1,31 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "links": [ + { + "rel": "aov:component", + "href": "http://example.com/BasicOnOffTM", + "type": "application/json" + } + ], + "actions": { + "noop": { + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/TestThing/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/LinkComponentWithoutAovContext.TM.json b/codegen2/test/thing-models/invalidAioBinding/LinkComponentWithoutAovContext.TM.json new file mode 100644 index 0000000000..644f764e92 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/LinkComponentWithoutAovContext.TM.json @@ -0,0 +1,30 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "links": [ + { + "rel": "aov:component", + "href": "http://example.com/BasicOnOffTM", + "type": "application/tm+json" + } + ], + "actions": { + "noop": { + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/TestThing/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/LinkExtendsTypeJsonNotTm.TM.json b/codegen2/test/thing-models/invalidAioBinding/LinkExtendsTypeJsonNotTm.TM.json new file mode 100644 index 0000000000..40c26473b1 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/LinkExtendsTypeJsonNotTm.TM.json @@ -0,0 +1,30 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "links": [ + { + "rel": "tm:extends", + "href": "http://example.com/BasicOnOffTM", + "type": "application/json" + } + ], + "actions": { + "noop": { + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/TestThing/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/LinkEmptyHref.TM.json b/codegen2/test/thing-models/invalidAioBinding/LinkNamingEmptyHref.TM.json similarity index 100% rename from codegen2/test/thing-models/invalidAioBinding/LinkEmptyHref.TM.json rename to codegen2/test/thing-models/invalidAioBinding/LinkNamingEmptyHref.TM.json diff --git a/codegen2/test/thing-models/invalidAioBinding/LinkEmptyType.TM.json b/codegen2/test/thing-models/invalidAioBinding/LinkNamingEmptyType.TM.json similarity index 100% rename from codegen2/test/thing-models/invalidAioBinding/LinkEmptyType.TM.json rename to codegen2/test/thing-models/invalidAioBinding/LinkNamingEmptyType.TM.json diff --git a/codegen2/test/thing-models/invalidAioBinding/LinkNoHref.TM.json b/codegen2/test/thing-models/invalidAioBinding/LinkNamingNoHref.TM.json similarity index 100% rename from codegen2/test/thing-models/invalidAioBinding/LinkNoHref.TM.json rename to codegen2/test/thing-models/invalidAioBinding/LinkNamingNoHref.TM.json diff --git a/codegen2/test/thing-models/invalidAioBinding/LinkNoType.TM.json b/codegen2/test/thing-models/invalidAioBinding/LinkNamingNoType.TM.json similarity index 100% rename from codegen2/test/thing-models/invalidAioBinding/LinkNoType.TM.json rename to codegen2/test/thing-models/invalidAioBinding/LinkNamingNoType.TM.json diff --git a/codegen2/test/thing-models/invalidAioBinding/LinkNonJsonFile.TM.json b/codegen2/test/thing-models/invalidAioBinding/LinkNamingNonJsonFile.TM.json similarity index 100% rename from codegen2/test/thing-models/invalidAioBinding/LinkNonJsonFile.TM.json rename to codegen2/test/thing-models/invalidAioBinding/LinkNamingNonJsonFile.TM.json diff --git a/codegen2/test/thing-models/invalidAioBinding/LinkNonexistentFile.TM.json b/codegen2/test/thing-models/invalidAioBinding/LinkNamingNonexistentFile.TM.json similarity index 100% rename from codegen2/test/thing-models/invalidAioBinding/LinkNonexistentFile.TM.json rename to codegen2/test/thing-models/invalidAioBinding/LinkNamingNonexistentFile.TM.json diff --git a/codegen2/test/thing-models/invalidAioBinding/LinkTypeNotJson.TM.json b/codegen2/test/thing-models/invalidAioBinding/LinkNamingTypeNotJson.TM.json similarity index 100% rename from codegen2/test/thing-models/invalidAioBinding/LinkTypeNotJson.TM.json rename to codegen2/test/thing-models/invalidAioBinding/LinkNamingTypeNotJson.TM.json diff --git a/codegen2/test/thing-models/invalidAioBinding/LinkUnsupportedProperty.TM.json b/codegen2/test/thing-models/invalidAioBinding/LinkNamingUnsupportedProperty.TM.json similarity index 100% rename from codegen2/test/thing-models/invalidAioBinding/LinkUnsupportedProperty.TM.json rename to codegen2/test/thing-models/invalidAioBinding/LinkNamingUnsupportedProperty.TM.json diff --git a/codegen2/test/thing-models/invalidAioBinding/LinkReferenceRefType.TM.json b/codegen2/test/thing-models/invalidAioBinding/LinkReferenceRefType.TM.json new file mode 100644 index 0000000000..94547d64b9 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/LinkReferenceRefType.TM.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "links": [ + { + "rel": "aov:reference", + "aov:refType": "MyReferenceType", + "href": "http://example.com/BasicOnOffTM", + "type": "application/tm+json" + } + ], + "actions": { + "noop": { + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/TestThing/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/LinkReferenceTypeJsonNotTm.TM.json b/codegen2/test/thing-models/invalidAioBinding/LinkReferenceTypeJsonNotTm.TM.json new file mode 100644 index 0000000000..ab6ba545da --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/LinkReferenceTypeJsonNotTm.TM.json @@ -0,0 +1,31 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "links": [ + { + "rel": "aov:reference", + "href": "http://example.com/BasicOnOffTM", + "type": "application/json" + } + ], + "actions": { + "noop": { + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/TestThing/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/LinkReferenceWithoutAovContext.TM.json b/codegen2/test/thing-models/invalidAioBinding/LinkReferenceWithoutAovContext.TM.json new file mode 100644 index 0000000000..63732a226b --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/LinkReferenceWithoutAovContext.TM.json @@ -0,0 +1,30 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "links": [ + { + "rel": "aov:reference", + "href": "http://example.com/BasicOnOffTM", + "type": "application/tm+json" + } + ], + "actions": { + "noop": { + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/TestThing/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/LinkTypedReferenceNoRefType.TM.json b/codegen2/test/thing-models/invalidAioBinding/LinkTypedReferenceNoRefType.TM.json new file mode 100644 index 0000000000..844eb5a294 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/LinkTypedReferenceNoRefType.TM.json @@ -0,0 +1,31 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "links": [ + { + "rel": "aov:typedReference", + "href": "http://example.com/BasicOnOffTM", + "type": "application/tm+json" + } + ], + "actions": { + "noop": { + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/TestThing/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/LinkTypedReferenceRefTypeEmpty.TM.json b/codegen2/test/thing-models/invalidAioBinding/LinkTypedReferenceRefTypeEmpty.TM.json new file mode 100644 index 0000000000..f712c1f7c4 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/LinkTypedReferenceRefTypeEmpty.TM.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "links": [ + { + "rel": "aov:typedReference", + "aov:refType": "", + "href": "http://example.com/BasicOnOffTM", + "type": "application/tm+json" + } + ], + "actions": { + "noop": { + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/TestThing/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/LinkTypedReferenceTypeJsonNotTm.TM.json b/codegen2/test/thing-models/invalidAioBinding/LinkTypedReferenceTypeJsonNotTm.TM.json new file mode 100644 index 0000000000..b5ac7464bf --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/LinkTypedReferenceTypeJsonNotTm.TM.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "links": [ + { + "rel": "aov:typedReference", + "aov:refType": "MyReferenceType", + "href": "http://example.com/BasicOnOffTM", + "type": "application/json" + } + ], + "actions": { + "noop": { + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/TestThing/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/LinkTypedReferenceWithoutAovContext.TM.json b/codegen2/test/thing-models/invalidAioBinding/LinkTypedReferenceWithoutAovContext.TM.json new file mode 100644 index 0000000000..b11b69f09f --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/LinkTypedReferenceWithoutAovContext.TM.json @@ -0,0 +1,31 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "links": [ + { + "rel": "aov:typedReference", + "aov:refType": "MyReferenceType", + "href": "http://example.com/BasicOnOffTM", + "type": "application/tm+json" + } + ], + "actions": { + "noop": { + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/TestThing/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/MultipleLinks.TM.json b/codegen2/test/thing-models/invalidAioBinding/MultipleLinksNaming.TM.json similarity index 100% rename from codegen2/test/thing-models/invalidAioBinding/MultipleLinks.TM.json rename to codegen2/test/thing-models/invalidAioBinding/MultipleLinksNaming.TM.json diff --git a/codegen2/test/thing-models/invalidAioBinding/PropertyContainedInEmpty.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyContainedInEmpty.TM.json new file mode 100644 index 0000000000..9252f1e43f --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/PropertyContainedInEmpty.TM.json @@ -0,0 +1,36 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + }, + "beta": { + "type": "string", + "aov:containedIn": "", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/beta/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/PropertyContainedInNoProperty.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyContainedInNoProperty.TM.json new file mode 100644 index 0000000000..7702f337fc --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/PropertyContainedInNoProperty.TM.json @@ -0,0 +1,36 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + }, + "beta": { + "type": "string", + "aov:containedIn": "gamma", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/beta/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/PropertyContainedInPropertyContainsOther.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyContainedInPropertyContainsOther.TM.json new file mode 100644 index 0000000000..65a70e292c --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/PropertyContainedInPropertyContainsOther.TM.json @@ -0,0 +1,47 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "aov:contains": [ "gamma" ], + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + }, + "beta": { + "type": "string", + "aov:containedIn": "alpha", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/beta/{maintainerId}", + "op": "readproperty" + } + ] + }, + "gamma": { + "type": "string", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/gamma/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/PropertyContainedInWithoutAovContext.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyContainedInWithoutAovContext.TM.json new file mode 100644 index 0000000000..e84833ec71 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/PropertyContainedInWithoutAovContext.TM.json @@ -0,0 +1,35 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + }, + "beta": { + "type": "string", + "aov:containedIn": "alpha", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/beta/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/PropertyContainsEmpty.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyContainsEmpty.TM.json new file mode 100644 index 0000000000..6569cb4f1b --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/PropertyContainsEmpty.TM.json @@ -0,0 +1,36 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "aov:contains": [ ], + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + }, + "beta": { + "type": "string", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/beta/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/PropertyContainsNoProperty.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyContainsNoProperty.TM.json new file mode 100644 index 0000000000..c4a1b41b49 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/PropertyContainsNoProperty.TM.json @@ -0,0 +1,36 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "aov:contains": [ "gamma" ], + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + }, + "beta": { + "type": "string", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/beta/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/PropertyContainsPropertyContainedInOther.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyContainsPropertyContainedInOther.TM.json new file mode 100644 index 0000000000..d56de22682 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/PropertyContainsPropertyContainedInOther.TM.json @@ -0,0 +1,47 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "aov:contains": [ "beta" ], + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + }, + "beta": { + "type": "string", + "aov:containedIn": "gamma", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/beta/{maintainerId}", + "op": "readproperty" + } + ] + }, + "gamma": { + "type": "string", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/gamma/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/PropertyContainsWithoutAovContext.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyContainsWithoutAovContext.TM.json new file mode 100644 index 0000000000..5e1cbd28d4 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/PropertyContainsWithoutAovContext.TM.json @@ -0,0 +1,35 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "aov:contains": [ "beta" ], + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + }, + "beta": { + "type": "string", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/beta/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/PropertyMemberOf.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyMemberOf.TM.json new file mode 100644 index 0000000000..8a29a34f30 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/PropertyMemberOf.TM.json @@ -0,0 +1,26 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "aov:memberOf": "MyPropertyGroup", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/PropertyNamespaceEmpty.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyNamespaceEmpty.TM.json new file mode 100644 index 0000000000..83419ad6f8 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/PropertyNamespaceEmpty.TM.json @@ -0,0 +1,26 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "aov:namespace": "", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/PropertyNamespaceWithoutAovContext.TM.json b/codegen2/test/thing-models/invalidAioBinding/PropertyNamespaceWithoutAovContext.TM.json new file mode 100644 index 0000000000..813e86e51b --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/PropertyNamespaceWithoutAovContext.TM.json @@ -0,0 +1,25 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "aov:namespace": "MyNamespace", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/TypeRefEmpty.TM.json b/codegen2/test/thing-models/invalidAioBinding/TypeRefEmpty.TM.json new file mode 100644 index 0000000000..40eb5a31b9 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/TypeRefEmpty.TM.json @@ -0,0 +1,25 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "aov:typeRef": "", + "actions": { + "noop": { + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/TypeRefWithoutAovContext.TM.json b/codegen2/test/thing-models/invalidAioBinding/TypeRefWithoutAovContext.TM.json new file mode 100644 index 0000000000..a2fc6e68a7 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/TypeRefWithoutAovContext.TM.json @@ -0,0 +1,24 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "aov:typeRef": "SomeOtherModel", + "actions": { + "noop": { + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/noop/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/valid/EventContainedInEventNoContains.TM.json b/codegen2/test/thing-models/valid/EventContainedInEventNoContains.TM.json new file mode 100644 index 0000000000..100bbdf0c3 --- /dev/null +++ b/codegen2/test/thing-models/valid/EventContainedInEventNoContains.TM.json @@ -0,0 +1,40 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + }, + "events": { + "alpha": { + "data": { + "type": "string" + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{senderId}", + "op": "subscribeevent" + } + ] + }, + "beta": { + "data": { + "type": "string" + }, + "aov:containedIn": "alpha", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/beta/{senderId}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/thing-models/valid/EventContainsEventNoContainedIn.TM.json b/codegen2/test/thing-models/valid/EventContainsEventNoContainedIn.TM.json new file mode 100644 index 0000000000..f96160c107 --- /dev/null +++ b/codegen2/test/thing-models/valid/EventContainsEventNoContainedIn.TM.json @@ -0,0 +1,40 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + }, + "events": { + "alpha": { + "data": { + "type": "string" + }, + "aov:contains": [ "beta" ], + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{senderId}", + "op": "subscribeevent" + } + ] + }, + "beta": { + "data": { + "type": "string" + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/beta/{senderId}", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/codegen2/test/thing-models/valid/LinkCapability.TM.json b/codegen2/test/thing-models/valid/LinkCapability.TM.json new file mode 100644 index 0000000000..8625bbc16e --- /dev/null +++ b/codegen2/test/thing-models/valid/LinkCapability.TM.json @@ -0,0 +1,31 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "links": [ + { + "rel": "aov:capability", + "href": "http://example.com/BasicOnOffTM", + "type": "application/tm+json" + } + ], + "actions": { + "noop": { + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/TestThing/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/valid/LinkComponent.TM.json b/codegen2/test/thing-models/valid/LinkComponent.TM.json new file mode 100644 index 0000000000..8355496c0a --- /dev/null +++ b/codegen2/test/thing-models/valid/LinkComponent.TM.json @@ -0,0 +1,31 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "links": [ + { + "rel": "aov:component", + "href": "http://example.com/BasicOnOffTM", + "type": "application/tm+json" + } + ], + "actions": { + "noop": { + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/TestThing/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/valid/LinkOtherAovRel.TM.json b/codegen2/test/thing-models/valid/LinkOtherAovRel.TM.json new file mode 100644 index 0000000000..b802afb59a --- /dev/null +++ b/codegen2/test/thing-models/valid/LinkOtherAovRel.TM.json @@ -0,0 +1,30 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "links": [ + { + "rel": "aov:something", + "href": "../../TestCase.cs", + "type": "application/text" + } + ], + "actions": { + "noop": { + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/TestThing/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/valid/LinkReference.TM.json b/codegen2/test/thing-models/valid/LinkReference.TM.json new file mode 100644 index 0000000000..bd4a7688c4 --- /dev/null +++ b/codegen2/test/thing-models/valid/LinkReference.TM.json @@ -0,0 +1,31 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "links": [ + { + "rel": "aov:reference", + "href": "http://example.com/BasicOnOffTM", + "type": "application/tm+json" + } + ], + "actions": { + "noop": { + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/TestThing/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/valid/LinkTypedReference.TM.json b/codegen2/test/thing-models/valid/LinkTypedReference.TM.json new file mode 100644 index 0000000000..e2d7e22bd8 --- /dev/null +++ b/codegen2/test/thing-models/valid/LinkTypedReference.TM.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "links": [ + { + "rel": "aov:typedReference", + "aov:refType": "MyReferenceType", + "href": "http://example.com/BasicOnOffTM", + "type": "application/tm+json" + } + ], + "actions": { + "noop": { + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/TestThing/command/noop", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/valid/PropertyContainedInPropertyNoContains.TM.json b/codegen2/test/thing-models/valid/PropertyContainedInPropertyNoContains.TM.json new file mode 100644 index 0000000000..144b1681d7 --- /dev/null +++ b/codegen2/test/thing-models/valid/PropertyContainedInPropertyNoContains.TM.json @@ -0,0 +1,36 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + }, + "beta": { + "type": "string", + "aov:containedIn": "alpha", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/beta/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/valid/PropertyContainsPropertyNoContainedIn.TM.json b/codegen2/test/thing-models/valid/PropertyContainsPropertyNoContainedIn.TM.json new file mode 100644 index 0000000000..02d0b00a17 --- /dev/null +++ b/codegen2/test/thing-models/valid/PropertyContainsPropertyNoContainedIn.TM.json @@ -0,0 +1,36 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "aov:contains": [ "beta" ], + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + }, + "beta": { + "type": "string", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/beta/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} From ac3466532d010df465057fe315c843ae36a6b5e5 Mon Sep 17 00:00:00 2001 From: "John (JD) Douceur" Date: Wed, 21 Jan 2026 10:25:20 -0800 Subject: [PATCH 44/52] add T4 template generated code to repo --- .../.gitignore | 1 - .../Actions/t4/DotNetCommandExecutor.cs | 356 ++++ .../dotnet/Actions/t4/DotNetCommandInvoker.cs | 342 ++++ .../Actions/t4/DotNetResponseExtension.cs | 401 +++++ .../dotnet/Constants/t4/DotNetConstants.cs | 338 ++++ .../dotnet/Error/t4/DotNetAggregateError.cs | 349 ++++ .../dotnet/Error/t4/DotNetError.cs | 406 +++++ .../Events/t4/DotNetTelemetryReceiver.cs | 337 ++++ .../dotnet/Events/t4/DotNetTelemetrySender.cs | 335 ++++ .../dotnet/Project/t4/DotNetProject.cs | 317 ++++ .../Properties/t4/DotNetPropertyConsumer.cs | 422 +++++ .../Properties/t4/DotNetPropertyMaintainer.cs | 425 +++++ .../dotnet/Service/t4/DotNetService.cs | 1440 +++++++++++++++++ .../rust/Actions/t4/RustCommandExecutor.cs | 510 ++++++ .../Actions/t4/RustCommandExecutorHeaders.cs | 353 ++++ .../rust/Actions/t4/RustCommandInvoker.cs | 613 +++++++ .../Actions/t4/RustCommandInvokerHeaders.cs | 356 ++++ .../rust/Constants/t4/RustConstants.cs | 325 ++++ .../rust/Error/t4/RustAggregateError.cs | 338 ++++ .../rust/Error/t4/RustError.cs | 332 ++++ .../rust/Events/t4/RustTelemetryReceiver.cs | 388 +++++ .../rust/Events/t4/RustTelemetrySender.cs | 421 +++++ .../rust/Project/t4/RustCargoToml.cs | 348 ++++ .../rust/Project/t4/RustIndex.cs | 338 ++++ .../rust/Project/t4/RustLib.cs | 310 ++++ .../Properties/t4/RustPropertyConsumer.cs | 834 ++++++++++ .../Properties/t4/RustPropertyMaintainer.cs | 645 ++++++++ .../Serialization/t4/RustSerialization.cs | 390 +++++ .../.gitignore | 1 - .../json/t4/AliasJsonSchema.cs | 316 ++++ .../json/t4/EnumJsonSchema.cs | 319 ++++ .../json/t4/ObjectJsonSchema.cs | 337 ++++ .../.gitignore | 1 - .../dotnet/t4/DotNetAlias.cs | 318 ++++ .../dotnet/t4/DotNetEnum.cs | 332 ++++ .../dotnet/t4/DotNetObject.cs | 381 +++++ .../rust/t4/RustAlias.cs | 318 ++++ .../rust/t4/RustEnum.cs | 322 ++++ .../rust/t4/RustObject.cs | 363 +++++ codegen2/src/Dtdl2Wot/.gitignore | 1 - .../src/Dtdl2Wot/Array/t4/ArrayThingSchema.cs | 313 ++++ .../Dtdl2Wot/Command/t4/CommandAffordance.cs | 444 +++++ .../src/Dtdl2Wot/Enum/t4/EnumThingSchema.cs | 321 ++++ .../Dtdl2Wot/Interface/t4/InterfaceThing.cs | 430 +++++ .../src/Dtdl2Wot/Map/t4/MapThingSchema.cs | 313 ++++ .../Dtdl2Wot/Map/t4/PlaceholderThingSchema.cs | 307 ++++ .../Dtdl2Wot/Object/t4/ObjectThingSchema.cs | 343 ++++ .../Property/t4/PropertyAffordance.cs | 351 ++++ .../Telemetry/t4/TelemetryAffordance.cs | 333 ++++ 49 files changed, 18130 insertions(+), 4 deletions(-) delete mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/.gitignore create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandExecutor.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandInvoker.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetResponseExtension.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Constants/t4/DotNetConstants.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Error/t4/DotNetAggregateError.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Error/t4/DotNetError.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetryReceiver.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetrySender.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Project/t4/DotNetProject.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyConsumer.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyMaintainer.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Service/t4/DotNetService.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutor.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutorHeaders.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvokerHeaders.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Constants/t4/RustConstants.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Error/t4/RustAggregateError.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Error/t4/RustError.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustCargoToml.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustIndex.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustLib.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyConsumer.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyMaintainer.cs create mode 100644 codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Serialization/t4/RustSerialization.cs delete mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/.gitignore create mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/AliasJsonSchema.cs create mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/EnumJsonSchema.cs create mode 100644 codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/ObjectJsonSchema.cs delete mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/.gitignore create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetAlias.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetEnum.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetObject.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustAlias.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustEnum.cs create mode 100644 codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustObject.cs delete mode 100644 codegen2/src/Dtdl2Wot/.gitignore create mode 100644 codegen2/src/Dtdl2Wot/Array/t4/ArrayThingSchema.cs create mode 100644 codegen2/src/Dtdl2Wot/Command/t4/CommandAffordance.cs create mode 100644 codegen2/src/Dtdl2Wot/Enum/t4/EnumThingSchema.cs create mode 100644 codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.cs create mode 100644 codegen2/src/Dtdl2Wot/Map/t4/MapThingSchema.cs create mode 100644 codegen2/src/Dtdl2Wot/Map/t4/PlaceholderThingSchema.cs create mode 100644 codegen2/src/Dtdl2Wot/Object/t4/ObjectThingSchema.cs create mode 100644 codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.cs create mode 100644 codegen2/src/Dtdl2Wot/Telemetry/t4/TelemetryAffordance.cs diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/.gitignore b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/.gitignore deleted file mode 100644 index db669da381..0000000000 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/.gitignore +++ /dev/null @@ -1 +0,0 @@ -**/t4/*.cs diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandExecutor.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandExecutor.cs new file mode 100644 index 0000000000..d2311b15ad --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandExecutor.cs @@ -0,0 +1,356 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class DotNetCommandExecutor : DotNetCommandExecutorBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("; DO NOT EDIT. */\r\n\r\n#nullable enable\r\n\r\nnamespace "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.projectName)); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.genNamespace.GetTypeName(TargetLanguage.CSharp))); + this.Write(@" +{ + using System; + using System.Collections.Generic; + using System.Linq; + using System.Xml; + using Azure.Iot.Operations.Protocol; + using Azure.Iot.Operations.Protocol.RPC; + using Azure.Iot.Operations.Protocol.Models; + using "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.projectName)); + this.Write(";\r\n\r\n public static partial class "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.serviceName.GetTypeName(TargetLanguage.CSharp))); + this.Write("\r\n {\r\n /// \r\n /// Specializes a CommandExecutor " + + "class for Command \'"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.AsGiven)); + this.Write("\'.\r\n /// \r\n"); + if (this.isIdempotent) { + this.Write(" [CommandBehavior(idempotent: true)]\r\n"); + } + if (this.serviceGroupId != null) { + this.Write(" [ServiceGroupId(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.serviceGroupId)); + this.Write("\")]\r\n"); + } + this.Write(" [CommandTopic(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.topicPattern)); + this.Write("\")]\r\n public class "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.CSharp))); + this.Write(" : CommandExecutor"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.TypeParams())); + this.Write("\r\n {\r\n /// \r\n /// Initializes a new instanc" + + "e of the class.\r\n /// \r\n public "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.CSharp))); + this.Write("(ApplicationContext applicationContext, IMqttPubSubClient mqttClient)\r\n " + + " : base(applicationContext, mqttClient, \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.AsGiven)); + this.Write("\", new "); + this.Write(this.ToStringHelper.ToStringWithCulture(string.Format(this.serializerClassName, this.TypeParams()))); + this.Write("())\r\n {\r\n if (mqttClient.ClientId != null)\r\n " + + " {\r\n TopicTokenMap[\""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.ActionExecutorId)); + this.Write("\"] = mqttClient.ClientId;\r\n }\r\n }\r\n }\r\n }\r\n}\r" + + "\n"); + return this.GenerationEnvironment.ToString(); + } + + private string TypeParams() => $"<{this.reqSchema?.GetTypeName(TargetLanguage.CSharp) ?? serializerEmptyType.GetTypeName(TargetLanguage.CSharp)}, {this.respSchema?.GetTypeName(TargetLanguage.CSharp) ?? serializerEmptyType.GetTypeName(TargetLanguage.CSharp)}>"; + + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class DotNetCommandExecutorBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandInvoker.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandInvoker.cs new file mode 100644 index 0000000000..2b32f4c2cf --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetCommandInvoker.cs @@ -0,0 +1,342 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class DotNetCommandInvoker : DotNetCommandInvokerBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("; DO NOT EDIT. */\r\n\r\n#nullable enable\r\n\r\nnamespace "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.projectName)); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.genNamespace.GetTypeName(TargetLanguage.CSharp))); + this.Write("\r\n{\r\n using System;\r\n using System.Collections.Generic;\r\n using Azure.Io" + + "t.Operations.Protocol;\r\n using Azure.Iot.Operations.Protocol.RPC;\r\n using " + + "Azure.Iot.Operations.Protocol.Models;\r\n using "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.projectName)); + this.Write(";\r\n\r\n public static partial class "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.serviceName.GetTypeName(TargetLanguage.CSharp))); + this.Write("\r\n {\r\n /// \r\n /// Specializes the CommandInvoker" + + " class for Command \'"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.AsGiven)); + this.Write("\'.\r\n /// \r\n [CommandTopic(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.topicPattern)); + this.Write("\")]\r\n public class "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.CSharp))); + this.Write(" : CommandInvoker"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.TypeParams())); + this.Write("\r\n {\r\n /// \r\n /// Initializes a new instanc" + + "e of the class.\r\n /// \r\n public "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.CSharp))); + this.Write("(ApplicationContext applicationContext, IMqttPubSubClient mqttClient)\r\n " + + " : base(applicationContext, mqttClient, \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.AsGiven)); + this.Write("\", new "); + this.Write(this.ToStringHelper.ToStringWithCulture(string.Format(this.serializerClassName, this.TypeParams()))); + this.Write("())\r\n {\r\n this.ResponseTopicPrefix = \"clients/{invokerC" + + "lientId}\"; // default value, can be overwritten by user code\r\n\r\n " + + "if (mqttClient.ClientId != null)\r\n {\r\n TopicTo" + + "kenMap[\""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.ActionInvokerId)); + this.Write("\"] = mqttClient.ClientId;\r\n }\r\n }\r\n }\r\n }\r\n}\r" + + "\n"); + return this.GenerationEnvironment.ToString(); + } + + private string TypeParams() => $"<{this.reqSchema?.GetTypeName(TargetLanguage.CSharp) ?? serializerEmptyType.GetTypeName(TargetLanguage.CSharp)}, {this.respSchema?.GetTypeName(TargetLanguage.CSharp) ?? serializerEmptyType.GetTypeName(TargetLanguage.CSharp)}>"; + + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class DotNetCommandInvokerBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetResponseExtension.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetResponseExtension.cs new file mode 100644 index 0000000000..463cd77638 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Actions/t4/DotNetResponseExtension.cs @@ -0,0 +1,401 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Collections.Generic; + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class DotNetResponseExtension : DotNetResponseExtensionBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("; DO NOT EDIT. */\r\n"); + +string codeName = this.headerCodeName.GetVariableName(TargetLanguage.CSharp); +string codeSchema = this.headerCodeSchema.GetTypeName(TargetLanguage.CSharp); +string infoName = this.headerInfoName?.GetVariableName(TargetLanguage.CSharp) ?? "errorPayload"; +string infoSchema = this.headerInfoSchema?.GetTypeName(TargetLanguage.CSharp) ?? "string"; + + this.Write("\r\n#nullable enable\r\n\r\nnamespace "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.projectName)); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.genNamespace.GetTypeName(TargetLanguage.CSharp))); + this.Write("\r\n{\r\n using System;\r\n using System.Diagnostics.CodeAnalysis;\r\n using Sys" + + "tem.Text;\r\n using System.Text.Json;\r\n using Azure.Iot.Operations.Protocol." + + "RPC;\r\n\r\n public static class "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.respSchema.GetTypeName(TargetLanguage.CSharp, "extensions"))); + this.Write("\r\n {\r\n"); + if (this.generateServer) { + this.Write(" public static ExtendedResponse<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.respSchema.GetTypeName(TargetLanguage.CSharp))); + this.Write("> WithApplicationError(this ExtendedResponse<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.respSchema.GetTypeName(TargetLanguage.CSharp))); + this.Write("> extResp, "); + this.Write(this.ToStringHelper.ToStringWithCulture(codeSchema)); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(codeName)); + this.Write(", "); + this.Write(this.ToStringHelper.ToStringWithCulture(infoSchema)); + this.Write("? "); + this.Write(this.ToStringHelper.ToStringWithCulture(infoName)); + this.Write(" = null)\r\n {\r\n string errorCode = "); + this.Write(this.ToStringHelper.ToStringWithCulture(codeName)); + this.Write(" switch\r\n {\r\n"); + foreach (string codeValue in this.headerCodeValues) { + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(codeSchema)); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(codeValue)); + this.Write(" => \""); + this.Write(this.ToStringHelper.ToStringWithCulture(codeValue)); + this.Write("\",\r\n"); + } + this.Write(" _ => throw new InvalidOperationException($\"Unable to map "); + this.Write(this.ToStringHelper.ToStringWithCulture(codeSchema)); + this.Write(".{"); + this.Write(this.ToStringHelper.ToStringWithCulture(codeName)); + this.Write("} to a valid string value\"),\r\n };\r\n\r\n return extResp.WithAp" + + "plicationError(errorCode, "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.headerInfoSchema != null ? $"{infoName} != null ? Encoding.UTF8.GetString(JsonSerializer.SerializeToUtf8Bytes({infoName})) : null" : infoName)); + this.Write(");\r\n }\r\n"); + } + if (this.generateClient && this.generateServer) { + this.Write("\r\n"); + } + if (this.generateClient) { + this.Write(" public static bool TryGetApplicationError(this ExtendedResponse<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.respSchema.GetTypeName(TargetLanguage.CSharp))); + this.Write("> extResp, [NotNullWhen(true)] out "); + this.Write(this.ToStringHelper.ToStringWithCulture(codeSchema)); + this.Write("? "); + this.Write(this.ToStringHelper.ToStringWithCulture(codeName)); + this.Write(", out "); + this.Write(this.ToStringHelper.ToStringWithCulture(infoSchema)); + this.Write("? "); + this.Write(this.ToStringHelper.ToStringWithCulture(infoName)); + this.Write(")\r\n {\r\n if (!extResp.TryGetApplicationError(out string? errorCo" + + "de, out "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.headerInfoSchema != null ? "string? " : "")); + this.Write("errorPayload))\r\n {\r\n "); + this.Write(this.ToStringHelper.ToStringWithCulture(codeName)); + this.Write(" = null;\r\n "); + this.Write(this.ToStringHelper.ToStringWithCulture(infoName)); + this.Write(" = null;\r\n return false;\r\n }\r\n\r\n "); + this.Write(this.ToStringHelper.ToStringWithCulture(codeName)); + this.Write(" = errorCode switch\r\n {\r\n"); + foreach (string codeValue in this.headerCodeValues) { + this.Write(" \""); + this.Write(this.ToStringHelper.ToStringWithCulture(codeValue)); + this.Write("\" => "); + this.Write(this.ToStringHelper.ToStringWithCulture(codeSchema)); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(codeValue)); + this.Write(",\r\n"); + } + this.Write(" _ => throw new InvalidOperationException($\"Unable to map string \\" + + "\"{errorCode}\\\" to "); + this.Write(this.ToStringHelper.ToStringWithCulture(codeSchema)); + this.Write(" enumeration value\")\r\n };\r\n\r\n"); + if (this.headerInfoSchema != null) { + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(infoName)); + this.Write(" = errorPayload != null ? JsonSerializer.Deserialize<"); + this.Write(this.ToStringHelper.ToStringWithCulture(infoSchema)); + this.Write(">(Encoding.UTF8.GetBytes(errorPayload)) : null;\r\n\r\n"); + } + this.Write(" return true;\r\n }\r\n"); + } + this.Write(" }\r\n}\r\n"); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class DotNetResponseExtensionBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Constants/t4/DotNetConstants.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Constants/t4/DotNetConstants.cs new file mode 100644 index 0000000000..ae2c4a4576 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Constants/t4/DotNetConstants.cs @@ -0,0 +1,338 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Collections.Generic; + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class DotNetConstants : DotNetConstantsBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("; DO NOT EDIT. */\r\n\r\n#nullable enable\r\n\r\nnamespace "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.projectName)); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.genNamespace.GetTypeName(TargetLanguage.CSharp))); + this.Write("\r\n{\r\n"); + if (this.constantSpec.Description != null) { + this.Write(" /// \r\n /// "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.constantSpec.Description)); + this.Write("\r\n /// \r\n"); + } + this.Write(" [System.CodeDom.Compiler.GeneratedCode(\"Azure.Iot.Operations.ProtocolCompiler" + + "Lib\", \""); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("\")]\r\n public static class "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetTypeName(TargetLanguage.CSharp))); + this.Write("\r\n {\r\n"); + int ix = 1; foreach (KeyValuePair constant in this.constantSpec.Constants) { + if (constant.Value.Description != null) { + this.Write(" /// "); + this.Write(this.ToStringHelper.ToStringWithCulture(constant.Value.Description)); + this.Write("\r\n"); + } + this.Write(" public const "); + this.Write(this.ToStringHelper.ToStringWithCulture(GetDotNetType(constant.Value.Type))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(constant.Key.GetConstantName(TargetLanguage.CSharp))); + this.Write(" = "); + this.Write(this.ToStringHelper.ToStringWithCulture(GetDotNetValue(constant.Value.Value))); + this.Write(";\r\n"); + if (this.anyDescriptions && ix < this.constantSpec.Constants.Count) { + this.Write("\r\n"); + } + ix++; } + this.Write(" }\r\n}\r\n"); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class DotNetConstantsBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Error/t4/DotNetAggregateError.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Error/t4/DotNetAggregateError.cs new file mode 100644 index 0000000000..2cbfe0c550 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Error/t4/DotNetAggregateError.cs @@ -0,0 +1,349 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class DotNetAggregateError : DotNetAggregateErrorBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("; DO NOT EDIT. */\r\n\r\n#nullable enable\r\n\r\nnamespace "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.projectName)); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaNamespace.GetTypeName(TargetLanguage.CSharp))); + this.Write("\r\n{\r\n using System;\r\n using System.Collections.Generic;\r\n using "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.projectName)); + this.Write(";\r\n\r\n [System.CodeDom.Compiler.GeneratedCode(\"Azure.Iot.Operations.ProtocolCom" + + "pilerLib\", \""); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("\")]\r\n public partial class "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetTypeName(TargetLanguage.CSharp, "exception"))); + this.Write(" : AggregateException\r\n {\r\n public "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetTypeName(TargetLanguage.CSharp, "exception"))); + this.Write("("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetTypeName(TargetLanguage.CSharp))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetVariableName(TargetLanguage.CSharp))); + this.Write(")\r\n : base(GetInnerExceptions("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetVariableName(TargetLanguage.CSharp))); + this.Write("))\r\n {\r\n "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetFieldName(TargetLanguage.CSharp))); + this.Write(" = "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetVariableName(TargetLanguage.CSharp))); + this.Write(";\r\n }\r\n\r\n public "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetTypeName(TargetLanguage.CSharp))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetFieldName(TargetLanguage.CSharp))); + this.Write(" { get; }\r\n\r\n private static IEnumerable GetInnerExceptions("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetTypeName(TargetLanguage.CSharp))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetVariableName(TargetLanguage.CSharp))); + this.Write(")\r\n {\r\n List innerExceptions = new();\r\n"); + foreach (var innerNameSchema in this.innerNameSchemas) { + this.Write("\r\n if ("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetVariableName(TargetLanguage.CSharp))); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(innerNameSchema.Item1.GetFieldName(TargetLanguage.CSharp))); + this.Write(" != null)\r\n {\r\n innerExceptions.Add(new "); + this.Write(this.ToStringHelper.ToStringWithCulture(innerNameSchema.Item2.GetTypeName(TargetLanguage.CSharp, "exception"))); + this.Write("("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetVariableName(TargetLanguage.CSharp))); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(innerNameSchema.Item1.GetFieldName(TargetLanguage.CSharp))); + this.Write("));\r\n }\r\n"); + } + this.Write("\r\n return innerExceptions;\r\n }\r\n }\r\n}\r\n"); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class DotNetAggregateErrorBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Error/t4/DotNetError.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Error/t4/DotNetError.cs new file mode 100644 index 0000000000..43fdf8d8b3 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Error/t4/DotNetError.cs @@ -0,0 +1,406 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class DotNetError : DotNetErrorBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("; DO NOT EDIT. */\r\n"); + +string codeName = this.errorCodeName?.GetVariableName(TargetLanguage.CSharp); +string codeSchema = this.errorCodeSchema?.GetTypeName(TargetLanguage.CSharp); +string infoName = this.errorInfoName?.GetVariableName(TargetLanguage.CSharp) ?? "errorPayload"; +string infoSchema = this.errorInfoSchema?.GetTypeName(TargetLanguage.CSharp) ?? "string"; + + this.Write("\r\n#nullable enable\r\n\r\nnamespace "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.projectName)); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.genNamespace.GetTypeName(TargetLanguage.CSharp))); + this.Write("\r\n{\r\n using System;\r\n"); + if (codeName != null) { + this.Write(" using System.Diagnostics.CodeAnalysis;\r\n"); + } + this.Write(" using "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.projectName)); + this.Write(";\r\n\r\n [System.CodeDom.Compiler.GeneratedCode(\"Azure.Iot.Operations.ProtocolCom" + + "pilerLib\", \""); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("\")]\r\n public partial class "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetTypeName(TargetLanguage.CSharp, "exception"))); + this.Write(" : Exception\r\n {\r\n"); + if (codeName != null) { + this.Write(" private "); + this.Write(this.ToStringHelper.ToStringWithCulture(codeSchema)); + this.Write("? "); + this.Write(this.ToStringHelper.ToStringWithCulture(codeName)); + this.Write(" = default;\r\n private "); + this.Write(this.ToStringHelper.ToStringWithCulture(infoSchema)); + this.Write("? "); + this.Write(this.ToStringHelper.ToStringWithCulture(infoName)); + this.Write(" = default;\r\n\r\n"); + } + this.Write(" public "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetTypeName(TargetLanguage.CSharp, "exception"))); + this.Write("("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetTypeName(TargetLanguage.CSharp))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetVariableName(TargetLanguage.CSharp))); + this.Write(")\r\n"); + if (this.messageField != null) { + this.Write(" : base("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetVariableName(TargetLanguage.CSharp))); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.messageField.GetFieldName(TargetLanguage.CSharp))); + this.Write(this.ToStringHelper.ToStringWithCulture(this.messageIsRequired ? "" : $" ?? \"{this.description}\"")); + this.Write(")\r\n"); + } else { + this.Write(" : base(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.description)); + this.Write("\")\r\n"); + } + this.Write(" {\r\n "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetFieldName(TargetLanguage.CSharp))); + this.Write(" = "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetVariableName(TargetLanguage.CSharp))); + this.Write(";\r\n }\r\n\r\n public "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetTypeName(TargetLanguage.CSharp))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetFieldName(TargetLanguage.CSharp))); + this.Write(" { get; }\r\n"); + if (codeName != null) { + this.Write("\r\n public "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetTypeName(TargetLanguage.CSharp, "exception"))); + this.Write(" WithApplicationError("); + this.Write(this.ToStringHelper.ToStringWithCulture(codeSchema)); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(codeName)); + this.Write(", "); + this.Write(this.ToStringHelper.ToStringWithCulture(infoSchema)); + this.Write("? "); + this.Write(this.ToStringHelper.ToStringWithCulture(infoName)); + this.Write(" = null)\r\n {\r\n this."); + this.Write(this.ToStringHelper.ToStringWithCulture(codeName)); + this.Write(" = "); + this.Write(this.ToStringHelper.ToStringWithCulture(codeName)); + this.Write(";\r\n this."); + this.Write(this.ToStringHelper.ToStringWithCulture(infoName)); + this.Write(" = "); + this.Write(this.ToStringHelper.ToStringWithCulture(infoName)); + this.Write(";\r\n\r\n return this;\r\n }\r\n\r\n public bool TryGetApplication" + + "Error([NotNullWhen(true)] out "); + this.Write(this.ToStringHelper.ToStringWithCulture(codeSchema)); + this.Write("? "); + this.Write(this.ToStringHelper.ToStringWithCulture(codeName)); + this.Write(", out "); + this.Write(this.ToStringHelper.ToStringWithCulture(infoSchema)); + this.Write("? "); + this.Write(this.ToStringHelper.ToStringWithCulture(infoName)); + this.Write(")\r\n {\r\n "); + this.Write(this.ToStringHelper.ToStringWithCulture(codeName)); + this.Write(" = this."); + this.Write(this.ToStringHelper.ToStringWithCulture(codeName)); + this.Write(";\r\n "); + this.Write(this.ToStringHelper.ToStringWithCulture(infoName)); + this.Write(" = this."); + this.Write(this.ToStringHelper.ToStringWithCulture(infoName)); + this.Write(";\r\n\r\n return "); + this.Write(this.ToStringHelper.ToStringWithCulture(codeName)); + this.Write(" != null;\r\n }\r\n"); + } + this.Write(" }\r\n}\r\n"); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class DotNetErrorBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetryReceiver.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetryReceiver.cs new file mode 100644 index 0000000000..48bc901f4e --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetryReceiver.cs @@ -0,0 +1,337 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class DotNetTelemetryReceiver : DotNetTelemetryReceiverBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("; DO NOT EDIT. */\r\n\r\n#nullable enable\r\n\r\nnamespace "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.projectName)); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.genNamespace.GetTypeName(TargetLanguage.CSharp))); + this.Write("\r\n{\r\n using System;\r\n using System.Collections.Generic;\r\n using Azure.Io" + + "t.Operations.Protocol;\r\n using Azure.Iot.Operations.Protocol.Telemetry;\r\n " + + "using Azure.Iot.Operations.Protocol.Models;\r\n using "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.projectName)); + this.Write(";\r\n\r\n public static partial class "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.serviceName.GetTypeName(TargetLanguage.CSharp))); + this.Write("\r\n {\r\n /// \r\n /// Specializes the TelemetryReceiver<" + + "/c> class for type "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaType.GetTypeName(TargetLanguage.CSharp))); + this.Write(".\r\n /// \r\n"); + if (this.serviceGroupId != null) { + this.Write(" [ServiceGroupId(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.serviceGroupId)); + this.Write("\")]\r\n"); + } + this.Write(" [TelemetryTopic(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.topicPattern)); + this.Write("\")]\r\n public class "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.CSharp))); + this.Write(" : TelemetryReceiver<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaType.GetTypeName(TargetLanguage.CSharp))); + this.Write(">\r\n {\r\n /// \r\n /// Initializes a new instan" + + "ce of the class.\r\n /// \r\n public "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.CSharp))); + this.Write("(ApplicationContext applicationContext, IMqttPubSubClient mqttClient)\r\n " + + " : base(applicationContext, mqttClient, new "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.serializerClassName)); + this.Write("())\r\n {\r\n }\r\n }\r\n }\r\n}\r\n"); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class DotNetTelemetryReceiverBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetrySender.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetrySender.cs new file mode 100644 index 0000000000..ad415f7ea4 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Events/t4/DotNetTelemetrySender.cs @@ -0,0 +1,335 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class DotNetTelemetrySender : DotNetTelemetrySenderBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("; DO NOT EDIT. */\r\n\r\n#nullable enable\r\n\r\nnamespace "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.projectName)); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.genNamespace.GetTypeName(TargetLanguage.CSharp))); + this.Write("\r\n{\r\n using System.Collections.Generic;\r\n using Azure.Iot.Operations.Protoc" + + "ol;\r\n using Azure.Iot.Operations.Protocol.Telemetry;\r\n using Azure.Iot.Ope" + + "rations.Protocol.Models;\r\n using "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.projectName)); + this.Write(";\r\n\r\n public static partial class "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.serviceName.GetTypeName(TargetLanguage.CSharp))); + this.Write("\r\n {\r\n /// \r\n /// Specializes the TelemetrySender class for type "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaType.GetTypeName(TargetLanguage.CSharp))); + this.Write(".\r\n /// \r\n [TelemetryTopic(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.topicPattern)); + this.Write("\")]\r\n public class "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.CSharp))); + this.Write(" : TelemetrySender<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaType.GetTypeName(TargetLanguage.CSharp))); + this.Write(">\r\n {\r\n /// \r\n /// Initializes a new instan" + + "ce of the class.\r\n /// \r\n public "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.CSharp))); + this.Write("(ApplicationContext applicationContext, IMqttPubSubClient mqttClient)\r\n " + + " : base(applicationContext, mqttClient, new "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.serializerClassName)); + this.Write("())\r\n {\r\n if (mqttClient.ClientId != null)\r\n " + + " {\r\n TopicTokenMap[\""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.EventSenderId)); + this.Write("\"] = mqttClient.ClientId;\r\n }\r\n }\r\n }\r\n }\r\n}\r" + + "\n"); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class DotNetTelemetrySenderBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Project/t4/DotNetProject.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Project/t4/DotNetProject.cs new file mode 100644 index 0000000000..88abaf42ae --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Project/t4/DotNetProject.cs @@ -0,0 +1,317 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class DotNetProject : DotNetProjectBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("\r\n\r\n \r\n "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.targetFramework)); + this.Write("\r\n latest-recommended\r\n enable\r\n SA0001,SA1101,SA1633\r\n \r\n\r\n \r\n"); + if (this.sdkProjPath != null) { + this.Write(" \r\n"); + } else { + this.Write(" \r\n"); + } + this.Write(" \r\n\r\n\r\n"); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class DotNetProjectBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyConsumer.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyConsumer.cs new file mode 100644 index 0000000000..41f6f333e3 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyConsumer.cs @@ -0,0 +1,422 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class DotNetPropertyConsumer : DotNetPropertyConsumerBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("; DO NOT EDIT. */\r\n\r\n#nullable enable\r\n\r\nnamespace "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.projectName)); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.genNamespace.GetTypeName(TargetLanguage.CSharp))); + this.Write(@" +{ + using System; + using System.Collections.Generic; + using System.Linq; + using System.Xml; + using Azure.Iot.Operations.Protocol; + using Azure.Iot.Operations.Protocol.RPC; + using Azure.Iot.Operations.Protocol.Models; + using "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.projectName)); + this.Write(";\r\n\r\n public static partial class "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.serviceName.GetTypeName(TargetLanguage.CSharp))); + this.Write("\r\n {\r\n /// \r\n"); + if (!this.propertyName.IsEmpty) { + this.Write(" /// Specializes CommandInvoker classes for reading"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeReqSchema != null ? " and writing" : "")); + this.Write(" Property \'"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.AsGiven)); + this.Write("\'.\r\n"); + } else { + this.Write(" /// Specializes CommandInvoker classes for reading"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeReqSchema != null ? " and writing" : "")); + this.Write(" a Property collection.\r\n"); + } + this.Write(" /// \r\n public static class "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.CSharp))); + this.Write("\r\n {\r\n"); + if (this.readRespSchema != null) { + this.Write(" /// \r\n"); + if (!this.propertyName.IsEmpty) { + this.Write(" /// Specializes a CommandInvoker class for requesting to read " + + "Property \'"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.AsGiven)); + this.Write("\'.\r\n"); + } else { + this.Write(" /// Specializes a CommandInvoker class for requesting to read " + + "a Property collection.\r\n"); + } + this.Write(" /// \r\n [PropertyTopic(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readTopicPattern)); + this.Write("\")]\r\n public class "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readerName.GetTypeName(TargetLanguage.CSharp))); + this.Write(" : CommandInvoker"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.ReadTypeParams())); + this.Write("\r\n {\r\n /// \r\n /// Initializes a" + + " new instance of the class.\r\n /// \r\n public "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readerName.GetTypeName(TargetLanguage.CSharp))); + this.Write("(ApplicationContext applicationContext, IMqttPubSubClient mqttClient)\r\n " + + " : base(applicationContext, mqttClient, \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readCommandName)); + this.Write("\", new "); + this.Write(this.ToStringHelper.ToStringWithCulture(string.Format(this.readSerializerClassName, this.ReadTypeParams()))); + this.Write("())\r\n {\r\n RequestTopicPattern = AttributeRetrie" + + "ver.GetAttribute(this)?.Topic ?? string.Empty;\r\n\r\n " + + " TopicTokenMap[\""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.PropertyAction)); + this.Write("\"] = \""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.PropertyActionValues.Read)); + this.Write("\";\r\n if (mqttClient.ClientId != null)\r\n {\r\n" + + " TopicTokenMap[\""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.PropertyConsumerId)); + this.Write("\"] = mqttClient.ClientId;\r\n }\r\n }\r\n " + + "}\r\n"); + } + if (this.readRespSchema != null && this.writeReqSchema != null) { + this.Write("\r\n"); + } + if (this.writeReqSchema != null) { + this.Write(" /// \r\n"); + if (!this.propertyName.IsEmpty) { + this.Write(" /// Specializes a CommandInvoker class for requesting to write" + + " Property \'"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.AsGiven)); + this.Write("\'.\r\n"); + } else { + this.Write(" /// Specializes a CommandInvoker class for requesting to write" + + " a Property collection.\r\n"); + } + this.Write(" /// \r\n [PropertyTopic(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeTopicPattern)); + this.Write("\")]\r\n public class "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writerName.GetTypeName(TargetLanguage.CSharp))); + this.Write(" : CommandInvoker"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.WriteTypeParams())); + this.Write("\r\n {\r\n /// \r\n /// Initializes a" + + " new instance of the class.\r\n /// \r\n public "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writerName.GetTypeName(TargetLanguage.CSharp))); + this.Write("(ApplicationContext applicationContext, IMqttPubSubClient mqttClient)\r\n " + + " : base(applicationContext, mqttClient, \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeCommandName)); + this.Write("\", new "); + this.Write(this.ToStringHelper.ToStringWithCulture(string.Format(this.writeSerializerClassName, this.WriteTypeParams()))); + this.Write("())\r\n {\r\n RequestTopicPattern = AttributeRetrie" + + "ver.GetAttribute(this)?.Topic ?? string.Empty;\r\n\r\n " + + " TopicTokenMap[\""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.PropertyAction)); + this.Write("\"] = \""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.PropertyActionValues.Write)); + this.Write("\";\r\n if (mqttClient.ClientId != null)\r\n {\r\n" + + " TopicTokenMap[\""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.PropertyConsumerId)); + this.Write("\"] = mqttClient.ClientId;\r\n }\r\n }\r\n " + + "}\r\n"); + } + this.Write(" }\r\n }\r\n}\r\n"); + return this.GenerationEnvironment.ToString(); + } + + private string ReadTypeParams() => $"<{readSerializerEmptyType.GetTypeName(TargetLanguage.CSharp)}, {this.readRespSchema.GetTypeName(TargetLanguage.CSharp)}>"; + + private string WriteTypeParams() => $"<{this.writeReqSchema!.GetTypeName(TargetLanguage.CSharp)}, {this.writeRespSchema?.GetTypeName(TargetLanguage.CSharp) ?? writeSerializerEmptyType.GetTypeName(TargetLanguage.CSharp)}>"; + + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class DotNetPropertyConsumerBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyMaintainer.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyMaintainer.cs new file mode 100644 index 0000000000..83cf88de98 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Properties/t4/DotNetPropertyMaintainer.cs @@ -0,0 +1,425 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class DotNetPropertyMaintainer : DotNetPropertyMaintainerBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("; DO NOT EDIT. */\r\n\r\n#nullable enable\r\n\r\nnamespace "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.projectName)); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.genNamespace.GetTypeName(TargetLanguage.CSharp))); + this.Write(@" +{ + using System; + using System.Collections.Generic; + using System.Linq; + using System.Xml; + using Azure.Iot.Operations.Protocol; + using Azure.Iot.Operations.Protocol.RPC; + using Azure.Iot.Operations.Protocol.Models; + using "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.projectName)); + this.Write(";\r\n\r\n public static partial class "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.serviceName.GetTypeName(TargetLanguage.CSharp))); + this.Write("\r\n {\r\n /// \r\n"); + if (!this.propertyName.IsEmpty) { + this.Write(" /// Specializes CommandExecutor classes for reading"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeReqSchema != null ? " and writing" : "")); + this.Write(" Property \'"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.AsGiven)); + this.Write("\'.\r\n"); + } else { + this.Write(" /// Specializes CommandExecutor classes for reading"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeReqSchema != null ? " and writing" : "")); + this.Write(" a Property collection.\r\n"); + } + this.Write(" /// \r\n public static class "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.CSharp))); + this.Write("\r\n {\r\n"); + if (this.readRespSchema != null) { + this.Write(" /// \r\n"); + if (!this.propertyName.IsEmpty) { + this.Write(" /// Specializes a CommandExecutor class for responding to read" + + " requests for Property \'"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.AsGiven)); + this.Write("\'.\r\n"); + } else { + this.Write(" /// Specializes a CommandExecutor class for responding to read" + + " requests for Property collection.\r\n"); + } + this.Write(" /// \r\n [CommandBehavior(idempotent: true)]\r\n " + + " [PropertyTopic(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readTopicPattern)); + this.Write("\")]\r\n public class "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readerName.GetTypeName(TargetLanguage.CSharp))); + this.Write(" : CommandExecutor"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.ReadTypeParams())); + this.Write("\r\n {\r\n /// \r\n /// Initializes a" + + " new instance of the class.\r\n /// \r\n public "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readerName.GetTypeName(TargetLanguage.CSharp))); + this.Write("(ApplicationContext applicationContext, IMqttPubSubClient mqttClient)\r\n " + + " : base(applicationContext, mqttClient, \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readCommandName)); + this.Write("\", new "); + this.Write(this.ToStringHelper.ToStringWithCulture(string.Format(this.readSerializerClassName, this.ReadTypeParams()))); + this.Write("())\r\n {\r\n ServiceGroupId = string.Empty;\r\n " + + " RequestTopicPattern = AttributeRetriever.GetAttribute(this)?.Topic ?? string.Empty;\r\n\r\n TopicTokenMap[" + + "\""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.PropertyAction)); + this.Write("\"] = \""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.PropertyActionValues.Read)); + this.Write("\";\r\n if (mqttClient.ClientId != null)\r\n {\r\n" + + " TopicTokenMap[\""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.PropertyMaintainerId)); + this.Write("\"] = mqttClient.ClientId;\r\n }\r\n }\r\n " + + "}\r\n"); + } + if (this.readRespSchema != null && this.writeReqSchema != null) { + this.Write("\r\n"); + } + if (this.writeReqSchema != null) { + this.Write(" /// \r\n"); + if (!this.propertyName.IsEmpty) { + this.Write(" /// Specializes a CommandExecutor class for responding to writ" + + "e requests for Property \'"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.AsGiven)); + this.Write("\'.\r\n"); + } else { + this.Write(" /// Specializes a CommandExecutor class for responding to writ" + + "e requests for Property collection.\r\n"); + } + this.Write(" /// \r\n [CommandBehavior(idempotent: false)]\r\n " + + " [PropertyTopic(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeTopicPattern)); + this.Write("\")]\r\n public class "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writerName.GetTypeName(TargetLanguage.CSharp))); + this.Write(" : CommandExecutor"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.WriteTypeParams())); + this.Write("\r\n {\r\n /// \r\n /// Initializes a" + + " new instance of the class.\r\n /// \r\n public "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writerName.GetTypeName(TargetLanguage.CSharp))); + this.Write("(ApplicationContext applicationContext, IMqttPubSubClient mqttClient)\r\n " + + " : base(applicationContext, mqttClient, \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeCommandName)); + this.Write("\", new "); + this.Write(this.ToStringHelper.ToStringWithCulture(string.Format(this.writeSerializerClassName, this.WriteTypeParams()))); + this.Write("())\r\n {\r\n RequestTopicPattern = AttributeRetrie" + + "ver.GetAttribute(this)?.Topic ?? string.Empty;\r\n\r\n " + + " TopicTokenMap[\""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.PropertyAction)); + this.Write("\"] = \""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.PropertyActionValues.Write)); + this.Write("\";\r\n if (mqttClient.ClientId != null)\r\n {\r\n" + + " TopicTokenMap[\""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.PropertyMaintainerId)); + this.Write("\"] = mqttClient.ClientId;\r\n }\r\n }\r\n " + + "}\r\n"); + } + this.Write(" }\r\n }\r\n}\r\n"); + return this.GenerationEnvironment.ToString(); + } + + private string ReadTypeParams() => $"<{readSerializerEmptyType.GetTypeName(TargetLanguage.CSharp)}, {this.readRespSchema.GetTypeName(TargetLanguage.CSharp)}>"; + + private string WriteTypeParams() => $"<{this.writeReqSchema!.GetTypeName(TargetLanguage.CSharp)}, {this.writeRespSchema?.GetTypeName(TargetLanguage.CSharp) ?? writeSerializerEmptyType.GetTypeName(TargetLanguage.CSharp)}>"; + + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class DotNetPropertyMaintainerBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Service/t4/DotNetService.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Service/t4/DotNetService.cs new file mode 100644 index 0000000000..05c6df9cb5 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/dotnet/Service/t4/DotNetService.cs @@ -0,0 +1,1440 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Linq; + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class DotNetService : DotNetServiceBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("; DO NOT EDIT. */\r\n\r\n#nullable enable\r\n\r\nnamespace "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.projectName)); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.genNamespace.GetTypeName(TargetLanguage.CSharp))); + this.Write("\r\n{\r\n using System;\r\n using System.Collections.Generic;\r\n using System.L" + + "inq;\r\n"); + if (this.actionSpecs.Any() || this.propSpecs.Any() || this.eventSpec.Any()) { + this.Write(" using System.Threading;\r\n"); + } + this.Write(" using System.Threading.Tasks;\r\n using Azure.Iot.Operations.Protocol.Models" + + ";\r\n using Azure.Iot.Operations.Protocol;\r\n using Azure.Iot.Operations.Prot" + + "ocol.RPC;\r\n using Azure.Iot.Operations.Protocol.Telemetry;\r\n using "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.projectName)); + this.Write(";\r\n\r\n [System.CodeDom.Compiler.GeneratedCode(\"Azure.Iot.Operations.ProtocolCom" + + "pilerLib\", \""); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("\")]\r\n public static partial class "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.serviceName.GetTypeName(TargetLanguage.CSharp))); + this.Write("\r\n {\r\n"); + if (this.generateServer) { + this.Write(" public abstract partial class Service : IAsyncDisposable\r\n {\r\n " + + " private ApplicationContext applicationContext;\r\n private IMqt" + + "tPubSubClient mqttClient;\r\n"); + foreach (var actionSpec in this.actionSpecs) { + this.Write(" private readonly "); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Executor.GetTypeName(TargetLanguage.CSharp))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Executor.GetVariableName(TargetLanguage.CSharp))); + this.Write(";\r\n"); + } + foreach (var propSpec in this.propSpecs) { + this.Write(" private readonly "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Maintainer.GetTypeName(TargetLanguage.CSharp))); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readResponderName.GetTypeName(TargetLanguage.CSharp))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "responder"))); + this.Write(";\r\n"); + if (propSpec.WriteReqSchema != null) { + this.Write(" private readonly "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Maintainer.GetTypeName(TargetLanguage.CSharp))); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeResponderName.GetTypeName(TargetLanguage.CSharp))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "responder"))); + this.Write(";\r\n"); + } + } + foreach (var telemEnvoyInfo in this.eventSpec) { + this.Write(" private readonly "); + this.Write(this.ToStringHelper.ToStringWithCulture(telemEnvoyInfo.Sender.GetTypeName(TargetLanguage.CSharp))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(telemEnvoyInfo.Sender.GetVariableName(TargetLanguage.CSharp))); + this.Write(";\r\n"); + } + this.Write(@" + /// + /// Construct a new instance of this service. + /// + /// The shared context for your application. + /// The MQTT client to use. + /// + /// The topic token replacement map to use for all operations by default. Generally, this will include the token values + /// for topic tokens that should be the same for the duration of this service's lifetime. Note that + /// additional topic tokens can be specified per event message. + /// + public Service(ApplicationContext applicationContext, IMqttPubSubClient mqttClient, Dictionary? topicTokenMap = null) + { + this.applicationContext = applicationContext; + this.mqttClient = mqttClient; + + string? clientId = this.mqttClient.ClientId; + if (string.IsNullOrEmpty(clientId)) + { + throw new InvalidOperationException(""No MQTT client Id configured. Must connect to MQTT broker before invoking command.""); + } + +"); + foreach (var actionSpec in this.actionSpecs) { + this.Write(" this."); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Executor.GetVariableName(TargetLanguage.CSharp))); + this.Write(" = new "); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Executor.GetTypeName(TargetLanguage.CSharp))); + this.Write("(applicationContext, mqttClient) { OnCommandReceived = "); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Name.GetMethodName(TargetLanguage.CSharp, "int"))); + this.Write(" };\r\n"); + } + foreach (var propSpec in this.propSpecs) { + this.Write(" this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "responder"))); + this.Write(" = new "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Maintainer.GetTypeName(TargetLanguage.CSharp))); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readResponderName.GetTypeName(TargetLanguage.CSharp))); + this.Write("(applicationContext, mqttClient) { OnCommandReceived = "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetMethodName(TargetLanguage.CSharp, "int", prefix: "read"))); + this.Write(" };\r\n"); + if (propSpec.WriteReqSchema != null) { + this.Write(" this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "responder"))); + this.Write(" = new "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Maintainer.GetTypeName(TargetLanguage.CSharp))); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeResponderName.GetTypeName(TargetLanguage.CSharp))); + this.Write("(applicationContext, mqttClient) { OnCommandReceived = "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetMethodName(TargetLanguage.CSharp, "int", prefix: "write"))); + this.Write(" };\r\n"); + } + } + foreach (var telemEnvoyInfo in this.eventSpec) { + this.Write(" this."); + this.Write(this.ToStringHelper.ToStringWithCulture(telemEnvoyInfo.Sender.GetVariableName(TargetLanguage.CSharp))); + this.Write(" = new "); + this.Write(this.ToStringHelper.ToStringWithCulture(telemEnvoyInfo.Sender.GetTypeName(TargetLanguage.CSharp))); + this.Write("(applicationContext, mqttClient);\r\n"); + } + this.Write("\r\n if (topicTokenMap != null)\r\n {\r\n " + + " foreach (string topicTokenKey in topicTokenMap.Keys)\r\n {\r" + + "\n"); + foreach (var actionSpec in this.actionSpecs) { + this.Write(" this."); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Executor.GetVariableName(TargetLanguage.CSharp))); + this.Write(".TopicTokenMap.TryAdd(\"ex:\" + topicTokenKey, topicTokenMap[topicTokenKey]);\r\n"); + } + foreach (var propSpec in this.propSpecs) { + this.Write(" this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "responder"))); + this.Write(".TopicTokenMap.TryAdd(\"ex:\" + topicTokenKey, topicTokenMap[topicTokenKey]);\r\n"); + if (propSpec.WriteReqSchema != null) { + this.Write(" this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "responder"))); + this.Write(".TopicTokenMap.TryAdd(\"ex:\" + topicTokenKey, topicTokenMap[topicTokenKey]);\r\n"); + } + } + foreach (var telemEnvoyInfo in this.eventSpec) { + this.Write(" this."); + this.Write(this.ToStringHelper.ToStringWithCulture(telemEnvoyInfo.Sender.GetVariableName(TargetLanguage.CSharp))); + this.Write(".TopicTokenMap.TryAdd(\"ex:\" + topicTokenKey, topicTokenMap[topicTokenKey]);\r\n"); + } + this.Write(" }\r\n }\r\n\r\n"); + foreach (var actionSpec in this.actionSpecs) { + this.Write(" this."); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Executor.GetVariableName(TargetLanguage.CSharp))); + this.Write(".TopicTokenMap.TryAdd(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.ActionExecutorId)); + this.Write("\", clientId);\r\n"); + } + foreach (var propSpec in this.propSpecs) { + this.Write(" this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "responder"))); + this.Write(".TopicTokenMap.TryAdd(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.PropertyMaintainerId)); + this.Write("\", clientId);\r\n"); + if (propSpec.WriteReqSchema != null) { + this.Write(" this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "responder"))); + this.Write(".TopicTokenMap.TryAdd(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.PropertyMaintainerId)); + this.Write("\", clientId);\r\n"); + } + } + this.Write(" }\r\n"); + foreach (var actionSpec in this.actionSpecs) { + this.Write("\r\n public "); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Executor.GetTypeName(TargetLanguage.CSharp))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Executor.GetTypeName(TargetLanguage.CSharp))); + this.Write(" { get => this."); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Executor.GetVariableName(TargetLanguage.CSharp))); + this.Write("; }\r\n"); + } + foreach (var propSpec in this.propSpecs) { + this.Write("\r\n public "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Maintainer.GetTypeName(TargetLanguage.CSharp))); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readResponderName.GetTypeName(TargetLanguage.CSharp))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetTypeName(TargetLanguage.CSharp, "read", "responder"))); + this.Write(" { get => this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "responder"))); + this.Write("; }\r\n"); + if (propSpec.WriteReqSchema != null) { + this.Write("\r\n public "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Maintainer.GetTypeName(TargetLanguage.CSharp))); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeResponderName.GetTypeName(TargetLanguage.CSharp))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetTypeName(TargetLanguage.CSharp, "write", "responder"))); + this.Write(" { get => this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "responder"))); + this.Write("; }\r\n"); + } + } + foreach (var telemEnvoyInfo in this.eventSpec) { + this.Write("\r\n public "); + this.Write(this.ToStringHelper.ToStringWithCulture(telemEnvoyInfo.Sender.GetTypeName(TargetLanguage.CSharp))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(telemEnvoyInfo.Sender.GetTypeName(TargetLanguage.CSharp))); + this.Write(" { get => this."); + this.Write(this.ToStringHelper.ToStringWithCulture(telemEnvoyInfo.Sender.GetVariableName(TargetLanguage.CSharp))); + this.Write("; }\r\n"); + } + foreach (var actionSpec in this.actionSpecs) { + this.Write("\r\n public "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.defaultImpl ? "virtual" : "abstract")); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.ExtRespType(actionSpec))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Name.GetMethodName(TargetLanguage.CSharp, "async"))); + this.Write("("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.ReqParam(actionSpec))); + this.Write("CommandRequestMetadata requestMetadata, CancellationToken cancellationToken)"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.defaultImpl ? "" : ";")); + this.Write("\r\n"); + if (this.defaultImpl) { + this.Write(" {\r\n return "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.EmptyResp(actionSpec))); + this.Write(";\r\n }\r\n"); + } + } + foreach (var propSpec in this.propSpecs) { + this.Write("\r\n public abstract Task> "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetMethodName(TargetLanguage.CSharp, "async", prefix: "read"))); + this.Write("(CommandRequestMetadata requestMetadata, CancellationToken cancellationToken);\r\n"); + if (propSpec.WriteReqSchema != null) { + this.Write("\r\n public abstract Task "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetMethodName(TargetLanguage.CSharp, "async", prefix: "write"))); + this.Write("("); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.WriteReqSchema.GetTypeName(TargetLanguage.CSharp))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp))); + this.Write(", CommandRequestMetadata requestMetadata, CancellationToken cancellationToken);\r\n" + + ""); + } + } + foreach (var telemEnvoyInfo in this.eventSpec) { + this.Write(@" + /// + /// Send telemetry. + /// + /// The payload of the telemetry. + /// The metadata of the telemetry. + /// + /// The topic token replacement map to use in addition to the topic token map provided in the constructor. If this map + /// contains any keys that topic token map provided in the constructor also has, then values specified in this map will take precedence. + /// + /// The quality of service to send the telemetry with. + /// How long the telemetry message will be available on the broker for a receiver to receive. + /// Cancellation token. + public async Task "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.TelemMethodName(telemEnvoyInfo, "send", "async"))); + this.Write("("); + this.Write(this.ToStringHelper.ToStringWithCulture(telemEnvoyInfo.Schema.GetTypeName(TargetLanguage.CSharp))); + this.Write(@" telemetry, OutgoingTelemetryMetadata metadata, Dictionary? additionalTopicTokenMap = null, MqttQualityOfServiceLevel qos = MqttQualityOfServiceLevel.AtLeastOnce, TimeSpan? telemetryTimeout = null, CancellationToken cancellationToken = default) + { + additionalTopicTokenMap ??= new(); + + Dictionary prefixedAdditionalTopicTokenMap = new(); + foreach (string key in additionalTopicTokenMap.Keys) + { + prefixedAdditionalTopicTokenMap[""ex:"" + key] = additionalTopicTokenMap[key]; + } + await this."); + this.Write(this.ToStringHelper.ToStringWithCulture(telemEnvoyInfo.Sender.GetVariableName(TargetLanguage.CSharp))); + this.Write(".SendTelemetryAsync(telemetry, metadata, prefixedAdditionalTopicTokenMap, qos, te" + + "lemetryTimeout, cancellationToken);\r\n }\r\n"); + } + if (this.actionSpecs.Any() || this.propSpecs.Any()) { + this.Write(@" + /// + /// Begin accepting command invocations for all command executors. + /// + /// The dispatch concurrency count for the command response cache to use. + /// Cancellation token. + public async Task StartAsync(int? preferredDispatchConcurrency = null, CancellationToken cancellationToken = default) + { + string? clientId = this.mqttClient.ClientId; + if (string.IsNullOrEmpty(clientId)) + { + throw new InvalidOperationException(""No MQTT client Id configured. Must connect to MQTT broker before starting service.""); + } + + await Task.WhenAll( +"); + foreach (var actionSpec in this.actionSpecs) { + this.Write(" this."); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Executor.GetVariableName(TargetLanguage.CSharp))); + this.Write(".StartAsync(preferredDispatchConcurrency, cancellationToken)"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.IsLast(actionSpec) ? ").ConfigureAwait(false);" : ",")); + this.Write("\r\n"); + } + foreach (var propSpec in this.propSpecs) { + this.Write(" this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "responder"))); + this.Write(".StartAsync(preferredDispatchConcurrency, cancellationToken)"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.IsLast(propSpec) && propSpec.WriteReqSchema == null ? ").ConfigureAwait(false);" : ",")); + this.Write("\r\n"); + if (propSpec.WriteReqSchema != null) { + this.Write(" this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "responder"))); + this.Write(".StartAsync(preferredDispatchConcurrency, cancellationToken)"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.IsLast(propSpec) ? ").ConfigureAwait(false);" : ",")); + this.Write("\r\n"); + } + } + this.Write(" }\r\n\r\n public async Task StopAsync(CancellationToken cancel" + + "lationToken = default)\r\n {\r\n await Task.WhenAll(\r\n"); + foreach (var actionSpec in this.actionSpecs) { + this.Write(" this."); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Executor.GetVariableName(TargetLanguage.CSharp))); + this.Write(".StopAsync(cancellationToken)"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.IsLast(actionSpec) ? ").ConfigureAwait(false);" : ",")); + this.Write("\r\n"); + } + foreach (var propSpec in this.propSpecs) { + this.Write(" this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "responder"))); + this.Write(".StopAsync(cancellationToken)"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.IsLast(propSpec) && propSpec.WriteReqSchema == null ? ").ConfigureAwait(false);" : ",")); + this.Write("\r\n"); + if (propSpec.WriteReqSchema != null) { + this.Write(" this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "responder"))); + this.Write(".StopAsync(cancellationToken)"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.IsLast(propSpec) ? ").ConfigureAwait(false);" : ",")); + this.Write("\r\n"); + } + } + this.Write(" }\r\n"); + } + foreach (var actionSpec in this.actionSpecs) { + this.Write("\r\n private async Task> "); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Name.GetMethodName(TargetLanguage.CSharp, "int"))); + this.Write("(ExtendedRequest<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.SchemaType(actionSpec.RequestSchema, actionSpec.SerializerEmptyType))); + this.Write("> req, CancellationToken cancellationToken)\r\n {\r\n"); + if (actionSpec.ErrorResultName != null) { + this.Write(" try\r\n {\r\n "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.IntLValue(actionSpec))); + this.Write("await this."); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Name.GetMethodName(TargetLanguage.CSharp, "async"))); + this.Write("("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.ReqArgs(actionSpec, "req"))); + this.Write(", cancellationToken);\r\n\r\n return new ExtendedResponse<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.SchemaType(actionSpec.ResponseSchema, actionSpec.SerializerEmptyType))); + this.Write(">\r\n {\r\n\r\n Response = new "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.SchemaType(actionSpec.ResponseSchema, actionSpec.SerializerEmptyType))); + this.Write("\r\n {\r\n"); + foreach (CodeName normalResultName in actionSpec.NormalResultNames) { + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(normalResultName.GetFieldName(TargetLanguage.CSharp))); + this.Write(" = extended.Response."); + this.Write(this.ToStringHelper.ToStringWithCulture(normalResultName.GetFieldName(TargetLanguage.CSharp))); + this.Write(",\r\n"); + } + this.Write(" },\r\n ResponseMetadata = extended.R" + + "esponseMetadata,\r\n };\r\n }\r\n cat" + + "ch ("); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.ErrorResultSchema.GetTypeName(TargetLanguage.CSharp, "exception"))); + this.Write(" intEx)\r\n {\r\n ExtendedResponse<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.SchemaType(actionSpec.ResponseSchema, actionSpec.SerializerEmptyType))); + this.Write("> extendedResponse = ExtendedResponse<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.SchemaType(actionSpec.ResponseSchema, actionSpec.SerializerEmptyType))); + this.Write(">.CreateFromResponse(new "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.SchemaType(actionSpec.ResponseSchema, actionSpec.SerializerEmptyType))); + this.Write(" { "); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.ErrorResultName.GetFieldName(TargetLanguage.CSharp))); + this.Write(" = intEx."); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.ErrorResultSchema.GetFieldName(TargetLanguage.CSharp))); + this.Write(" });\r\n"); + if (actionSpec.ErrorCodeName != null) { + this.Write("\r\n if (intEx.TryGetApplicationError(out "); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.ErrorCodeSchema.GetTypeName(TargetLanguage.CSharp))); + this.Write("? "); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.ErrorCodeName.GetVariableName(TargetLanguage.CSharp))); + this.Write(", out "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.GetInfoSchema(actionSpec.ErrorInfoSchema))); + this.Write("? "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.GetInfoName(actionSpec.ErrorInfoName))); + this.Write("))\r\n {\r\n extendedResponse = extendedRes" + + "ponse.WithApplicationError(("); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.ErrorCodeSchema.GetTypeName(TargetLanguage.CSharp))); + this.Write(")"); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.ErrorCodeName.GetVariableName(TargetLanguage.CSharp))); + this.Write(", "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.GetInfoName(actionSpec.ErrorInfoName))); + this.Write(");\r\n }\r\n\r\n"); + } + this.Write(" return extendedResponse;\r\n }\r\n"); + } else { + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.IntLValue(actionSpec))); + this.Write("await this."); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Name.GetMethodName(TargetLanguage.CSharp, "async"))); + this.Write("("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.ReqArgs(actionSpec, "req"))); + this.Write(", cancellationToken);\r\n return new ExtendedResponse<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.SchemaType(actionSpec.ResponseSchema, actionSpec.SerializerEmptyType))); + this.Write("> { "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.IntRValue(actionSpec))); + this.Write("};\r\n"); + } + this.Write(" }\r\n"); + } + foreach (var propSpec in this.propSpecs) { + this.Write("\r\n private async Task> "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetMethodName(TargetLanguage.CSharp, "int", prefix: "read"))); + this.Write("(ExtendedRequest<"); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.ReadSerializerEmptyType.GetTypeName(TargetLanguage.CSharp))); + this.Write("> req, CancellationToken cancellationToken)\r\n {\r\n"); + if (propSpec.ReadErrorName != null) { + this.Write(" try\r\n {\r\n ExtendedResponse<"); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.PropSchema.GetTypeName(TargetLanguage.CSharp))); + this.Write("> extended = await this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetMethodName(TargetLanguage.CSharp, "async", prefix: "read"))); + this.Write("(req.RequestMetadata!, cancellationToken);\r\n\r\n return new Exte" + + "ndedResponse<"); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.ReadRespSchema.GetTypeName(TargetLanguage.CSharp))); + this.Write(">\r\n {\r\n Response = new "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.ReadRespSchema.GetTypeName(TargetLanguage.CSharp))); + this.Write(" { "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.PropValueName.GetFieldName(TargetLanguage.CSharp))); + this.Write(" = extended.Response"); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.IsAggregate ? "" : $".{propSpec.PropValueName.GetFieldName(TargetLanguage.CSharp)}")); + this.Write(" },\r\n ResponseMetadata = extended.ResponseMetadata,\r\n " + + " };\r\n }\r\n catch ("); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.ReadErrorSchema.GetTypeName(TargetLanguage.CSharp, "exception"))); + this.Write(" intEx)\r\n {\r\n ExtendedResponse<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.SchemaType(propSpec.ReadRespSchema, propSpec.ReadSerializerEmptyType))); + this.Write("> extendedResponse = ExtendedResponse<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.SchemaType(propSpec.ReadRespSchema, propSpec.ReadSerializerEmptyType))); + this.Write(">.CreateFromResponse(new "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.SchemaType(propSpec.ReadRespSchema, propSpec.ReadSerializerEmptyType))); + this.Write(" { "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.ReadErrorName.GetFieldName(TargetLanguage.CSharp))); + this.Write(" = intEx."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.ReadErrorSchema.GetFieldName(TargetLanguage.CSharp))); + this.Write(" });\r\n return extendedResponse;\r\n }\r\n"); + } else { + this.Write(" return await this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetMethodName(TargetLanguage.CSharp, "async", prefix: "read"))); + this.Write("(req.RequestMetadata!, cancellationToken);\r\n"); + } + this.Write(" }\r\n"); + if (propSpec.WriteReqSchema != null) { + this.Write("\r\n private async Task> "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetMethodName(TargetLanguage.CSharp, "int", prefix: "write"))); + this.Write("(ExtendedRequest<"); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.WriteReqSchema.GetTypeName(TargetLanguage.CSharp))); + this.Write("> req, CancellationToken cancellationToken)\r\n {\r\n"); + if (propSpec.WriteRespSchema != null) { + this.Write(" try\r\n {\r\n CommandResponseMetada" + + "ta? respMetadata = await this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetMethodName(TargetLanguage.CSharp, "async", prefix: "write"))); + this.Write("(req.Request!, req.RequestMetadata!, cancellationToken);\r\n\r\n r" + + "eturn new ExtendedResponse<"); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.WriteRespSchema.GetTypeName(TargetLanguage.CSharp))); + this.Write(">\r\n {\r\n Response = new "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.WriteRespSchema.GetTypeName(TargetLanguage.CSharp))); + this.Write("\r\n {\r\n "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.WriteErrorName.GetFieldName(TargetLanguage.CSharp))); + this.Write(" = null,\r\n },\r\n ResponseMetadata = " + + "respMetadata,\r\n };\r\n }\r\n catch " + + "("); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.WriteErrorSchema.GetTypeName(TargetLanguage.CSharp, "exception"))); + this.Write(" intEx)\r\n {\r\n ExtendedResponse<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.SchemaType(propSpec.WriteRespSchema, propSpec.WriteSerializerEmptyType))); + this.Write("> extendedResponse = ExtendedResponse<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.SchemaType(propSpec.WriteRespSchema, propSpec.WriteSerializerEmptyType))); + this.Write(">.CreateFromResponse(new "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.SchemaType(propSpec.WriteRespSchema, propSpec.WriteSerializerEmptyType))); + this.Write(" { "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.WriteErrorName.GetFieldName(TargetLanguage.CSharp))); + this.Write(" = intEx."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.WriteErrorSchema.GetFieldName(TargetLanguage.CSharp))); + this.Write(" });\r\n return extendedResponse;\r\n }\r\n"); + } else { + this.Write(" CommandResponseMetadata? respMetadata = await this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetMethodName(TargetLanguage.CSharp, "async", prefix: "write"))); + this.Write("(req.Request!, req.RequestMetadata!, cancellationToken);\r\n return " + + "new ExtendedResponse<"); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.WriteSerializerEmptyType.GetTypeName(TargetLanguage.CSharp))); + this.Write(">\r\n {\r\n Response = new "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.WriteSerializerEmptyType.GetTypeName(TargetLanguage.CSharp))); + this.Write("(),\r\n ResponseMetadata = respMetadata,\r\n };\r\n"); + } + this.Write(" }\r\n"); + } + } + this.Write("\r\n public async ValueTask DisposeAsync()\r\n {\r\n"); + foreach (var actionSpec in this.actionSpecs) { + this.Write(" await this."); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Executor.GetVariableName(TargetLanguage.CSharp))); + this.Write(".DisposeAsync().ConfigureAwait(false);\r\n"); + } + foreach (var propSpec in this.propSpecs) { + this.Write(" await this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "responder"))); + this.Write(".DisposeAsync().ConfigureAwait(false);\r\n"); + if (propSpec.WriteReqSchema != null) { + this.Write(" await this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "responder"))); + this.Write(".DisposeAsync().ConfigureAwait(false); \r\n"); + } + } + foreach (var telemEnvoyInfo in this.eventSpec) { + this.Write(" await this."); + this.Write(this.ToStringHelper.ToStringWithCulture(telemEnvoyInfo.Sender.GetVariableName(TargetLanguage.CSharp))); + this.Write(".DisposeAsync().ConfigureAwait(false);\r\n"); + } + this.Write(" }\r\n\r\n public async ValueTask DisposeAsync(bool disposing)\r" + + "\n {\r\n"); + foreach (var actionSpec in this.actionSpecs) { + this.Write(" await this."); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Executor.GetVariableName(TargetLanguage.CSharp))); + this.Write(".DisposeAsync(disposing).ConfigureAwait(false);\r\n"); + } + foreach (var propSpec in this.propSpecs) { + this.Write(" await this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "responder"))); + this.Write(".DisposeAsync(disposing).ConfigureAwait(false);\r\n"); + if (propSpec.WriteReqSchema != null) { + this.Write(" await this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "responder"))); + this.Write(".DisposeAsync(disposing).ConfigureAwait(false); \r\n"); + } + } + foreach (var telemEnvoyInfo in this.eventSpec) { + this.Write(" await this."); + this.Write(this.ToStringHelper.ToStringWithCulture(telemEnvoyInfo.Sender.GetVariableName(TargetLanguage.CSharp))); + this.Write(".DisposeAsync(disposing).ConfigureAwait(false);\r\n"); + } + this.Write(" }\r\n }\r\n"); + } + if (this.generateServer && this.generateClient) { + this.Write("\r\n"); + } + if (this.generateClient) { + this.Write(" public abstract partial class Client"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.actionSpecs.Any() || this.propSpecs.Any() ? " : IAsyncDisposable" : "")); + this.Write("\r\n {\r\n private ApplicationContext applicationContext;\r\n " + + " private IMqttPubSubClient mqttClient;\r\n"); + foreach (var actionSpec in this.actionSpecs) { + this.Write(" private readonly "); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Invoker.GetTypeName(TargetLanguage.CSharp))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Invoker.GetVariableName(TargetLanguage.CSharp))); + this.Write(";\r\n"); + } + foreach (var propSpec in this.propSpecs) { + this.Write(" private readonly "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Consumer.GetTypeName(TargetLanguage.CSharp))); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readRequesterName.GetTypeName(TargetLanguage.CSharp))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "requester"))); + this.Write(";\r\n"); + if (propSpec.WriteReqSchema != null) { + this.Write(" private readonly "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Consumer.GetTypeName(TargetLanguage.CSharp))); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeRequesterName.GetTypeName(TargetLanguage.CSharp))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "requester"))); + this.Write(";\r\n"); + } + } + foreach (var telemEnvoyInfo in this.eventSpec) { + this.Write(" private readonly "); + this.Write(this.ToStringHelper.ToStringWithCulture(telemEnvoyInfo.Receiver.GetTypeName(TargetLanguage.CSharp))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(telemEnvoyInfo.Receiver.GetVariableName(TargetLanguage.CSharp))); + this.Write(";\r\n"); + } + this.Write(@" + /// + /// Construct a new instance of this client. + /// + /// The shared context for your application. + /// The MQTT client to use. + /// + /// The topic token replacement map to use for all operations by default. Generally, this will include the token values + /// for topic tokens that should be the same for the duration of this client's lifetime. + /// + public Client(ApplicationContext applicationContext, IMqttPubSubClient mqttClient, Dictionary? topicTokenMap = null) + { + this.applicationContext = applicationContext; + this.mqttClient = mqttClient; + +"); + foreach (var actionSpec in this.actionSpecs) { + this.Write(" this."); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Invoker.GetVariableName(TargetLanguage.CSharp))); + this.Write(" = new "); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Invoker.GetTypeName(TargetLanguage.CSharp))); + this.Write("(applicationContext, mqttClient);\r\n"); + } + foreach (var propSpec in this.propSpecs) { + this.Write(" this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "requester"))); + this.Write(" = new "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Consumer.GetTypeName(TargetLanguage.CSharp))); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readRequesterName.GetTypeName(TargetLanguage.CSharp))); + this.Write("(applicationContext, mqttClient);\r\n"); + if (propSpec.WriteReqSchema != null) { + this.Write(" this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "requester"))); + this.Write(" = new "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Consumer.GetTypeName(TargetLanguage.CSharp))); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeRequesterName.GetTypeName(TargetLanguage.CSharp))); + this.Write("(applicationContext, mqttClient);\r\n"); + } + } + foreach (var telemEnvoyInfo in this.eventSpec) { + this.Write(" this."); + this.Write(this.ToStringHelper.ToStringWithCulture(telemEnvoyInfo.Receiver.GetVariableName(TargetLanguage.CSharp))); + this.Write(" = new "); + this.Write(this.ToStringHelper.ToStringWithCulture(telemEnvoyInfo.Receiver.GetTypeName(TargetLanguage.CSharp))); + this.Write("(applicationContext, mqttClient) { OnTelemetryReceived = this."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.TelemMethodName(telemEnvoyInfo, "receive"))); + this.Write(" };\r\n"); + } + this.Write("\r\n if (topicTokenMap != null)\r\n {\r\n " + + " foreach (string topicTokenKey in topicTokenMap.Keys)\r\n {\r" + + "\n"); + foreach (var actionSpec in this.actionSpecs) { + this.Write(" this."); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Invoker.GetVariableName(TargetLanguage.CSharp))); + this.Write(".TopicTokenMap.TryAdd(\"ex:\" + topicTokenKey, topicTokenMap[topicTokenKey]);\r\n"); + } + foreach (var propSpec in this.propSpecs) { + this.Write(" this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "requester"))); + this.Write(".TopicTokenMap.TryAdd(\"ex:\" + topicTokenKey, topicTokenMap[topicTokenKey]);\r\n"); + if (propSpec.WriteReqSchema != null) { + this.Write(" this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "requester"))); + this.Write(".TopicTokenMap.TryAdd(\"ex:\" + topicTokenKey, topicTokenMap[topicTokenKey]);\r\n"); + } + } + foreach (var telemEnvoyInfo in this.eventSpec) { + this.Write(" this."); + this.Write(this.ToStringHelper.ToStringWithCulture(telemEnvoyInfo.Receiver.GetVariableName(TargetLanguage.CSharp))); + this.Write(".TopicTokenMap.TryAdd(\"ex:\" + topicTokenKey, topicTokenMap[topicTokenKey]);\r\n"); + } + this.Write(" }\r\n }\r\n }\r\n"); + foreach (var actionSpec in this.actionSpecs) { + this.Write("\r\n public "); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Invoker.GetTypeName(TargetLanguage.CSharp))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Invoker.GetTypeName(TargetLanguage.CSharp))); + this.Write(" { get => this."); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Invoker.GetVariableName(TargetLanguage.CSharp))); + this.Write("; }\r\n"); + } + foreach (var propSpec in this.propSpecs) { + this.Write("\r\n public "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Consumer.GetTypeName(TargetLanguage.CSharp))); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readRequesterName.GetTypeName(TargetLanguage.CSharp))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetTypeName(TargetLanguage.CSharp, "read", "requester"))); + this.Write(" { get => this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "requester"))); + this.Write("; }\r\n"); + if (propSpec.WriteReqSchema != null) { + this.Write("\r\n public "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Consumer.GetTypeName(TargetLanguage.CSharp))); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeRequesterName.GetTypeName(TargetLanguage.CSharp))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetTypeName(TargetLanguage.CSharp, "write", "requester"))); + this.Write(" { get => this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "requester"))); + this.Write("; }\r\n"); + } + } + foreach (var telemEnvoyInfo in this.eventSpec) { + this.Write("\r\n public "); + this.Write(this.ToStringHelper.ToStringWithCulture(telemEnvoyInfo.Receiver.GetTypeName(TargetLanguage.CSharp))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(telemEnvoyInfo.Receiver.GetTypeName(TargetLanguage.CSharp))); + this.Write(" { get => this."); + this.Write(this.ToStringHelper.ToStringWithCulture(telemEnvoyInfo.Receiver.GetVariableName(TargetLanguage.CSharp))); + this.Write("; }\r\n"); + } + foreach (var telemEnvoyInfo in this.eventSpec) { + this.Write("\r\n public "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.defaultImpl ? "virtual" : "abstract")); + this.Write(" Task "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.TelemMethodName(telemEnvoyInfo, "receive"))); + this.Write("(string senderId, "); + this.Write(this.ToStringHelper.ToStringWithCulture(telemEnvoyInfo.Schema.GetTypeName(TargetLanguage.CSharp))); + this.Write(" telemetry, IncomingTelemetryMetadata metadata)"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.defaultImpl ? "" : ";")); + this.Write("\r\n"); + if (this.defaultImpl) { + this.Write(" {\r\n return Task.CompletedTask;\r\n }\r\n"); + } + } + foreach (var actionSpec in this.actionSpecs) { + this.Write("\r\n /// \r\n /// Invoke a command.\r\n /// <" + + "/summary>\r\n"); + if (actionSpec.DoesTargetExecutor) { + this.Write(" /// The identifier of the executor targeted " + + "by this command request.\r\n"); + } + if (actionSpec.RequestSchema != null) { + this.Write(" /// The data for this command request.\r" + + "\n"); + } + this.Write(@" /// The metadata for this command request. + /// + /// The topic token replacement map to use in addition to the topic tokens specified in the constructor. If this map + /// contains any keys that the topic tokens specified in the constructor also has, then values specified in this map will take precedence. + /// + /// How long the command will be available on the broker for an executor to receive. + /// Cancellation token. + /// The command response. + public "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.CallAsyncType(actionSpec))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Name.GetMethodName(TargetLanguage.CSharp, "async"))); + this.Write("("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.ExecParam(actionSpec))); + this.Write(this.ToStringHelper.ToStringWithCulture(this.ReqParam(actionSpec))); + this.Write(@"CommandRequestMetadata? requestMetadata = null, Dictionary? additionalTopicTokenMap = null, TimeSpan? commandTimeout = default, CancellationToken cancellationToken = default) + { + string? clientId = this.mqttClient.ClientId; + if (string.IsNullOrEmpty(clientId)) + { + throw new InvalidOperationException(""No MQTT client Id configured. Must connect to MQTT broker before invoking command.""); + } + + CommandRequestMetadata metadata = requestMetadata ?? new CommandRequestMetadata(); + additionalTopicTokenMap ??= new(); + + Dictionary prefixedAdditionalTopicTokenMap = new(); + foreach (string key in additionalTopicTokenMap.Keys) + { + prefixedAdditionalTopicTokenMap[""ex:"" + key] = additionalTopicTokenMap[key]; + } + + prefixedAdditionalTopicTokenMap[""invokerClientId""] = clientId; +"); + if (actionSpec.DoesTargetExecutor) { + this.Write(" prefixedAdditionalTopicTokenMap[\"executorId\"] = executorId;\r\n"); + } + this.Write("\r\n return new "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.CallAsyncType(actionSpec))); + this.Write("(this."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.IntMethod(actionSpec))); + this.Write("("); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.RequestSchema != null ? $"request" : actionSpec.SerializerEmptyType.GetAllocator(TargetLanguage.CSharp))); + this.Write(", metadata, prefixedAdditionalTopicTokenMap, commandTimeout, cancellationToken), " + + "metadata.CorrelationId);\r\n }\r\n"); + } + foreach (var propSpec in this.propSpecs) { + this.Write("\r\n public "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.CallAsyncType(propSpec))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetMethodName(TargetLanguage.CSharp, "async", prefix: "read"))); + this.Write("("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.ReadMaintParam(propSpec))); + this.Write(@"CommandRequestMetadata? requestMetadata = null, Dictionary? additionalTopicTokenMap = null, TimeSpan? commandTimeout = default, CancellationToken cancellationToken = default) + { + string? clientId = this.mqttClient.ClientId; + if (string.IsNullOrEmpty(clientId)) + { + throw new InvalidOperationException(""No MQTT client Id configured. Must connect to MQTT broker before requesting to read property.""); + } + + CommandRequestMetadata metadata = requestMetadata ?? new CommandRequestMetadata(); + additionalTopicTokenMap ??= new(); + + Dictionary prefixedAdditionalTopicTokenMap = new(); + foreach (string key in additionalTopicTokenMap.Keys) + { + prefixedAdditionalTopicTokenMap[""ex:"" + key] = additionalTopicTokenMap[key]; + } + + prefixedAdditionalTopicTokenMap[""consumerClientId""] = clientId; +"); + if (propSpec.DoesReadTargetMaintainer) { + this.Write(" prefixedAdditionalTopicTokenMap[\"maintainerId\"] = maintainerId;\r\n" + + ""); + } + this.Write("\r\n return new "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.CallAsyncType(propSpec))); + this.Write("(this."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.IntReadMethod(propSpec))); + this.Write("("); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.ReadSerializerEmptyType.GetAllocator(TargetLanguage.CSharp))); + this.Write(", metadata, prefixedAdditionalTopicTokenMap, commandTimeout, cancellationToken), " + + "metadata.CorrelationId);\r\n }\r\n"); + if (propSpec.WriteReqSchema != null) { + this.Write("\r\n public RpcCallAsync<"); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.ReadSerializerEmptyType.GetTypeName(TargetLanguage.CSharp))); + this.Write("> "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetMethodName(TargetLanguage.CSharp, "async", prefix: "write"))); + this.Write("("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.WriteMaintParam(propSpec))); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.WriteReqSchema.GetTypeName(TargetLanguage.CSharp))); + this.Write(@" request, CommandRequestMetadata? requestMetadata = null, Dictionary? additionalTopicTokenMap = null, TimeSpan? commandTimeout = default, CancellationToken cancellationToken = default) + { + string? clientId = this.mqttClient.ClientId; + if (string.IsNullOrEmpty(clientId)) + { + throw new InvalidOperationException(""No MQTT client Id configured. Must connect to MQTT broker before requesting to write property.""); + } + + CommandRequestMetadata metadata = requestMetadata ?? new CommandRequestMetadata(); + additionalTopicTokenMap ??= new(); + + Dictionary prefixedAdditionalTopicTokenMap = new(); + foreach (string key in additionalTopicTokenMap.Keys) + { + prefixedAdditionalTopicTokenMap[""ex:"" + key] = additionalTopicTokenMap[key]; + } + + prefixedAdditionalTopicTokenMap[""consumerClientId""] = clientId; +"); + if (propSpec.DoesWriteTargetMaintainer) { + this.Write(" prefixedAdditionalTopicTokenMap[\"maintainerId\"] = maintainerId;\r\n" + + ""); + } + this.Write("\r\n return new RpcCallAsync<"); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.WriteSerializerEmptyType.GetTypeName(TargetLanguage.CSharp))); + this.Write(">(this."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.IntWriteMethod(propSpec))); + this.Write("(request, metadata, prefixedAdditionalTopicTokenMap, commandTimeout, cancellation" + + "Token), metadata.CorrelationId);\r\n }\r\n"); + } + } + if (this.eventSpec.Any()) { + this.Write(@" + /// + /// Begin accepting telemetry for all telemetry receivers. + /// + /// Cancellation token. + public async Task StartAsync(CancellationToken cancellationToken = default) + { + await Task.WhenAll( +"); + foreach (var telemEnvoyInfo in this.eventSpec) { + this.Write(" this."); + this.Write(this.ToStringHelper.ToStringWithCulture(telemEnvoyInfo.Receiver.GetVariableName(TargetLanguage.CSharp))); + this.Write(".StartAsync(cancellationToken)"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.IsLast(telemEnvoyInfo) ? ").ConfigureAwait(false);" : ",")); + this.Write("\r\n"); + } + this.Write(" }\r\n"); + } + if (this.eventSpec.Any()) { + this.Write(@" + /// + /// Stop accepting telemetry for all telemetry receivers. + /// + /// Cancellation token. + public async Task StopAsync(CancellationToken cancellationToken = default) + { + await Task.WhenAll( +"); + foreach (var telemEnvoyInfo in this.eventSpec) { + this.Write(" this."); + this.Write(this.ToStringHelper.ToStringWithCulture(telemEnvoyInfo.Receiver.GetVariableName(TargetLanguage.CSharp))); + this.Write(".StopAsync(cancellationToken)"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.IsLast(telemEnvoyInfo) ? ").ConfigureAwait(false);" : ",")); + this.Write("\r\n"); + } + this.Write(" }\r\n"); + } + foreach (var actionSpec in this.actionSpecs) { + if (actionSpec.ErrorResultName != null) { + this.Write("\r\n private async Task> "); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Name.GetMethodName(TargetLanguage.CSharp, "int"))); + this.Write("("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.SchemaType(actionSpec.RequestSchema, actionSpec.SerializerEmptyType))); + this.Write(" request, CommandRequestMetadata? requestMetadata, Dictionary? pr" + + "efixedAdditionalTopicTokenMap, TimeSpan? commandTimeout, CancellationToken cance" + + "llationToken)\r\n {\r\n ExtendedResponse<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.SchemaType(actionSpec.ResponseSchema, actionSpec.SerializerEmptyType))); + this.Write("> extended = await this."); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Invoker.GetVariableName(TargetLanguage.CSharp))); + this.Write(".InvokeCommandAsync(request, requestMetadata, prefixedAdditionalTopicTokenMap, co" + + "mmandTimeout, cancellationToken);\r\n\r\n if (extended.Response."); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.ErrorResultName.GetFieldName(TargetLanguage.CSharp))); + this.Write(" != null)\r\n {\r\n "); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.ErrorResultSchema.GetTypeName(TargetLanguage.CSharp, "exception"))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.ErrorResultSchema.GetVariableName(TargetLanguage.CSharp, "exception"))); + this.Write(" = new "); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.ErrorResultSchema.GetTypeName(TargetLanguage.CSharp, "exception"))); + this.Write("(extended.Response."); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.ErrorResultName.GetFieldName(TargetLanguage.CSharp))); + this.Write(");\r\n"); + if (actionSpec.ErrorCodeName != null) { + this.Write("\r\n if (extended.TryGetApplicationError(out "); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.ErrorCodeSchema.GetTypeName(TargetLanguage.CSharp))); + this.Write("? "); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.ErrorCodeName.GetVariableName(TargetLanguage.CSharp))); + this.Write(", out "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.GetInfoSchema(actionSpec.ErrorInfoSchema))); + this.Write("? "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.GetInfoName(actionSpec.ErrorInfoName))); + this.Write("))\r\n {\r\n "); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.ErrorResultSchema.GetVariableName(TargetLanguage.CSharp, "exception"))); + this.Write(" = "); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.ErrorResultSchema.GetVariableName(TargetLanguage.CSharp, "exception"))); + this.Write(".WithApplicationError(("); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.ErrorCodeSchema.GetTypeName(TargetLanguage.CSharp))); + this.Write(")"); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.ErrorCodeName.GetVariableName(TargetLanguage.CSharp))); + this.Write(", "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.GetInfoName(actionSpec.ErrorInfoName))); + this.Write(");\r\n }\r\n\r\n"); + } + this.Write(" throw "); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.ErrorResultSchema.GetVariableName(TargetLanguage.CSharp, "exception"))); + this.Write(";\r\n }\r\n else\r\n {\r\n " + + " return new ExtendedResponse<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.SchemaType(actionSpec.NormalResultSchema ?? actionSpec.ResponseSchema, actionSpec.SerializerEmptyType))); + this.Write(">\r\n {\r\n Response = new "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.SchemaType(actionSpec.NormalResultSchema ?? actionSpec.ResponseSchema, actionSpec.SerializerEmptyType))); + this.Write("\r\n {\r\n"); + foreach (CodeName normalResultName in actionSpec.NormalResultNames) { + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(normalResultName.GetFieldName(TargetLanguage.CSharp))); + this.Write(" = extended.Response."); + this.Write(this.ToStringHelper.ToStringWithCulture(normalResultName.GetFieldName(TargetLanguage.CSharp))); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.NormalRequiredNames.Contains(normalResultName) ? ".Value()" : "")); + this.Write(",\r\n"); + } + this.Write(" },\r\n ResponseMetadata = extended.R" + + "esponseMetadata,\r\n };\r\n }\r\n }\r\n"); + } + } + foreach (var propSpec in this.propSpecs) { + if (propSpec.ReadErrorName != null) { + this.Write("\r\n private async Task> "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetMethodName(TargetLanguage.CSharp, "int", prefix: "read"))); + this.Write("("); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.ReadSerializerEmptyType.GetTypeName(TargetLanguage.CSharp))); + this.Write(" request, CommandRequestMetadata? requestMetadata, Dictionary? pr" + + "efixedAdditionalTopicTokenMap, TimeSpan? commandTimeout, CancellationToken cance" + + "llationToken)\r\n {\r\n ExtendedResponse<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.SchemaType(propSpec.ReadRespSchema, propSpec.ReadSerializerEmptyType))); + this.Write("> extended = await this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "requester"))); + this.Write(".InvokeCommandAsync(request, requestMetadata, prefixedAdditionalTopicTokenMap, co" + + "mmandTimeout, cancellationToken);\r\n\r\n if (extended.Response."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.ReadErrorName.GetFieldName(TargetLanguage.CSharp))); + this.Write(" != null)\r\n {\r\n "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.ReadErrorSchema.GetTypeName(TargetLanguage.CSharp, "exception"))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.ReadErrorSchema.GetVariableName(TargetLanguage.CSharp, "exception"))); + this.Write(" = new "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.ReadErrorSchema.GetTypeName(TargetLanguage.CSharp, "exception"))); + this.Write("(extended.Response."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.ReadErrorName.GetFieldName(TargetLanguage.CSharp))); + this.Write(");\r\n throw "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.ReadErrorSchema.GetVariableName(TargetLanguage.CSharp, "exception"))); + this.Write(";\r\n }\r\n else if (extended.Response."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.PropValueName.GetFieldName(TargetLanguage.CSharp))); + this.Write(@" == null) + { + throw new AkriMqttException(""Property read response has neither normal nor error payload content"") + { + Kind = AkriMqttErrorKind.PayloadInvalid, + IsShallow = false, + IsRemote = false, + }; + } + else + { + return new ExtendedResponse<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.SchemaType(propSpec.PropSchema, propSpec.ReadSerializerEmptyType))); + this.Write(">\r\n {\r\n"); + if (propSpec.IsAggregate) { + this.Write(" Response = extended.Response."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.PropValueName.GetFieldName(TargetLanguage.CSharp))); + this.Write(",\r\n"); + } else { + this.Write(" Response = new "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.SchemaType(propSpec.PropSchema, propSpec.ReadSerializerEmptyType))); + this.Write(" { "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.PropValueName.GetFieldName(TargetLanguage.CSharp))); + this.Write(" = extended.Response."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.PropValueName.GetFieldName(TargetLanguage.CSharp))); + this.Write(".Value() },\r\n"); + } + this.Write(" ResponseMetadata = extended.ResponseMetadata,\r\n " + + " };\r\n }\r\n }\r\n"); + } + if (propSpec.WriteReqSchema != null && propSpec.WriteErrorName != null) { + this.Write("\r\n private async Task> "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetMethodName(TargetLanguage.CSharp, "int", prefix: "write"))); + this.Write("("); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.WriteReqSchema.GetTypeName(TargetLanguage.CSharp))); + this.Write(" request, CommandRequestMetadata? requestMetadata, Dictionary? pr" + + "efixedAdditionalTopicTokenMap, TimeSpan? commandTimeout, CancellationToken cance" + + "llationToken)\r\n {\r\n ExtendedResponse<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.SchemaType(propSpec.WriteRespSchema, propSpec.WriteSerializerEmptyType))); + this.Write("> extended = await this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "requester"))); + this.Write(".InvokeCommandAsync(request, requestMetadata, prefixedAdditionalTopicTokenMap, co" + + "mmandTimeout, cancellationToken);\r\n\r\n if (extended.Response."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.WriteErrorName.GetFieldName(TargetLanguage.CSharp))); + this.Write(" != null)\r\n {\r\n "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.WriteErrorSchema.GetTypeName(TargetLanguage.CSharp, "exception"))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.WriteErrorSchema.GetVariableName(TargetLanguage.CSharp, "exception"))); + this.Write(" = new "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.WriteErrorSchema.GetTypeName(TargetLanguage.CSharp, "exception"))); + this.Write("(extended.Response."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.WriteErrorName.GetFieldName(TargetLanguage.CSharp))); + this.Write(");\r\n throw "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.WriteErrorSchema.GetVariableName(TargetLanguage.CSharp, "exception"))); + this.Write(";\r\n }\r\n else\r\n {\r\n " + + " return new ExtendedResponse<"); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.WriteSerializerEmptyType.GetTypeName(TargetLanguage.CSharp))); + this.Write(">\r\n {\r\n Response = "); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.WriteSerializerEmptyType.GetAllocator(TargetLanguage.CSharp))); + this.Write(",\r\n ResponseMetadata = extended.ResponseMetadata,\r\n " + + " };\r\n }\r\n }\r\n"); + } + } + this.Write("\r\n public async ValueTask DisposeAsync()\r\n {\r\n"); + foreach (var actionSpec in this.actionSpecs) { + this.Write(" await this."); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Invoker.GetVariableName(TargetLanguage.CSharp))); + this.Write(".DisposeAsync().ConfigureAwait(false);\r\n"); + } + foreach (var propSpec in this.propSpecs) { + this.Write(" await this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "requester"))); + this.Write(".DisposeAsync().ConfigureAwait(false);\r\n"); + if (propSpec.WriteReqSchema != null) { + this.Write(" await this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "requester"))); + this.Write(".DisposeAsync().ConfigureAwait(false); \r\n"); + } + } + foreach (var telemEnvoyInfo in this.eventSpec) { + this.Write(" await this."); + this.Write(this.ToStringHelper.ToStringWithCulture(telemEnvoyInfo.Receiver.GetVariableName(TargetLanguage.CSharp))); + this.Write(".DisposeAsync().ConfigureAwait(false);\r\n"); + } + this.Write(" }\r\n\r\n public async ValueTask DisposeAsync(bool disposing)\r" + + "\n {\r\n"); + foreach (var actionSpec in this.actionSpecs) { + this.Write(" await this."); + this.Write(this.ToStringHelper.ToStringWithCulture(actionSpec.Invoker.GetVariableName(TargetLanguage.CSharp))); + this.Write(".DisposeAsync(disposing).ConfigureAwait(false);\r\n"); + } + foreach (var propSpec in this.propSpecs) { + this.Write(" await this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "requester"))); + this.Write(".DisposeAsync(disposing).ConfigureAwait(false);\r\n"); + if (propSpec.WriteReqSchema != null) { + this.Write(" await this."); + this.Write(this.ToStringHelper.ToStringWithCulture(propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "requester"))); + this.Write(".DisposeAsync(disposing).ConfigureAwait(false); \r\n"); + } + } + foreach (var telemEnvoyInfo in this.eventSpec) { + this.Write(" await this."); + this.Write(this.ToStringHelper.ToStringWithCulture(telemEnvoyInfo.Receiver.GetVariableName(TargetLanguage.CSharp))); + this.Write(".DisposeAsync(disposing).ConfigureAwait(false);\r\n"); + } + this.Write(" }\r\n }\r\n"); + } + this.Write(" }\r\n}\r\n"); + return this.GenerationEnvironment.ToString(); + } + + private string IntLValue(ActionSpec actionSpec) => (actionSpec.ResponseSchema != null ? $"ExtendedResponse<{this.SchemaType(actionSpec.NormalResultSchema ?? actionSpec.ResponseSchema, actionSpec.SerializerEmptyType)}> extended = " : $"CommandResponseMetadata? responseMetadata = "); + + private string IntRValue(ActionSpec actionSpec) => (actionSpec.ResponseSchema != null ? "Response = extended.Response, ResponseMetadata = extended.ResponseMetadata " : "ResponseMetadata = responseMetadata "); + + private string ExtRespType(ActionSpec actionSpec) => this.CondWrap(actionSpec.ResponseSchema != null ? $"ExtendedResponse<{this.SchemaType(actionSpec.NormalResultSchema ?? actionSpec.ResponseSchema, actionSpec.SerializerEmptyType)}>" : "CommandResponseMetadata?"); + + private string EmptyResp(ActionSpec actionSpec) => this.CondFrom(actionSpec.ResponseSchema != null ? $"new ExtendedResponse<{this.SchemaType(actionSpec.NormalResultSchema ?? actionSpec.ResponseSchema, actionSpec.SerializerEmptyType)}> {{ Response = new {this.SchemaType(actionSpec.NormalResultSchema ?? actionSpec.ResponseSchema, actionSpec.SerializerEmptyType)}() }}" : "(CommandResponseMetadata?)new CommandResponseMetadata()"); + + private string CondWrap(string type) => $"Task<{type}>"; + + private string CondFrom(string res) => $"Task.FromResult({res})"; + + private string ReqParam(ActionSpec actionSpec) => actionSpec.RequestSchema != null ? $"{this.SchemaType(actionSpec.RequestSchema, actionSpec.SerializerEmptyType)} request, " : ""; + + private string ReqArgs(ActionSpec actionSpec, string reqVar) => actionSpec.RequestSchema != null ? $"{reqVar}.Request!, {reqVar}.RequestMetadata!" : $"{reqVar}.RequestMetadata!"; + + private string CallAsyncType(ActionSpec actionSpec) => $"RpcCallAsync<{this.SchemaType(actionSpec.NormalResultSchema ?? actionSpec.ResponseSchema, actionSpec.SerializerEmptyType)}>"; + + private string CallAsyncType(PropertySpec propSpec) => $"RpcCallAsync<{this.SchemaType(propSpec.PropSchema, propSpec.ReadSerializerEmptyType)}>"; + + private string IntMethod(ActionSpec actionSpec) => actionSpec.ErrorResultName != null ? actionSpec.Name.GetMethodName(TargetLanguage.CSharp, "int") : $"{actionSpec.Invoker.GetVariableName(TargetLanguage.CSharp)}.InvokeCommandAsync"; + + private string IntReadMethod(PropertySpec propSpec) => propSpec.ReadErrorName != null ? propSpec.Name.GetMethodName(TargetLanguage.CSharp, "int", prefix: "read") : $"{propSpec.Name.GetVariableName(TargetLanguage.CSharp, "read", "requester")}.InvokeCommandAsync"; + + private string IntWriteMethod(PropertySpec propSpec) => propSpec.WriteErrorName != null ? propSpec.Name.GetMethodName(TargetLanguage.CSharp, "int", prefix: "write") : $"{propSpec.Name.GetVariableName(TargetLanguage.CSharp, "write", "requester")}.InvokeCommandAsync"; + + private string SchemaType(ITypeName schema, EmptyTypeName emptyType) => schema?.GetTypeName(TargetLanguage.CSharp) ?? emptyType.GetTypeName(TargetLanguage.CSharp); + + private string ExecParam(ActionSpec actionSpec) => actionSpec.DoesTargetExecutor ? "string executorId, " : ""; + + private string ReadMaintParam(PropertySpec propSpec) => propSpec.DoesReadTargetMaintainer ? "string maintainerId, " : ""; + + private string WriteMaintParam(PropertySpec propSpec) => propSpec.DoesWriteTargetMaintainer ? "string maintainerId, " : ""; + + private bool IsLast(ActionSpec actionSpec) => actionSpec.Name.AsGiven == this.actionSpecs.Last().Name.AsGiven && !this.propSpecs.Any(); + + private bool IsLast(PropertySpec propSpec) => propSpec.Name == null || propSpec.Name.AsGiven == this.propSpecs.Last().Name.AsGiven; + + private bool IsLast(EventSpec telemEnvoyInfo) => telemEnvoyInfo.Name.AsGiven == this.eventSpec.Last().Name.AsGiven; + + private string TelemMethodName(EventSpec telemEnvoyInfo, string prefix, string suffix = null) => ((telemEnvoyInfo.Schema is RawTypeName || telemEnvoyInfo.Schema is CustomTypeName) ? telemEnvoyInfo.Name : new CodeName()).GetMethodName(TargetLanguage.CSharp, "telemetry", suffix, prefix: prefix); + + private string GetInfoName(CodeName infoName) => infoName?.GetVariableName(TargetLanguage.CSharp) ?? "errorPayload"; + + private string GetInfoSchema(CodeName infoSchema) => infoSchema?.GetTypeName(TargetLanguage.CSharp) ?? "string"; + + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class DotNetServiceBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutor.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutor.cs new file mode 100644 index 0000000000..3dcb28ab6c --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutor.cs @@ -0,0 +1,510 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class RustCommandExecutor : RustCommandExecutorBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write(@"; DO NOT EDIT. */ + +use std::collections::HashMap; + +use azure_iot_operations_mqtt::interface::ManagedClient; +use azure_iot_operations_protocol::application::ApplicationContext; +use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; +"); + if (this.respSchema != null) { + this.Write("use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize;\r\n" + + ""); + } + this.Write("use azure_iot_operations_protocol::rpc_command;\r\n\r\n"); + if (this.reqSchema is CustomTypeName || this.respSchema is CustomTypeName) { + this.Write("use super::super::common_types::custom_payload::CustomPayload;\r\n"); + } + if (this.reqSchema == null || this.respSchema == null) { + this.Write("use super::super::common_types::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.serializerEmptyType.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.serializerEmptyType.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + } + this.Write("use super::super::common_types::options::CommandExecutorOptions;\r\n"); + if (this.reqSchema is CodeName) { + this.Write("use super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.reqSchema.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.reqSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + } + if (this.respSchema is CodeName) { + this.Write("use super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.respSchema.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.respSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + } + if (this.errorResultName != null) { + this.Write("use super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.normalResultSchema.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.normalResultSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\nuse super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorResultSchema.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorResultSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + } + this.Write("\r\npub type "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.GetTypeName(TargetLanguage.Rust, "request"))); + this.Write(" =\r\n rpc_command::executor::Request<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.RequestType())); + this.Write(", "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.ResponseType())); + this.Write(">;\r\npub type "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.GetTypeName(TargetLanguage.Rust, "response"))); + this.Write(" = rpc_command::executor::Response<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.ResponseType())); + this.Write(">;\r\npub type "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.GetTypeName(TargetLanguage.Rust, "response", "builder", "error"))); + this.Write(" = rpc_command::executor::ResponseBuilderError;\r\n\r\n/// Builder for [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.GetTypeName(TargetLanguage.Rust, "response"))); + this.Write("`]\r\n#[derive(Default)]\r\npub struct "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.GetTypeName(TargetLanguage.Rust, "response", "builder"))); + this.Write(" {\r\n inner_builder: rpc_command::executor::ResponseBuilder<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.ResponseType())); + this.Write(">,\r\n}\r\n\r\nimpl "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.GetTypeName(TargetLanguage.Rust, "response", "builder"))); + this.Write(" {\r\n /// Custom user data to set on the response\r\n pub fn custom_user_data(" + + "&mut self, custom_user_data: Vec<(String, String)>) -> &mut Self {\r\n self" + + ".inner_builder.custom_user_data(custom_user_data);\r\n self\r\n }\r\n\r\n"); + if (this.respSchema != null) { + this.Write(" /// Payload of the response\r\n ///\r\n /// # Errors\r\n /// If the payloa" + + "d cannot be serialized\r\n pub fn payload(\r\n &mut self,\r\n payload" + + ": "); + this.Write(this.ToStringHelper.ToStringWithCulture((this.normalResultSchema ?? this.respSchema).GetTypeName(TargetLanguage.Rust))); + this.Write(",\r\n ) -> Result<&mut Self, AIOProtocolError> {\r\n"); + if (this.errorResultName != null) { + this.Write(" self.inner_builder.payload("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.respSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(" {\r\n"); + foreach (CodeName normalResultField in this.normalResultFields) { + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(normalResultField.GetFieldName(TargetLanguage.Rust))); + this.Write(": "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.CondSome($"payload.{normalResultField.GetFieldName(TargetLanguage.Rust)}", this.normalRequiredFields.Contains(normalResultField)))); + this.Write(",\r\n"); + } + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorResultName.GetFieldName(TargetLanguage.Rust))); + this.Write(": None,\r\n })?;\r\n"); + } else { + this.Write(" self.inner_builder.payload(payload)?;\r\n"); + } + this.Write(" Ok(self)\r\n }\r\n\r\n"); + if (this.errorResultName != null) { + this.Write(" pub fn error(&mut self, error: "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorResultSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(") -> Result<&mut Self, AIOProtocolError> {\r\n self.inner_builder.payload("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.respSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(" {\r\n"); + foreach (CodeName normalResultField in this.normalResultFields) { + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(normalResultField.GetFieldName(TargetLanguage.Rust))); + this.Write(": None,\r\n"); + } + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorResultName.GetFieldName(TargetLanguage.Rust))); + this.Write(": Some(error),\r\n })?;\r\n Ok(self)\r\n }\r\n\r\n"); + } + } + this.Write(" /// Builds a new `"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.GetTypeName(TargetLanguage.Rust, "response"))); + this.Write("`\r\n ///\r\n /// # Errors\r\n /// If a required field has not been initialize" + + "d\r\n #[allow(clippy::missing_panics_doc)] // The panic is not possible\r\n pu" + + "b fn build(&mut self) -> Result<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.GetTypeName(TargetLanguage.Rust, "response"))); + this.Write(", "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.GetTypeName(TargetLanguage.Rust, "response", "builder", "error"))); + this.Write("> {\r\n"); + if (this.respSchema == null) { + this.Write(" self.inner_builder.payload("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.serializerEmptyType.GetAllocator(TargetLanguage.Rust))); + this.Write(").unwrap();\r\n\r\n"); + } + this.Write(" self.inner_builder.build()\r\n }\r\n}\r\n\r\n/// Command Executor for `"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.AsGiven)); + this.Write("`\r\npub struct "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); + this.Write("(\r\n rpc_command::Executor<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.RequestType())); + this.Write(", "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.ResponseType())); + this.Write(", C>,\r\n)\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::Pu" + + "bReceiver: Send + Sync + \'static;\r\n\r\nimpl "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); + this.Write("\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::PubRece" + + "iver: Send + Sync + \'static,\r\n{\r\n /// Creates a new [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); + this.Write(@"`] + /// + /// # Panics + /// If the DTDL that generated this code was invalid + pub fn new(application_context: ApplicationContext, client: C, options: &CommandExecutorOptions) -> Self { + let mut executor_options_builder = rpc_command::executor::OptionsBuilder::default(); + if let Some(topic_namespace) = &options.topic_namespace { + executor_options_builder.topic_namespace(topic_namespace.clone()); + } + + let mut topic_token_map: HashMap = options + .topic_token_map + .clone() + .into_iter() + .map(|(k, v)| (format!(""ex:{k}""), v)) + .collect(); + + topic_token_map.insert("""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.ActionExecutorId)); + this.Write("\".to_string(), client.client_id().to_string());\r\n\r\n let executor_options =" + + " executor_options_builder\r\n .request_topic_pattern(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.topicPattern)); + this.Write("\")\r\n .command_name(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.AsGiven)); + this.Write("\")\r\n .is_idempotent("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.isIdempotent ? "true" : "false")); + this.Write(")\r\n .topic_token_map(topic_token_map)\r\n"); + if (this.serviceGroupId != null) { + this.Write(" .service_group_id(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.serviceGroupId)); + this.Write("\".to_string())\r\n"); + } + this.Write(@" .build() + .expect(""DTDL schema generated invalid arguments""); + + Self( + rpc_command::Executor::new(application_context, client, executor_options) + .expect(""DTDL schema generated invalid arguments""), + ) + } + + /// Receive the next [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.GetTypeName(TargetLanguage.Rust, "request"))); + this.Write("`] or [`None`] if there will be no more requests\r\n ///\r\n /// # Errors\r\n " + + "/// [`AIOProtocolError`] if there is a failure receiving a request\r\n pub asyn" + + "c fn recv(&mut self) -> Option> {\r\n self.0.recv().await\r\n }\r\n\r\n /// Shutdown th" + + "e [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); + this.Write(@"`]. Unsubscribes from the request topic. + /// + /// Returns Ok(()) on success, otherwise returns [`AIOProtocolError`]. + /// # Errors + /// [`AIOProtocolError`] of kind [`ClientError`](azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolErrorKind::ClientError) if the unsubscribe fails or if the unsuback reason code doesn't indicate success. + pub async fn shutdown(&mut self) -> Result<(), AIOProtocolError> { + self.0.shutdown().await + } +} +"); + return this.GenerationEnvironment.ToString(); + } + + private string RequestType() => this.reqSchema?.GetTypeName(TargetLanguage.Rust) ?? this.serializerEmptyType.GetTypeName(TargetLanguage.Rust); + + private string ResponseType() => this.respSchema?.GetTypeName(TargetLanguage.Rust) ?? this.serializerEmptyType.GetTypeName(TargetLanguage.Rust); + + private string CondSome(string expr, bool doWrap) => doWrap ? $"Some({expr})" : expr; + + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class RustCommandExecutorBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutorHeaders.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutorHeaders.cs new file mode 100644 index 0000000000..1cf45b3c89 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutorHeaders.cs @@ -0,0 +1,353 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Collections.Generic; + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class RustCommandExecutorHeaders : RustCommandExecutorHeadersBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("; DO NOT EDIT. */\r\n\r\nuse azure_iot_operations_mqtt::interface::ManagedClient;\r\nus" + + "e serde_json;\r\n\r\nuse super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorCodeSchema.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorCodeSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + if (this.errorInfoSchema != null) { + this.Write("use super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorInfoSchema.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorInfoSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + } + this.Write("pub use super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n\r\nuse azure_iot_operations_protocol::rpc_command::executor;\r\n\r\nimpl "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); + this.Write("\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::PubRece" + + "iver: Send + Sync + \'static,\r\n{\r\n pub fn application_error_headers(\r\n " + + "custom_user_data: &mut Vec<(String, String)>,\r\n "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorCodeName.GetVariableName(TargetLanguage.Rust))); + this.Write(": "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorCodeSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(",\r\n "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorInfoName?.GetVariableName(TargetLanguage.Rust) ?? "error_payload")); + this.Write(": "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorInfoSchema?.GetTypeName(TargetLanguage.Rust) ?? "String")); + this.Write(",\r\n ) -> Result<(), String> {\r\n let error_code = match "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorCodeName.GetVariableName(TargetLanguage.Rust))); + this.Write(" {\r\n"); + foreach (string codeValue in this.errorCodeValues) { + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorCodeSchema.GetTypeName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(codeValue)); + this.Write(" => \""); + this.Write(this.ToStringHelper.ToStringWithCulture(codeValue)); + this.Write("\".to_string(),\r\n"); + } + this.Write(" };\r\n\r\n"); + if (this.errorInfoSchema != null) { + this.Write(" let error_payload = serde_json::to_string(&"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorInfoName.GetVariableName(TargetLanguage.Rust))); + this.Write(").unwrap_or_default();\r\n\r\n"); + } + this.Write(" executor::application_error_headers(custom_user_data, error_code, error_p" + + "ayload)\r\n }\r\n}\r\n"); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class RustCommandExecutorHeadersBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.cs new file mode 100644 index 0000000000..0728bec853 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.cs @@ -0,0 +1,613 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Linq; + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class RustCommandInvoker : RustCommandInvokerBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("; DO NOT EDIT. */\r\n\r\nuse std::collections::HashMap;\r\n"); + if (this.errorResultName != null) { + this.Write("use std::error::Error;\r\n"); + } + this.Write("use std::time::Duration;\r\n\r\nuse azure_iot_operations_mqtt::interface::ManagedClie" + + "nt;\r\nuse azure_iot_operations_protocol::application::ApplicationContext;\r\nuse az" + + "ure_iot_operations_protocol::common::aio_protocol_error::{\r\n AIOProtocolError" + + ",\r\n"); + if (this.errorResultName != null) { + this.Write(" AIOProtocolErrorKind,\r\n"); + } + this.Write("};\r\n"); + if (this.reqSchema != null) { + this.Write("use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize;\r\n" + + ""); + } + this.Write("use azure_iot_operations_protocol::rpc_command;\r\n\r\n"); + if (this.reqSchema is CustomTypeName || this.respSchema is CustomTypeName) { + this.Write("use super::super::common_types::custom_payload::CustomPayload;\r\n"); + } + if (this.reqSchema == null || this.respSchema == null) { + this.Write("use super::super::common_types::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.serializerEmptyType.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.serializerEmptyType.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + } + this.Write("use super::super::common_types::options::CommandInvokerOptions;\r\n"); + if (this.reqSchema is CodeName) { + this.Write("use super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.reqSchema.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.reqSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + } + if (this.respSchema is CodeName) { + this.Write("use super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.respSchema.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.respSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + } + if (this.errorResultName != null) { + this.Write("use super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.normalResultSchema.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.normalResultSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\nuse super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorResultSchema.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorResultSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + } + this.Write("\r\npub type "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.GetTypeName(TargetLanguage.Rust, "request"))); + this.Write(" = rpc_command::invoker::Request<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.RequestType())); + this.Write(">;\r\npub type "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.GetTypeName(TargetLanguage.Rust, "response"))); + this.Write(" = rpc_command::invoker::Response<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.InternalResponseType())); + this.Write(">;\r\n"); + if (this.errorResultSchema != null) { + this.Write("pub type "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.GetTypeName(TargetLanguage.Rust, "response", "error"))); + this.Write(" = rpc_command::invoker::Response<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorResultSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(">;\r\n"); + } + this.Write("pub type "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.GetTypeName(TargetLanguage.Rust, "request", "builder", "error"))); + this.Write(" = rpc_command::invoker::RequestBuilderError;\r\n\r\n#[derive(Default)]\r\n/// Builder " + + "for [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.GetTypeName(TargetLanguage.Rust, "request"))); + this.Write("`]\r\npub struct "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.GetTypeName(TargetLanguage.Rust, "request", "builder"))); + this.Write(" {\r\n inner_builder: rpc_command::invoker::RequestBuilder<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.RequestType())); + this.Write(">,\r\n"); + if (this.doesCommandTargetExecutor) { + this.Write(" set_executor_id: bool,\r\n"); + } + this.Write(" topic_tokens: HashMap,\r\n}\r\n\r\nimpl "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.GetTypeName(TargetLanguage.Rust, "request", "builder"))); + this.Write(@" { + /// Custom user data to set on the request + pub fn custom_user_data(&mut self, custom_user_data: Vec<(String, String)>) -> &mut Self { + self.inner_builder.custom_user_data(custom_user_data); + self + } + + /// Topic token keys/values to be replaced into the publish topic of the request message. + /// A prefix of ""ex:"" will be prepended to each key before scanning the topic pattern. + /// Thus, only tokens of the form `{ex:SOMEKEY}` will be replaced. + pub fn topic_tokens(&mut self, topic_tokens: HashMap) -> &mut Self { + for (k, v) in topic_tokens { + self.topic_tokens.insert(format!(""ex:{k}""), v); + } + self + } + + /// Timeout for the request + pub fn timeout(&mut self, timeout: Duration) -> &mut Self { + self.inner_builder.timeout(timeout); + self + } + +"); + if (this.doesCommandTargetExecutor) { + this.Write(@" /// Target executor ID + pub fn executor_id(&mut self, executor_id: &str) -> &mut Self { + self.topic_tokens + .insert(""executorId"".to_string(), executor_id.to_string()); + self.set_executor_id = true; + self + } + +"); + } + if (this.reqSchema != null) { + this.Write(" /// Payload of the request\r\n ///\r\n /// # Errors\r\n /// If the payload" + + " cannot be serialized\r\n pub fn payload(\r\n &mut self,\r\n payload:" + + " "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.reqSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(",\r\n ) -> Result<&mut Self, AIOProtocolError> {\r\n self.inner_builder.pay" + + "load(payload)?;\r\n Ok(self)\r\n }\r\n\r\n"); + } + this.Write(" /// Builds a new `"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.GetTypeName(TargetLanguage.Rust, "request"))); + this.Write("`\r\n ///\r\n /// # Errors\r\n /// If a required field has not been initialize" + + "d\r\n #[allow(clippy::missing_panics_doc)] // The panic is not possible\r\n pu" + + "b fn build(&mut self) -> Result<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.GetTypeName(TargetLanguage.Rust, "request"))); + this.Write(", "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.GetTypeName(TargetLanguage.Rust, "request", "builder", "error"))); + this.Write("> {\r\n"); + if (this.doesCommandTargetExecutor) { + this.Write(" if !self.set_executor_id {\r\n return Err("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.GetTypeName(TargetLanguage.Rust, "request", "builder", "error"))); + this.Write("::UninitializedField(\r\n \"executor_id\",\r\n ));\r\n }" + + "\r\n\r\n"); + } + if (this.reqSchema == null) { + this.Write(" self.inner_builder.payload("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.serializerEmptyType.GetAllocator(TargetLanguage.Rust))); + this.Write(").unwrap();\r\n\r\n"); + } + this.Write(" self.inner_builder.topic_tokens(self.topic_tokens.clone());\r\n\r\n se" + + "lf.inner_builder.build()\r\n }\r\n}\r\n\r\n/// Command Invoker for `"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.AsGiven)); + this.Write("`\r\npub struct "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); + this.Write("(\r\n rpc_command::Invoker<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.RequestType())); + this.Write(", "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.ExternalResponseType())); + this.Write(", C>,\r\n)\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::Pu" + + "bReceiver: Send + Sync + \'static;\r\n\r\nimpl "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); + this.Write("\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::PubRece" + + "iver: Send + Sync + \'static,\r\n{\r\n /// Creates a new [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); + this.Write(@"`] + /// + /// # Panics + /// If the DTDL that generated this code was invalid + pub fn new(application_context: ApplicationContext, client: C, options: &CommandInvokerOptions) -> Self { + let mut invoker_options_builder = rpc_command::invoker::OptionsBuilder::default(); + if let Some(topic_namespace) = &options.topic_namespace { + invoker_options_builder.topic_namespace(topic_namespace.clone()); + } + + let mut topic_token_map: HashMap = options + .topic_token_map + .clone() + .into_iter() + .map(|(k, v)| (format!(""ex:{k}""), v)) + .collect(); + + topic_token_map.insert("""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.ActionInvokerId)); + this.Write("\".to_string(), client.client_id().to_string());\r\n\r\n let invoker_options = " + + "invoker_options_builder\r\n .request_topic_pattern(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.topicPattern)); + this.Write("\")\r\n .command_name(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.AsGiven)); + this.Write(@""") + .topic_token_map(topic_token_map) + .response_topic_prefix(options.response_topic_prefix.clone()) + .response_topic_suffix(options.response_topic_suffix.clone()) + .build() + .expect(""DTDL schema generated invalid arguments""); + + Self( + rpc_command::Invoker::new(application_context, client, invoker_options) + .expect(""DTDL schema generated invalid arguments""), + ) + } + + /// Invokes the [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.GetTypeName(TargetLanguage.Rust, "request"))); + this.Write("`]\r\n ///\r\n /// # Errors\r\n /// [`AIOProtocolError`] if there is a failure" + + " invoking the request\r\n pub async fn invoke(\r\n &self,\r\n request" + + ": "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.GetTypeName(TargetLanguage.Rust, "request"))); + this.Write(",\r\n"); + if (this.errorResultName != null) { + this.Write(" ) -> Result, AIOProtocolError> {\r\n let response = self.0.invoke(request).await;\r\n " + + " match response {\r\n Ok(response) => {\r\n if let Som" + + "e("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorResultName.GetVariableName(TargetLanguage.Rust))); + this.Write(") = response.payload."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorResultName.GetFieldName(TargetLanguage.Rust))); + this.Write(" {\r\n Ok(Err("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.GetTypeName(TargetLanguage.Rust, "response", "error"))); + this.Write(" {\r\n payload: "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorResultName.GetVariableName(TargetLanguage.Rust))); + this.Write(@", + content_type: response.content_type, + format_indicator: response.format_indicator, + custom_user_data: response.custom_user_data, + timestamp: response.timestamp, + executor_id: response.executor_id, + })) + } else { + Ok(Ok("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.GetTypeName(TargetLanguage.Rust, "response"))); + this.Write(" {\r\n payload: "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.normalResultSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(" {\r\n"); + foreach (CodeName normalResultField in this.normalResultFields) { + if (this.normalRequiredFields.Contains(normalResultField)) { + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(normalResultField.GetFieldName(TargetLanguage.Rust))); + this.Write(": response.payload."); + this.Write(this.ToStringHelper.ToStringWithCulture(normalResultField.GetFieldName(TargetLanguage.Rust))); + this.Write(".ok_or("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); + this.Write("::::get_err(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(normalResultField.AsGiven)); + this.Write("\"))?,\r\n"); + } else { + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(normalResultField.GetFieldName(TargetLanguage.Rust))); + this.Write(": response.payload."); + this.Write(this.ToStringHelper.ToStringWithCulture(normalResultField.GetFieldName(TargetLanguage.Rust))); + this.Write(",\r\n"); + } + } + this.Write(@" }, + content_type: response.content_type, + format_indicator: response.format_indicator, + custom_user_data: response.custom_user_data, + timestamp: response.timestamp, + executor_id: response.executor_id, + })) + } + } + Err(err) => Err(err), + } +"); + } else { + this.Write(" ) -> Result<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.GetTypeName(TargetLanguage.Rust, "response"))); + this.Write(", AIOProtocolError> {\r\n self.0.invoke(request).await\r\n"); + } + this.Write(" }\r\n\r\n /// Shutdown the [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); + this.Write(@"`]. Unsubscribes from the response topic and cancels the receiver loop to drop the receiver and to prevent the task from looping indefinitely. + /// + /// Returns Ok(()) on success, otherwise returns [`AIOProtocolError`]. + /// # Errors + /// [`AIOProtocolError`] of kind [`ClientError`](azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolErrorKind::ClientError) if the unsubscribe fails or if the unsuback reason code doesn't indicate success. + pub async fn shutdown(&self) -> Result<(), AIOProtocolError> { + self.0.shutdown().await + } +"); + if (this.errorResultName != null && this.normalRequiredFields.Any()) { + this.Write(@" + fn get_err(field_name: &str) -> AIOProtocolError { + AIOProtocolError { + message: Some(format!(""Command response missing field {field_name}"")), + kind: AIOProtocolErrorKind::PayloadInvalid, + is_shallow: false, + is_remote: false, + nested_error: None, + header_name: None, + header_value: None, + timeout_name: None, + timeout_value: None, + property_name: None, + property_value: None, + command_name: Some("""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.AsGiven)); + this.Write("\".to_string()),\r\n protocol_version: None,\r\n supported_proto" + + "col_major_versions: None,\r\n }\r\n }\r\n"); + } + this.Write("}\r\n"); + return this.GenerationEnvironment.ToString(); + } + + private string RequestType() => this.reqSchema?.GetTypeName(TargetLanguage.Rust) ?? this.serializerEmptyType.GetTypeName(TargetLanguage.Rust); + + private string ExternalResponseType() => this.respSchema?.GetTypeName(TargetLanguage.Rust) ?? this.serializerEmptyType.GetTypeName(TargetLanguage.Rust); + + private string InternalResponseType() => (this.normalResultSchema ?? this.respSchema)?.GetTypeName(TargetLanguage.Rust) ?? this.serializerEmptyType.GetTypeName(TargetLanguage.Rust); + + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class RustCommandInvokerBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvokerHeaders.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvokerHeaders.cs new file mode 100644 index 0000000000..d3ccb4397d --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvokerHeaders.cs @@ -0,0 +1,356 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Collections.Generic; + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class RustCommandInvokerHeaders : RustCommandInvokerHeadersBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("; DO NOT EDIT. */\r\n\r\nuse azure_iot_operations_mqtt::interface::ManagedClient;\r\nus" + + "e serde_json;\r\n\r\n"); + if (this.errorInfoSchema != null) { + this.Write("use super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorInfoSchema.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorInfoSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + } + this.Write("use super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorCodeSchema.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorCodeSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\npub use super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n\r\nuse azure_iot_operations_protocol::rpc_command::invoker;\r\n\r\nimpl "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); + this.Write("\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::PubRece" + + "iver: Send + Sync + \'static,\r\n{\r\n pub fn application_error_headers(\r\n " + + "custom_user_data: &Vec<(String, String)>,\r\n ) -> (Option<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorCodeSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(">, Option<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorInfoSchema?.GetTypeName(TargetLanguage.Rust) ?? "String")); + this.Write(">) {\r\n let (error_code, error_payload) = invoker::application_error_header" + + "s(custom_user_data);\r\n\r\n let "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorCodeName.GetVariableName(TargetLanguage.Rust))); + this.Write(" = match error_code.as_deref() {\r\n"); + foreach (string codeValue in this.errorCodeValues) { + this.Write(" Some(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(codeValue)); + this.Write("\") => Some("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorCodeSchema.GetTypeName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(codeValue)); + this.Write("),\r\n"); + } + this.Write(" Some(_) => None,\r\n None => None,\r\n };\r\n\r\n"); + if (this.errorInfoSchema != null) { + this.Write(" let "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorInfoName.GetVariableName(TargetLanguage.Rust))); + this.Write(" = if let Some(error_payload) = error_payload {\r\n serde_json::from_str" + + "::<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorInfoSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(">(&error_payload).ok()\r\n } else {\r\n None\r\n };\r\n\r\n"); + } + this.Write(" ("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorCodeName.GetVariableName(TargetLanguage.Rust))); + this.Write(", "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorInfoName?.GetVariableName(TargetLanguage.Rust) ?? "error_payload")); + this.Write(")\r\n }\r\n}\r\n\r\n"); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class RustCommandInvokerHeadersBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Constants/t4/RustConstants.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Constants/t4/RustConstants.cs new file mode 100644 index 0000000000..012d43b69b --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Constants/t4/RustConstants.cs @@ -0,0 +1,325 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Collections.Generic; + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class RustConstants : RustConstantsBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("; DO NOT EDIT. */\r\n"); + if (this.constantSpec.Description != null) { + this.Write("\r\n// "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.constantSpec.Description)); + this.Write("\r\n"); + } + foreach (KeyValuePair constant in this.constantSpec.Constants) { + this.Write("\r\n"); + if (constant.Value.Description != null) { + this.Write("/// "); + this.Write(this.ToStringHelper.ToStringWithCulture(constant.Value.Description)); + this.Write("\r\n"); + } + this.Write("pub const "); + this.Write(this.ToStringHelper.ToStringWithCulture(constant.Key.GetConstantName(TargetLanguage.Rust))); + this.Write(": "); + this.Write(this.ToStringHelper.ToStringWithCulture(GetRustType(constant.Value.Type))); + this.Write(" = "); + this.Write(this.ToStringHelper.ToStringWithCulture(GetRustValue(constant.Value.Value))); + this.Write(";\r\n"); + } + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class RustConstantsBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Error/t4/RustAggregateError.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Error/t4/RustAggregateError.cs new file mode 100644 index 0000000000..d8754f7202 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Error/t4/RustAggregateError.cs @@ -0,0 +1,338 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class RustAggregateError : RustAggregateErrorBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("; DO NOT EDIT. */\r\n\r\nuse std::error::Error;\r\nuse std::fmt;\r\n\r\nuse super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n\r\nimpl fmt::Display for "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetTypeName(TargetLanguage.Rust))); + this.Write(" {\r\n fn fmt(&self, f: &mut fmt::Formatter<\'_>) -> fmt::Result {\r\n let m" + + "ut err_count = 0;\r\n\r\n"); + foreach (var innerNameSchema in this.innerNameSchemas) { + this.Write("\r\n if let Some("); + this.Write(this.ToStringHelper.ToStringWithCulture(innerNameSchema.Item1.GetFieldName(TargetLanguage.Rust))); + this.Write(") = &self."); + this.Write(this.ToStringHelper.ToStringWithCulture(innerNameSchema.Item1.GetFieldName(TargetLanguage.Rust))); + this.Write(" {\r\n if err_count == 0 {\r\n return write!(f, \"{"); + this.Write(this.ToStringHelper.ToStringWithCulture(innerNameSchema.Item1.GetFieldName(TargetLanguage.Rust))); + this.Write("}\");\r\n }\r\n err_count += 1;\r\n }\r\n"); + } + this.Write(@" + // Error display message depends on how many specific errors are reported within the aggregate error. + // If there are none, the aggregate error must have been caused by one or more non-reportable errors. + // If there is exactly one, it has already been displayed. + // If there are two or more, only the first reported error has been displayed, so indicate how many more there are. + match err_count{ + 0 => write!(f, ""No reportable property errors.""), + 1 => Ok(()), + 2 => write!(f, ""(And 1 more reported error.)""), + _ => write!(f, ""(And {} more reported errors.)"", err_count - 1), + } + } +} + +impl Error for "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetTypeName(TargetLanguage.Rust))); + this.Write(" {\r\n fn source(&self) -> Option<&(dyn Error + \'static)> {\r\n None\r\n }" + + "\r\n}\r\n"); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class RustAggregateErrorBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Error/t4/RustError.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Error/t4/RustError.cs new file mode 100644 index 0000000000..4b37c80c3c --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Error/t4/RustError.cs @@ -0,0 +1,332 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class RustError : RustErrorBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("; DO NOT EDIT. */\r\n\r\nuse std::error::Error;\r\nuse std::fmt;\r\n\r\nuse super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n\r\nimpl fmt::Display for "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetTypeName(TargetLanguage.Rust))); + this.Write(" {\r\n fn fmt(&self, f: &mut fmt::Formatter<\'_>) -> fmt::Result {\r\n"); + if (this.messageField != null) { + if (this.messageIsRequired) { + this.Write(" write!(f, \"{}\", self."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.messageField.GetFieldName(TargetLanguage.Rust))); + this.Write(")\r\n"); + } else { + this.Write(" if let Some(message) = &self."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.messageField.GetFieldName(TargetLanguage.Rust))); + this.Write(" {\r\n write!(f, \"{message}\")\r\n } else {\r\n write!(f, \"" + + ""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.description)); + this.Write("\")\r\n }\r\n"); + } + } else { + this.Write(" write!(f, \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.description)); + this.Write("\")\r\n"); + } + this.Write(" }\r\n}\r\n\r\nimpl Error for "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName.GetTypeName(TargetLanguage.Rust))); + this.Write(" {\r\n fn source(&self) -> Option<&(dyn Error + \'static)> {\r\n None\r\n }" + + "\r\n}\r\n"); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class RustErrorBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.cs new file mode 100644 index 0000000000..79302222f8 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.cs @@ -0,0 +1,388 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class RustTelemetryReceiver : RustTelemetryReceiverBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write(@"; DO NOT EDIT. */ + +use std::collections::HashMap; + +use azure_iot_operations_mqtt::interface::{AckToken, ManagedClient}; +use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; +use azure_iot_operations_protocol::telemetry; +use azure_iot_operations_protocol::application::ApplicationContext; + +"); + if (this.schemaType is CodeName) { + this.Write("use super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaType.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaType.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + } + if (this.schemaType is CustomTypeName) { + this.Write("use super::super::common_types::custom_payload::CustomPayload;\r\n"); + } + this.Write("use super::super::common_types::options::TelemetryReceiverOptions;\r\n\r\npub type "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.messageName.GetTypeName(TargetLanguage.Rust))); + this.Write(" = telemetry::receiver::Message<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaType.GetTypeName(TargetLanguage.Rust))); + this.Write(">;\r\n\r\n/// Telemetry Receiver for `"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaType.GetTypeName(TargetLanguage.Rust))); + this.Write("`\r\npub struct "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); + this.Write("(\r\n telemetry::Receiver<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaType.GetTypeName(TargetLanguage.Rust))); + this.Write(", C>,\r\n)\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::Pu" + + "bReceiver: Send + Sync + \'static;\r\n\r\nimpl "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); + this.Write("\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::PubRece" + + "iver: Send + Sync + \'static,\r\n{\r\n /// Creates a new [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); + this.Write(@"`] + /// + /// # Panics + /// If the DTDL that generated this code was invalid + pub fn new(application_context: ApplicationContext, client: C, options: &TelemetryReceiverOptions) -> Self { + let mut receiver_options_builder = telemetry::receiver::OptionsBuilder::default(); + if let Some(topic_namespace) = &options.topic_namespace { + receiver_options_builder.topic_namespace(topic_namespace.clone()); + } + + let mut topic_token_map: HashMap = options + .topic_token_map + .clone() + .into_iter() + .map(|(k, v)| (format!(""ex:{k}""), v)) + .collect(); + + let receiver_options = receiver_options_builder + .topic_pattern("""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.topicPattern)); + this.Write("\")\r\n .topic_token_map(topic_token_map)\r\n .auto_ack(options." + + "auto_ack)\r\n"); + if (this.serviceGroupId != null) { + this.Write(" .service_group_id(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.serviceGroupId)); + this.Write("\".to_string())\r\n"); + } + this.Write(@" .build() + .expect(""DTDL schema generated invalid arguments""); + + Self( + telemetry::Receiver::new(application_context, client, receiver_options) + .expect(""DTDL schema generated invalid arguments""), + ) + } + + /// Shut down the [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); + this.Write("`]\r\n ///\r\n /// # Errors\r\n /// [`AIOProtocolError`] if there is a failure" + + " in graceful shutdown\r\n pub async fn shutdown(&mut self) -> Result<(), AIOPro" + + "tocolError> {\r\n self.0.shutdown().await\r\n }\r\n\r\n /// Receive the nex" + + "t [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.messageName.GetTypeName(TargetLanguage.Rust))); + this.Write("`]\r\n ///\r\n /// # Errors\r\n /// [`AIOProtocolError`] if there is a failure" + + " receiving a message\r\n pub async fn recv(\r\n &mut self,\r\n ) -> Optio" + + "n), AIOProtocolError>> {\r\n self.0.recv().await\r\n }\r\n}\r" + + "\n"); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class RustTelemetryReceiverBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.cs new file mode 100644 index 0000000000..c9c6628692 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.cs @@ -0,0 +1,421 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class RustTelemetrySender : RustTelemetrySenderBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write(@"; DO NOT EDIT. */ + +use std::collections::HashMap; +use std::time::Duration; + +use azure_iot_operations_mqtt::control_packet::QoS; +use azure_iot_operations_mqtt::interface::ManagedClient; +use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; +use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; +use azure_iot_operations_protocol::telemetry; +use azure_iot_operations_protocol::application::ApplicationContext; + +"); + if (this.schemaType is CodeName) { + this.Write("use super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaType.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaType.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + } + if (this.schemaType is CustomTypeName) { + this.Write("use super::super::common_types::custom_payload::CustomPayload;\r\n"); + } + this.Write("use super::super::common_types::options::TelemetrySenderOptions;\r\n\r\npub type "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.messageName.GetTypeName(TargetLanguage.Rust))); + this.Write(" = telemetry::sender::Message<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaType.GetTypeName(TargetLanguage.Rust))); + this.Write(">;\r\npub type "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.messageName.GetTypeName(TargetLanguage.Rust))); + this.Write("BuilderError = telemetry::sender::MessageBuilderError;\r\n\r\n/// Builder for [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.messageName.GetTypeName(TargetLanguage.Rust))); + this.Write("`]\r\n#[derive(Default)]\r\npub struct "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.messageName.GetTypeName(TargetLanguage.Rust))); + this.Write("Builder {\r\n inner_builder: telemetry::sender::MessageBuilder<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaType.GetTypeName(TargetLanguage.Rust))); + this.Write(">,\r\n topic_tokens: HashMap,\r\n}\r\n\r\nimpl "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.messageName.GetTypeName(TargetLanguage.Rust))); + this.Write("Builder {\r\n /// Quality of Service of the telemetry message. Can only be `AtMo" + + "stOnce` or `AtLeastOnce`.\r\n pub fn qos(&mut self, qos: QoS) -> &mut Self {\r\n " + + " self.inner_builder.qos(qos);\r\n self\r\n }\r\n\r\n /// Custom user " + + "data to set on the message\r\n pub fn custom_user_data(&mut self, custom_user_d" + + "ata: Vec<(String, String)>) -> &mut Self {\r\n self.inner_builder.custom_us" + + "er_data(custom_user_data);\r\n self\r\n }\r\n\r\n /// Topic token keys/valu" + + "es to be replaced into the publish topic of the telemetry message.\r\n /// A pr" + + "efix of \"ex:\" will be prepended to each key before scanning the topic pattern.\r\n" + + " /// Thus, only tokens of the form `{ex:SOMEKEY}` will be replaced.\r\n pub " + + "fn topic_tokens(&mut self, topic_tokens: HashMap) -> &mut Self {" + + "\r\n for (k, v) in topic_tokens {\r\n self.topic_tokens.insert(for" + + "mat!(\"ex:{k}\"), v);\r\n }\r\n self\r\n }\r\n\r\n /// Time before messa" + + "ge expires\r\n pub fn message_expiry(&mut self, message_expiry: Duration) -> &m" + + "ut Self {\r\n self.inner_builder.message_expiry(message_expiry);\r\n s" + + "elf\r\n }\r\n\r\n /// Cloud event for the message\r\n pub fn cloud_event(&mut s" + + "elf, cloud_event: Option) -> &mut Self {\r\n " + + " self.inner_builder.cloud_event(cloud_event);\r\n self\r\n }\r\n\r\n /// Pa" + + "yload of the message\r\n ///\r\n /// # Errors\r\n /// If the payload cannot b" + + "e serialized\r\n pub fn payload(\r\n &mut self,\r\n payload: "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaType.GetTypeName(TargetLanguage.Rust))); + this.Write(",\r\n ) -> Result<&mut Self, AIOProtocolError> {\r\n self.inner_builder.pay" + + "load(payload)?;\r\n Ok(self)\r\n }\r\n\r\n /// Builds a new `"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.messageName.GetTypeName(TargetLanguage.Rust))); + this.Write("`\r\n ///\r\n /// # Errors\r\n /// If a required field has not been initialize" + + "d\r\n pub fn build(&mut self) -> Result<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.messageName.GetTypeName(TargetLanguage.Rust))); + this.Write(", "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.messageName.GetTypeName(TargetLanguage.Rust))); + this.Write("BuilderError> {\r\n self.inner_builder.topic_tokens(self.topic_tokens.clone(" + + "));\r\n\r\n self.inner_builder.build()\r\n }\r\n}\r\n\r\n/// Telemetry Sender for " + + "`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaType.GetTypeName(TargetLanguage.Rust))); + this.Write("`\r\npub struct "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); + this.Write("(\r\n telemetry::Sender<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaType.GetTypeName(TargetLanguage.Rust))); + this.Write(", C>,\r\n)\r\nwhere\r\n C: ManagedClient + Send + Sync + \'static;\r\n\r\nimpl "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); + this.Write("\r\nwhere\r\n C: ManagedClient + Send + Sync + \'static,\r\n{\r\n /// Creates a n" + + "ew [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); + this.Write(@"`] + /// + /// # Panics + /// If the DTDL that generated this code was invalid + pub fn new(application_context: ApplicationContext, client: C, options: &TelemetrySenderOptions) -> Self { + let mut sender_options_builder = telemetry::sender::OptionsBuilder::default(); + if let Some(topic_namespace) = &options.topic_namespace { + sender_options_builder.topic_namespace(topic_namespace.clone()); + } + + let mut topic_token_map: HashMap = options + .topic_token_map + .clone() + .into_iter() + .map(|(k, v)| (format!(""ex:{k}""), v)) + .collect(); + + topic_token_map.insert("""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.EventSenderId)); + this.Write("\".to_string(), client.client_id().to_string());\r\n\r\n let sender_options = s" + + "ender_options_builder\r\n .topic_pattern(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.topicPattern)); + this.Write(@""") + .topic_token_map(topic_token_map) + .build() + .expect(""DTDL schema generated invalid arguments""); + + Self( + telemetry::Sender::new(application_context, client, sender_options) + .expect(""DTDL schema generated invalid arguments""), + ) + } + + /// Sends a [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.messageName.GetTypeName(TargetLanguage.Rust))); + this.Write("`]\r\n ///\r\n /// # Error\r\n /// [`AIOProtocolError`] if there is a failure " + + "sending the message\r\n pub async fn send(&self, message: "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.messageName.GetTypeName(TargetLanguage.Rust))); + this.Write(") -> Result<(), AIOProtocolError> {\r\n self.0.send(message).await\r\n }\r\n}" + + "\r\n"); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class RustTelemetrySenderBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustCargoToml.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustCargoToml.cs new file mode 100644 index 0000000000..47b90b4880 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustCargoToml.cs @@ -0,0 +1,348 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class RustCargoToml : RustCargoTomlBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + if (this.generateProject) { + this.Write("# Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("; DO NOT EDIT.\r\n\r\n[package]\r\nname = \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.projectName)); + this.Write("\"\r\nversion = \"0.1.0\"\r\nedition = \"2024\"\r\n\r\n"); + } else { + this.Write("# Dependencies for the Generated Libraries\r\n\r\nAdd these dependencies to your proj" + + "ect\'s `Cargo.toml` file:\r\n\r\n``` toml\r\n"); + } + this.Write("[dependencies]\r\nserde = { version = \"1.0\", features = [\"derive\"] }\r\nserde_bytes =" + + " \"0.11.15\"\r\nserde_repr = \"0.1\"\r\n"); + foreach (var packageVersion in this.packageVersions) { + this.Write(this.ToStringHelper.ToStringWithCulture(packageVersion.Item1)); + this.Write(" = \""); + this.Write(this.ToStringHelper.ToStringWithCulture(packageVersion.Item2)); + this.Write("\"\r\n"); + } + this.Write(@"chrono = { version = ""0.4.31"", features = [""serde"", ""alloc""] } +iso8601-duration = { version = ""0.2"", features = [""serde"", ""chrono""] } +base64 = ""0.22.1"" +bigdecimal = ""0.4.5"" +time = { version = ""0.3"", features = [""serde"", ""formatting"", ""parsing""] } +uuid = { version = ""1.8.0"", features = [""serde"", ""v4""] } +derive_builder = ""0.20"" +"); + if (this.sdkPath != null) { + this.Write("azure_iot_operations_mqtt = { "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.IfLocal("path", "git"))); + this.Write(" = \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.sdkPath)); + this.Write(this.ToStringHelper.ToStringWithCulture(this.IfLocal("/azure_iot_operations_mqtt"))); + this.Write("\" }\r\nazure_iot_operations_protocol = { "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.IfLocal("path", "git"))); + this.Write(" = \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.sdkPath)); + this.Write(this.ToStringHelper.ToStringWithCulture(this.IfLocal("/azure_iot_operations_protocol"))); + this.Write("\" }\r\n"); + } else { + this.Write("azure_iot_operations_mqtt = { version = \"0.11.0\", registry = \"aio-sdks\" }\r\nazure_" + + "iot_operations_protocol = { version = \"0.12.0\", registry = \"aio-sdks\" }\r\n"); + } + if (!this.generateProject) { + this.Write("```\r\n"); + } + return this.GenerationEnvironment.ToString(); + } + +string IfLocal(string ifText, string elseText = "") => !this.sdkPath.StartsWith("http://") && !this.sdkPath.StartsWith("https://") ? ifText : elseText; + + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class RustCargoTomlBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustIndex.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustIndex.cs new file mode 100644 index 0000000000..f4292ec94c --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustIndex.cs @@ -0,0 +1,338 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.IO; + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class RustIndex : RustIndexBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("; DO NOT EDIT. */\r\n\r\n"); + foreach (string module in this.modules) { + this.Write("mod "); + this.Write(this.ToStringHelper.ToStringWithCulture(Path.GetFileNameWithoutExtension(module))); + this.Write(";\r\n"); + } + this.Write("\r\npub use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolE" + + "rror;\r\n\r\n"); + if (this.generateServer) { + this.Write("pub use super::common_types::options::{CommandExecutorOptions, TelemetrySenderOpt" + + "ions};\r\n"); + } + if (this.generateClient) { + this.Write("pub use super::common_types::options::{CommandInvokerOptions, TelemetryReceiverOp" + + "tions};\r\n"); + } + if (this.generateClient) { + this.Write("\r\npub mod client {\r\n"); + foreach (string module in this.modules) { if (!module.EndsWith("_executor") && !module.EndsWith("_maintainer") && !module.EndsWith("_sender") && !module.EndsWith("_serialization") && !module.EndsWith("_headers")) { + this.Write(" pub use super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(module)); + this.Write("::*;\r\n"); + } } + this.Write("}\r\n"); + } + if (this.generateServer) { + this.Write("\r\npub mod service {\r\n"); + foreach (string module in this.modules) { if (!module.EndsWith("_invoker") && !module.EndsWith("_consumer") && !module.EndsWith("_receiver") && !module.EndsWith("_serialization") && !module.EndsWith("_headers")) { + this.Write(" pub use super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(module)); + this.Write("::*;\r\n"); + } } + this.Write("}\r\n"); + } + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class RustIndexBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustLib.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustLib.cs new file mode 100644 index 0000000000..044fbda3e4 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustLib.cs @@ -0,0 +1,310 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class RustLib : RustLibBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("; DO NOT EDIT. */\r\n\r\n#![allow(missing_docs)]\r\n#![allow(unused_imports)]\r\n#![allow" + + "(dead_code)]\r\n#![allow(clippy::result_large_err)]\r\n#![allow(clippy::struct_field" + + "_names)]\r\n"); + foreach (string module in this.modules) { + this.Write("pub mod "); + this.Write(this.ToStringHelper.ToStringWithCulture(module)); + this.Write(";\r\n"); + } + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class RustLibBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyConsumer.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyConsumer.cs new file mode 100644 index 0000000000..6613016cea --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyConsumer.cs @@ -0,0 +1,834 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class RustPropertyConsumer : RustPropertyConsumerBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("; DO NOT EDIT. */\r\n\r\nuse std::collections::HashMap;\r\n"); + if (this.readErrorName != null) { + this.Write("use std::error::Error;\r\n"); + } + this.Write("use std::time::Duration;\r\n\r\nuse azure_iot_operations_mqtt::interface::ManagedClie" + + "nt;\r\nuse azure_iot_operations_protocol::common::aio_protocol_error::{\r\n AIOPr" + + "otocolError,\r\n"); + if (this.readErrorName != null) { + this.Write(" AIOProtocolErrorKind,\r\n"); + } + this.Write("};\r\n"); + if (this.writeReqSchema != null) { + this.Write("use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize;\r\n" + + ""); + } + this.Write("use azure_iot_operations_protocol::rpc_command;\r\nuse azure_iot_operations_protoco" + + "l::application::ApplicationContext;\r\n\r\nuse super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propSchema.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + if (this.readRespSchema is CodeName && !this.readRespSchema.Equals(this.propSchema)) { + this.Write("use super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readRespSchema.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readRespSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + } + if (this.writeReqSchema is CodeName && !this.writeReqSchema.Equals(this.readRespSchema) && !this.writeReqSchema.Equals(this.propSchema)) { + this.Write("use super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeReqSchema.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeReqSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + } + if (this.writeRespSchema is CodeName) { + this.Write("use super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeRespSchema.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeRespSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + } + if (this.readErrorName != null) { + this.Write("use super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readErrorSchema.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readErrorSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + } + if (this.writeErrorName != null && !this.writeErrorSchema.Equals(this.readErrorSchema)) { + this.Write("use super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeErrorSchema.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeErrorSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + } + this.Write("use super::super::common_types::options::CommandInvokerOptions;\r\nuse super::super" + + "::common_types::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readSerializerEmptyType.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readSerializerEmptyType.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + if (!this.readSerializerEmptyType.Equals(this.writeSerializerEmptyType)) { + this.Write("use super::super::common_types::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeSerializerEmptyType.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeSerializerEmptyType.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + } + this.Write("\r\n"); + if (this.readRespSchema != null) { + this.Write("pub type "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "request"))); + this.Write(" = rpc_command::invoker::Request<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readSerializerEmptyType.GetTypeName(TargetLanguage.Rust))); + this.Write(">;\r\npub type "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "response"))); + this.Write(" = rpc_command::invoker::Response<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(">;\r\npub type "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "request", "builder", "error"))); + this.Write(" = rpc_command::invoker::RequestBuilderError;\r\n"); + if (this.readErrorSchema != null) { + this.Write("pub type "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "response", "error"))); + this.Write(" = rpc_command::invoker::Response<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readErrorSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(">;\r\n"); + } + } + if (this.writeReqSchema != null) { + this.Write("pub type "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "request"))); + this.Write(" = rpc_command::invoker::Request<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeReqSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(">;\r\npub type "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "response"))); + this.Write(" = rpc_command::invoker::Response<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeSerializerEmptyType.GetTypeName(TargetLanguage.Rust))); + this.Write(">;\r\npub type "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "request", "builder", "error"))); + this.Write(" = rpc_command::invoker::RequestBuilderError;\r\n"); + if (this.writeErrorSchema != null) { + this.Write("pub type "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "response", "error"))); + this.Write(" = rpc_command::invoker::Response<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeErrorSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(">;\r\n"); + } + } + if (this.readRespSchema != null) { + this.Write("\r\n#[derive(Default)]\r\n/// Builder for [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "request"))); + this.Write("`]\r\npub struct "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "request", "builder"))); + this.Write(" {\r\n inner_builder: rpc_command::invoker::RequestBuilder<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readSerializerEmptyType.GetTypeName(TargetLanguage.Rust))); + this.Write(">,\r\n"); + if (this.doesPropertyTargetReadMaintainer) { + this.Write(" set_maintainer_id: bool,\r\n"); + } + this.Write(" topic_tokens: HashMap,\r\n}\r\n\r\nimpl "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "request", "builder"))); + this.Write(@" { + /// Custom user data to set on the read request + pub fn custom_user_data(&mut self, custom_user_data: Vec<(String, String)>) -> &mut Self { + self.inner_builder.custom_user_data(custom_user_data); + self + } + + /// Topic token keys/values to be replaced into the publish topic of the request message. + /// A prefix of ""ex:"" will be prepended to each key before scanning the topic pattern. + /// Thus, only tokens of the form `{ex:SOMEKEY}` will be replaced. + pub fn topic_tokens(&mut self, topic_tokens: HashMap) -> &mut Self { + for (k, v) in topic_tokens { + self.topic_tokens.insert(format!(""ex:{k}""), v); + } + self + } + + /// Timeout for the request + pub fn timeout(&mut self, timeout: Duration) -> &mut Self { + self.inner_builder.timeout(timeout); + self + } + +"); + if (this.doesPropertyTargetReadMaintainer) { + this.Write(@" /// Target maintainer ID + pub fn maintainer_id(&mut self, maintainer_id: &str) -> &mut Self { + self.topic_tokens + .insert(""maintainerId"".to_string(), maintainer_id.to_string()); + self.set_maintainer_id = true; + self + } + +"); + } + this.Write(" /// Builds a new `"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "request"))); + this.Write("`\r\n ///\r\n /// # Errors\r\n /// If a required field has not been initialize" + + "d\r\n #[allow(clippy::missing_panics_doc)] // The panic is not possible\r\n pu" + + "b fn build(&mut self) -> Result<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "request"))); + this.Write(", "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "request", "builder", "error"))); + this.Write("> {\r\n"); + if (this.doesPropertyTargetReadMaintainer) { + this.Write(" if !self.set_maintainer_id {\r\n return Err("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "request", "builder", "error"))); + this.Write("::UninitializedField(\r\n \"maintainer_id\",\r\n ));\r\n " + + " }\r\n\r\n"); + } + this.Write(" self.inner_builder.payload("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readSerializerEmptyType.GetAllocator(TargetLanguage.Rust))); + this.Write(").unwrap();\r\n\r\n self.inner_builder.topic_tokens(self.topic_tokens.clone())" + + ";\r\n\r\n self.inner_builder.build()\r\n }\r\n}\r\n"); + } + if (this.writeReqSchema != null) { + this.Write("\r\n#[derive(Default)]\r\n/// Builder for [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "request"))); + this.Write("`]\r\npub struct "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "request", "builder"))); + this.Write(" {\r\n inner_builder: rpc_command::invoker::RequestBuilder<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeReqSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(">,\r\n"); + if (this.doesPropertyTargetWriteMaintainer) { + this.Write(" set_maintainer_id: bool,\r\n"); + } + this.Write(" topic_tokens: HashMap,\r\n}\r\n\r\nimpl "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "request", "builder"))); + this.Write(@" { + /// Custom user data to set on the write request + pub fn custom_user_data(&mut self, custom_user_data: Vec<(String, String)>) -> &mut Self { + self.inner_builder.custom_user_data(custom_user_data); + self + } + + /// Topic token keys/values to be replaced into the publish topic of the request message. + /// A prefix of ""ex:"" will be prepended to each key before scanning the topic pattern. + /// Thus, only tokens of the form `{ex:SOMEKEY}` will be replaced. + pub fn topic_tokens(&mut self, topic_tokens: HashMap) -> &mut Self { + for (k, v) in topic_tokens { + self.topic_tokens.insert(format!(""ex:{k}""), v); + } + self + } + + /// Timeout for the request + pub fn timeout(&mut self, timeout: Duration) -> &mut Self { + self.inner_builder.timeout(timeout); + self + } + +"); + if (this.doesPropertyTargetWriteMaintainer) { + this.Write(@" /// Target maintainer ID + pub fn maintainer_id(&mut self, maintainer_id: &str) -> &mut Self { + self.topic_tokens + .insert(""maintainerId"".to_string(), maintainer_id.to_string()); + self.set_maintainer_id = true; + self + } + +"); + } + this.Write(" /// Payload of the write request\r\n ///\r\n /// # Errors\r\n /// If the p" + + "ayload cannot be serialized\r\n pub fn payload(\r\n &mut self,\r\n pa" + + "yload: "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeReqSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(",\r\n ) -> Result<&mut Self, AIOProtocolError> {\r\n self.inner_builder.pay" + + "load(payload)?;\r\n Ok(self)\r\n }\r\n\r\n /// Builds a new `"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "request"))); + this.Write("`\r\n ///\r\n /// # Errors\r\n /// If a required field has not been initialize" + + "d\r\n #[allow(clippy::missing_panics_doc)] // The panic is not possible\r\n pu" + + "b fn build(&mut self) -> Result<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "request"))); + this.Write(", "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "request", "builder", "error"))); + this.Write("> {\r\n"); + if (this.doesPropertyTargetWriteMaintainer) { + this.Write(" if !self.set_maintainer_id {\r\n return Err("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "request", "builder", "error"))); + this.Write("::UninitializedField(\r\n \"maintainer_id\",\r\n ));\r\n " + + " }\r\n\r\n"); + } + this.Write(" self.inner_builder.topic_tokens(self.topic_tokens.clone());\r\n\r\n se" + + "lf.inner_builder.build()\r\n }\r\n}\r\n"); + } + if (this.readRespSchema != null) { + this.Write("\r\n"); + if (!this.propertyName.IsEmpty) { + this.Write("/// Read requester for `"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.AsGiven)); + this.Write("`\r\n"); + } else { + this.Write("/// Read requester for a Property collection\r\n"); + } + this.Write("pub struct "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "requester"))); + this.Write("(\r\n rpc_command::Invoker<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readSerializerEmptyType.GetTypeName(TargetLanguage.Rust))); + this.Write(", "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readRespSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(", C>,\r\n)\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::Pu" + + "bReceiver: Send + Sync + \'static;\r\n\r\nimpl "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "requester"))); + this.Write("\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::PubRece" + + "iver: Send + Sync + \'static,\r\n{\r\n /// Creates a new [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "requester"))); + this.Write(@"`] + /// + /// # Panics + /// If the DTDL that generated this code was invalid + pub fn new(application_context: ApplicationContext, client: C, options: &CommandInvokerOptions) -> Self { + let mut invoker_options_builder = rpc_command::invoker::OptionsBuilder::default(); + if let Some(topic_namespace) = &options.topic_namespace { + invoker_options_builder.topic_namespace(topic_namespace.clone()); + } + + let mut topic_token_map: HashMap = options + .topic_token_map + .clone() + .into_iter() + .map(|(k, v)| (format!(""ex:{k}""), v)) + .collect(); + + topic_token_map.insert("""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.PropertyAction)); + this.Write("\".to_string(), \""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.PropertyActionValues.Read)); + this.Write("\".to_string());\r\n topic_token_map.insert(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.PropertyConsumerId)); + this.Write("\".to_string(), client.client_id().to_string());\r\n\r\n let invoker_options = " + + "invoker_options_builder\r\n .request_topic_pattern(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readTopicPattern)); + this.Write("\")\r\n .command_name(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readCommandName)); + this.Write(@""") + .topic_token_map(topic_token_map) + .response_topic_prefix(options.response_topic_prefix.clone()) + .response_topic_suffix(options.response_topic_suffix.clone()) + .build() + .expect(""DTDL schema generated invalid arguments""); + + Self( + rpc_command::Invoker::new(application_context, client, invoker_options) + .expect(""DTDL schema generated invalid arguments""), + ) + } + + /// Invokes the [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "request"))); + this.Write("`]\r\n ///\r\n /// # Errors\r\n /// [`AIOProtocolError`] if there is a failure" + + " invoking the request\r\n pub async fn invoke(\r\n &self,\r\n request" + + ": "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "request"))); + this.Write(",\r\n"); + if (this.readErrorName != null) { + this.Write(" ) -> Result, AIOProtocolError> {\r\n let response = self.0.invoke(request).await;\r\n " + + " match response {\r\n Ok(response) => {\r\n if let Som" + + "e("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readErrorName.GetVariableName(TargetLanguage.Rust))); + this.Write(") = response.payload."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readErrorName.GetFieldName(TargetLanguage.Rust))); + this.Write(" {\r\n Ok(Err("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "response", "error"))); + this.Write(" {\r\n payload: "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readErrorName.GetVariableName(TargetLanguage.Rust))); + this.Write(@", + content_type: response.content_type, + format_indicator: response.format_indicator, + custom_user_data: response.custom_user_data, + timestamp: response.timestamp, + executor_id: response.executor_id, + })) + } else if let Some("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propValueName.GetVariableName(TargetLanguage.Rust))); + this.Write(") = response.payload."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propValueName.GetFieldName(TargetLanguage.Rust))); + this.Write(" {\r\n Ok(Ok("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "response"))); + this.Write(" {\r\n"); + if (this.separateProperties) { + this.Write(" payload: "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(" { "); + this.Write(this.ToStringHelper.ToStringWithCulture((this.propValueName ?? this.propertyName).GetFieldName(TargetLanguage.Rust))); + this.Write(": "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propValueName.GetVariableName(TargetLanguage.Rust))); + this.Write(" },\r\n"); + } else { + this.Write(" payload: "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propValueName.GetVariableName(TargetLanguage.Rust))); + this.Write(",\r\n"); + } + this.Write(@" content_type: response.content_type, + format_indicator: response.format_indicator, + custom_user_data: response.custom_user_data, + timestamp: response.timestamp, + executor_id: response.executor_id, + })) + } else { + Err(AIOProtocolError { + message: Some( + ""Command response has neither normal nor error payload content"" + .to_string(), + ), + kind: AIOProtocolErrorKind::PayloadInvalid, + is_shallow: false, + is_remote: true, + nested_error: None, + header_name: None, + header_value: None, + timeout_name: None, + timeout_value: None, + property_name: None, + property_value: None, + command_name: Some("""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readCommandName)); + this.Write("\".to_string()),\r\n protocol_version: None,\r\n " + + " supported_protocol_major_versions: None,\r\n })\r\n " + + " }\r\n }\r\n Err(err) => Err(err),\r\n }\r\n"); + } else { + this.Write(" ) -> Result<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "response"))); + this.Write(", AIOProtocolError> {\r\n self.0.invoke(request).await\r\n"); + } + this.Write(" }\r\n\r\n /// Shutdown the [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "requester"))); + this.Write(@"`]. Unsubscribes from the response topic and cancels the receiver loop to drop the receiver and to prevent the task from looping indefinitely. + /// + /// Returns Ok(()) on success, otherwise returns [`AIOProtocolError`]. + /// # Errors + /// [`AIOProtocolError`] of kind [`ClientError`](azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolErrorKind::ClientError) if the unsubscribe fails or if the unsuback reason code doesn't indicate success. + pub async fn shutdown(&self) -> Result<(), AIOProtocolError> { + self.0.shutdown().await + } +} +"); + } + if (this.writeReqSchema != null) { + this.Write("\r\n"); + if (!this.propertyName.IsEmpty) { + this.Write("/// Write requester for `"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.AsGiven)); + this.Write("`\r\n"); + } else { + this.Write("/// Write requester for a Property collection\r\n"); + } + this.Write("pub struct "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "requester"))); + this.Write("(\r\n rpc_command::Invoker<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeReqSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(", "); + this.Write(this.ToStringHelper.ToStringWithCulture(((ITypeName)this.writeRespSchema ?? this.writeSerializerEmptyType).GetTypeName(TargetLanguage.Rust))); + this.Write(", C>,\r\n)\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::Pu" + + "bReceiver: Send + Sync + \'static;\r\n\r\nimpl "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "requester"))); + this.Write("\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::PubRece" + + "iver: Send + Sync + \'static,\r\n{\r\n /// Creates a new [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "requester"))); + this.Write(@"`] + /// + /// # Panics + /// If the DTDL that generated this code was invalid + pub fn new(application_context: ApplicationContext, client: C, options: &CommandInvokerOptions) -> Self { + let mut invoker_options_builder = rpc_command::invoker::OptionsBuilder::default(); + if let Some(topic_namespace) = &options.topic_namespace { + invoker_options_builder.topic_namespace(topic_namespace.clone()); + } + + let mut topic_token_map: HashMap = options + .topic_token_map + .clone() + .into_iter() + .map(|(k, v)| (format!(""ex:{k}""), v)) + .collect(); + + topic_token_map.insert("""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.PropertyAction)); + this.Write("\".to_string(), \""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.PropertyActionValues.Write)); + this.Write("\".to_string());\r\n topic_token_map.insert(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.PropertyConsumerId)); + this.Write("\".to_string(), client.client_id().to_string());\r\n\r\n let invoker_options = " + + "invoker_options_builder\r\n .request_topic_pattern(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readTopicPattern)); + this.Write("\")\r\n .command_name(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeCommandName)); + this.Write(@""") + .topic_token_map(topic_token_map) + .response_topic_prefix(options.response_topic_prefix.clone()) + .response_topic_suffix(options.response_topic_suffix.clone()) + .build() + .expect(""DTDL schema generated invalid arguments""); + + Self( + rpc_command::Invoker::new(application_context, client, invoker_options) + .expect(""DTDL schema generated invalid arguments""), + ) + } + + /// Invokes the [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "request"))); + this.Write("`]\r\n ///\r\n /// # Errors\r\n /// [`AIOProtocolError`] if there is a failure" + + " invoking the request\r\n pub async fn invoke(\r\n &self,\r\n request" + + ": "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "request"))); + this.Write(",\r\n"); + if (this.writeErrorName != null) { + this.Write(" ) -> Result, AIOProtocolError> {\r\n let response = self.0.invoke(request).await;\r\n " + + " match response {\r\n Ok(response) => {\r\n if let Som" + + "e("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeErrorName.GetVariableName(TargetLanguage.Rust))); + this.Write(") = response.payload."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeErrorName.GetFieldName(TargetLanguage.Rust))); + this.Write(" {\r\n Ok(Err("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "response", "error"))); + this.Write(" {\r\n payload: "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeErrorName.GetVariableName(TargetLanguage.Rust))); + this.Write(@", + content_type: response.content_type, + format_indicator: response.format_indicator, + custom_user_data: response.custom_user_data, + timestamp: response.timestamp, + executor_id: response.executor_id, + })) + } else { + Ok(Ok("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "response"))); + this.Write(" {\r\n payload: "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeSerializerEmptyType.GetAllocator(TargetLanguage.Rust))); + this.Write(@", + content_type: response.content_type, + format_indicator: response.format_indicator, + custom_user_data: response.custom_user_data, + timestamp: response.timestamp, + executor_id: response.executor_id, + })) + } + } + Err(err) => Err(err), + } +"); + } else { + this.Write(" ) -> Result<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "response"))); + this.Write(", AIOProtocolError> {\r\n self.0.invoke(request).await\r\n"); + } + this.Write(" }\r\n\r\n /// Shutdown the [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "requester"))); + this.Write(@"`]. Unsubscribes from the response topic and cancels the receiver loop to drop the receiver and to prevent the task from looping indefinitely. + /// + /// Returns Ok(()) on success, otherwise returns [`AIOProtocolError`]. + /// # Errors + /// [`AIOProtocolError`] of kind [`ClientError`](azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolErrorKind::ClientError) if the unsubscribe fails or if the unsuback reason code doesn't indicate success. + pub async fn shutdown(&self) -> Result<(), AIOProtocolError> { + self.0.shutdown().await + } +} +"); + } + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class RustPropertyConsumerBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyMaintainer.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyMaintainer.cs new file mode 100644 index 0000000000..c774cd90d1 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyMaintainer.cs @@ -0,0 +1,645 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class RustPropertyMaintainer : RustPropertyMaintainerBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("; DO NOT EDIT. */\r\n\r\nuse std::collections::HashMap;\r\n\r\nuse azure_iot_operations_m" + + "qtt::interface::ManagedClient;\r\nuse azure_iot_operations_protocol::common::aio_p" + + "rotocol_error::AIOProtocolError;\r\n"); + if (this.readRespSchema != null || this.writeRespSchema != null) { + this.Write("use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize;\r\n" + + ""); + } + this.Write("use azure_iot_operations_protocol::rpc_command;\r\nuse azure_iot_operations_protoco" + + "l::application::ApplicationContext;\r\n\r\nuse super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propSchema.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + if (this.readRespSchema is CodeName && !this.readRespSchema.Equals(this.propSchema)) { + this.Write("use super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readRespSchema.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readRespSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + } + if (this.writeReqSchema is CodeName && !this.writeReqSchema.Equals(this.readRespSchema) && !this.writeReqSchema.Equals(this.propSchema)) { + this.Write("use super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeReqSchema.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeReqSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + } + if (this.writeRespSchema is CodeName) { + this.Write("use super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeRespSchema.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeRespSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + } + if (this.readErrorName != null) { + this.Write("use super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readErrorSchema.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readErrorSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + } + if (this.writeErrorName != null && !this.writeErrorSchema.Equals(this.readErrorSchema)) { + this.Write("use super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeErrorSchema.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeErrorSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + } + this.Write("use super::super::common_types::options::CommandExecutorOptions;\r\nuse super::supe" + + "r::common_types::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readSerializerEmptyType.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readSerializerEmptyType.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + if (!this.readSerializerEmptyType.Equals(this.writeSerializerEmptyType)) { + this.Write("use super::super::common_types::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeSerializerEmptyType.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeSerializerEmptyType.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + } + this.Write("\r\n"); + if (this.readRespSchema != null) { + this.Write("pub type "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "request"))); + this.Write(" = rpc_command::executor::Request<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readSerializerEmptyType.GetTypeName(TargetLanguage.Rust))); + this.Write(", "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readRespSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(">;\r\npub type "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "response"))); + this.Write(" = rpc_command::executor::Response<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readRespSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(">;\r\npub type "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "response", "builder", "error"))); + this.Write(" = rpc_command::executor::ResponseBuilderError;\r\n"); + } + if (this.writeReqSchema != null) { + this.Write("pub type "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "request"))); + this.Write(" = rpc_command::executor::Request<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeReqSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(", "); + this.Write(this.ToStringHelper.ToStringWithCulture(((ITypeName)this.writeRespSchema ?? this.writeSerializerEmptyType).GetTypeName(TargetLanguage.Rust))); + this.Write(">;\r\npub type "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "response"))); + this.Write(" = rpc_command::executor::Response<"); + this.Write(this.ToStringHelper.ToStringWithCulture(((ITypeName)this.writeRespSchema ?? this.writeSerializerEmptyType).GetTypeName(TargetLanguage.Rust))); + this.Write(">;\r\npub type "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "response", "builder", "error"))); + this.Write(" = rpc_command::executor::ResponseBuilderError;\r\n"); + } + this.Write("\r\n#[derive(Default)]\r\n/// Builder for [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "response"))); + this.Write("`]\r\npub struct "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "response", "builder"))); + this.Write(" {\r\n inner_builder: rpc_command::executor::ResponseBuilder<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readRespSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(">,\r\n}\r\n\r\nimpl "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "response", "builder"))); + this.Write(@" { + /// Custom user data to set on the read response + pub fn custom_user_data(&mut self, custom_user_data: Vec<(String, String)>) -> &mut Self { + self.inner_builder.custom_user_data(custom_user_data); + self + } + + /// Payload of the read response + /// + /// # Errors + /// If the payload cannot be serialized + pub fn payload( + &mut self, + payload: "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(",\r\n ) -> Result<&mut Self, AIOProtocolError> {\r\n"); + if (this.readErrorName != null) { + this.Write(" self.inner_builder.payload("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readRespSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(" {\r\n "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propValueName.GetFieldName(TargetLanguage.Rust))); + this.Write(": Some(payload"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.separateProperties ? $".{this.propValueName.GetFieldName(TargetLanguage.Rust)}" : "")); + this.Write("),\r\n "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readErrorName.GetFieldName(TargetLanguage.Rust))); + this.Write(": None,\r\n })?;\r\n"); + } else { + this.Write(" self.inner_builder.payload(payload)?;\r\n"); + } + this.Write(" Ok(self)\r\n }\r\n\r\n"); + if (this.readErrorName != null) { + this.Write(" pub fn error(&mut self, error: "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readErrorSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(") -> Result<&mut Self, AIOProtocolError> {\r\n self.inner_builder.payload("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readRespSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(" {\r\n "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propValueName.GetFieldName(TargetLanguage.Rust))); + this.Write(": None,\r\n "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readErrorName.GetFieldName(TargetLanguage.Rust))); + this.Write(": Some(error),\r\n })?;\r\n Ok(self)\r\n }\r\n\r\n"); + } + this.Write(" /// Builds a new `"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "response"))); + this.Write("`\r\n ///\r\n /// # Errors\r\n /// If a required field has not been initialize" + + "d\r\n #[allow(clippy::missing_panics_doc)] // The panic is not possible\r\n pu" + + "b fn build(&mut self) -> Result<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "response"))); + this.Write(", "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "response", "builder", "error"))); + this.Write("> {\r\n self.inner_builder.build()\r\n }\r\n}\r\n"); + if (this.writeRespSchema != null) { + this.Write("\r\n#[derive(Default)]\r\n/// Builder for [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "response"))); + this.Write("`]\r\npub struct "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "response", "builder"))); + this.Write(" {\r\n inner_builder: rpc_command::executor::ResponseBuilder<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeRespSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(">,\r\n}\r\n\r\nimpl "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "response", "builder"))); + this.Write(" {\r\n /// Custom user data to set on the write response\r\n pub fn custom_user" + + "_data(&mut self, custom_user_data: Vec<(String, String)>) -> &mut Self {\r\n " + + " self.inner_builder.custom_user_data(custom_user_data);\r\n self\r\n }\r\n\r" + + "\n"); + if (this.writeErrorName != null) { + this.Write(" pub fn error(&mut self, error: "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeErrorSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(") -> Result<&mut Self, AIOProtocolError> {\r\n self.inner_builder.payload("); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeRespSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(" {\r\n "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeErrorName.GetFieldName(TargetLanguage.Rust))); + this.Write(": Some(error),\r\n })?;\r\n Ok(self)\r\n }\r\n\r\n"); + } + this.Write(" /// Builds a new `"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "response"))); + this.Write("`\r\n ///\r\n /// # Errors\r\n /// If a required field has not been initialize" + + "d\r\n #[allow(clippy::missing_panics_doc)] // The panic is not possible\r\n pu" + + "b fn build(&mut self) -> Result<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "response"))); + this.Write(", "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "response", "builder", "error"))); + this.Write("> {\r\n self.inner_builder.build()\r\n }\r\n}\r\n"); + } + if (this.readRespSchema != null) { + this.Write("\r\n"); + if (!this.propertyName.IsEmpty) { + this.Write("/// Read responder for `"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.AsGiven)); + this.Write("`\r\n"); + } else { + this.Write("/// Read responder for a Property collection\r\n"); + } + this.Write("pub struct "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "responder"))); + this.Write("(\r\n rpc_command::Executor<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readSerializerEmptyType.GetTypeName(TargetLanguage.Rust))); + this.Write(", "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readRespSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(", C>,\r\n)\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::Pu" + + "bReceiver: Send + Sync + \'static;\r\n\r\nimpl "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "responder"))); + this.Write("\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::PubRece" + + "iver: Send + Sync + \'static,\r\n{\r\n /// Creates a new [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "responder"))); + this.Write(@"`] + /// + /// # Panics + /// If the DTDL that generated this code was invalid + pub fn new(application_context: ApplicationContext, client: C, options: &CommandExecutorOptions) -> Self { + let mut executor_options_builder = rpc_command::executor::OptionsBuilder::default(); + if let Some(topic_namespace) = &options.topic_namespace { + executor_options_builder.topic_namespace(topic_namespace.clone()); + } + + let mut topic_token_map: HashMap = options + .topic_token_map + .clone() + .into_iter() + .map(|(k, v)| (format!(""ex:{k}""), v)) + .collect(); + + topic_token_map.insert("""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.PropertyAction)); + this.Write("\".to_string(), \""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.PropertyActionValues.Read)); + this.Write("\".to_string());\r\n topic_token_map.insert(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.PropertyMaintainerId)); + this.Write("\".to_string(), client.client_id().to_string());\r\n\r\n let executor_options =" + + " executor_options_builder\r\n .request_topic_pattern(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readTopicPattern)); + this.Write("\")\r\n .command_name(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readCommandName)); + this.Write(@""") + .topic_token_map(topic_token_map) + .build() + .expect(""DTDL schema generated invalid arguments""); + + Self( + rpc_command::Executor::new(application_context, client, executor_options) + .expect(""DTDL schema generated invalid arguments""), + ) + } + + /// Receive the next [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "request"))); + this.Write("`] or [`None`] if there will be no more requests\r\n ///\r\n /// # Errors\r\n " + + "/// [`AIOProtocolError`] if there is a failure receiving a request\r\n pub asyn" + + "c fn recv(&mut self) -> Option> {\r\n self.0.recv().await\r\n }\r\n\r\n /// Shutdown th" + + "e [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "responder"))); + this.Write(@"`]. Unsubscribes from the response topic and cancels the receiver loop to drop the receiver and to prevent the task from looping indefinitely. + /// + /// Returns Ok(()) on success, otherwise returns [`AIOProtocolError`]. + /// # Errors + /// [`AIOProtocolError`] of kind [`ClientError`](azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolErrorKind::ClientError) if the unsubscribe fails or if the unsuback reason code doesn't indicate success. + pub async fn shutdown(&mut self) -> Result<(), AIOProtocolError> { + self.0.shutdown().await + } +} +"); + } + if (this.writeReqSchema != null) { + this.Write("\r\n"); + if (!this.propertyName.IsEmpty) { + this.Write("/// Write responder for `"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.AsGiven)); + this.Write("`\r\n"); + } else { + this.Write("/// Write responder for a Property collection\r\n"); + } + this.Write("pub struct "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "responder"))); + this.Write("(\r\n rpc_command::Executor<"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeReqSchema.GetTypeName(TargetLanguage.Rust))); + this.Write(", "); + this.Write(this.ToStringHelper.ToStringWithCulture(((ITypeName)this.writeRespSchema ?? this.writeSerializerEmptyType).GetTypeName(TargetLanguage.Rust))); + this.Write(", C>,\r\n)\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::Pu" + + "bReceiver: Send + Sync + \'static;\r\n\r\nimpl "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "responder"))); + this.Write("\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::PubRece" + + "iver: Send + Sync + \'static,\r\n{\r\n /// Creates a new [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "responder"))); + this.Write(@"`] + /// + /// # Panics + /// If the DTDL that generated this code was invalid + pub fn new(application_context: ApplicationContext, client: C, options: &CommandExecutorOptions) -> Self { + let mut executor_options_builder = rpc_command::executor::OptionsBuilder::default(); + if let Some(topic_namespace) = &options.topic_namespace { + executor_options_builder.topic_namespace(topic_namespace.clone()); + } + + let mut topic_token_map: HashMap = options + .topic_token_map + .clone() + .into_iter() + .map(|(k, v)| (format!(""ex:{k}""), v)) + .collect(); + + topic_token_map.insert("""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.PropertyAction)); + this.Write("\".to_string(), \""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.PropertyActionValues.Write)); + this.Write("\".to_string());\r\n topic_token_map.insert(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(MqttTopicTokens.PropertyMaintainerId)); + this.Write("\".to_string(), client.client_id().to_string());\r\n\r\n let executor_options =" + + " executor_options_builder\r\n .request_topic_pattern(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeTopicPattern)); + this.Write("\")\r\n .command_name(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeCommandName)); + this.Write(@""") + .topic_token_map(topic_token_map) + .build() + .expect(""DTDL schema generated invalid arguments""); + + Self( + rpc_command::Executor::new(application_context, client, executor_options) + .expect(""DTDL schema generated invalid arguments""), + ) + } + + /// Receive the next [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "request"))); + this.Write("`] or [`None`] if there will be no more requests\r\n ///\r\n /// # Errors\r\n " + + "/// [`AIOProtocolError`] if there is a failure receiving a request\r\n pub asyn" + + "c fn recv(&mut self) -> Option> {\r\n self.0.recv().await\r\n }\r\n\r\n /// Shutdown th" + + "e [`"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "responder"))); + this.Write(@"`]. Unsubscribes from the response topic and cancels the receiver loop to drop the receiver and to prevent the task from looping indefinitely. + /// + /// Returns Ok(()) on success, otherwise returns [`AIOProtocolError`]. + /// # Errors + /// [`AIOProtocolError`] of kind [`ClientError`](azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolErrorKind::ClientError) if the unsubscribe fails or if the unsuback reason code doesn't indicate success. + pub async fn shutdown(&mut self) -> Result<(), AIOProtocolError> { + self.0.shutdown().await + } +} +"); + } + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class RustPropertyMaintainerBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Serialization/t4/RustSerialization.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Serialization/t4/RustSerialization.cs new file mode 100644 index 0000000000..2fb41c7140 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Serialization/t4/RustSerialization.cs @@ -0,0 +1,390 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.EnvoyGenerator +{ + using System.Linq; + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class RustSerialization : RustSerializationBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("; DO NOT EDIT. */\r\n\r\n"); + if (this.stdHeaders.Any()) { + foreach (string header in this.stdHeaders) { + this.Write(this.ToStringHelper.ToStringWithCulture(header)); + this.Write("\r\n"); + } + this.Write("\r\n"); + } + if (this.extHeaders.Any()) { + this.Write("use azure_iot_operations_protocol::common::payload_serialize::{\r\n Deserializat" + + "ionError, FormatIndicator, PayloadSerialize, SerializedPayload,\r\n};\r\n"); + foreach (string header in this.extHeaders) { + this.Write(this.ToStringHelper.ToStringWithCulture(header)); + this.Write("\r\n"); + } + this.Write("\r\n"); + } + this.Write("use super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaClassName.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaClassName.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n\r\n"); + + var contentTypeConstName = this.schemaClassName.GetConstantName(TargetLanguage.Rust, "content", "type"); + + this.Write("const "); + this.Write(this.ToStringHelper.ToStringWithCulture(contentTypeConstName)); + this.Write(": &str = \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.contentType)); + this.Write("\";\r\n\r\nimpl "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaClassName.GetTypeName(TargetLanguage.Rust))); + this.Write(" {\r\n fn is_content_type(content_type: &str) -> bool {\r\n content_type.st" + + "arts_with("); + this.Write(this.ToStringHelper.ToStringWithCulture(contentTypeConstName)); + this.Write(")\r\n && matches!(\r\n content_type\r\n .c" + + "hars()\r\n .nth("); + this.Write(this.ToStringHelper.ToStringWithCulture(contentTypeConstName)); + this.Write(".len()),\r\n None | Some(\'+\' | \';\')\r\n )\r\n }\r\n}\r\n\r\nimpl" + + " PayloadSerialize for "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaClassName.GetTypeName(TargetLanguage.Rust))); + this.Write(" {\r\n"); + if (this.serdeLib != null) { + this.Write(" type Error = "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.serdeLib)); + this.Write("::Error;\r\n\r\n"); + } + this.Write(" fn serialize(self) -> Result {\r\n let p" + + "ayload = "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.serializeCode.First())); + this.Write(this.ToStringHelper.ToStringWithCulture(this.serializeCode.Count == 1 ? ";" : "")); + this.Write("\r\n"); + int ix = 2; foreach (string serializeLine in this.serializeCode.Skip(1)) { + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(serializeLine)); + this.Write(this.ToStringHelper.ToStringWithCulture(ix == this.serializeCode.Count ? ";" : "")); + this.Write("\r\n"); + ix++; } + this.Write(" Ok(SerializedPayload {\r\n payload: payload?,\r\n conte" + + "nt_type: \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.contentType)); + this.Write("\".to_string(),\r\n format_indicator: FormatIndicator::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.formatIndicator)); + this.Write(@", + }) + } + + fn deserialize( + payload: &[u8], + content_type: Option<&String>, + _format_indicator: &FormatIndicator, + ) -> Result> { + if let Some(content_type) = content_type { + if !"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaClassName.GetTypeName(TargetLanguage.Rust))); + this.Write("::is_content_type(content_type) {\r\n return Err(DeserializationErro" + + "r::UnsupportedContentType(format!(\r\n \"Invalid content type: \'" + + "{content_type}\'. Must be \'"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.contentType)); + this.Write("\'\"\r\n )));\r\n }\r\n }\r\n"); + ix = 1; foreach (string deserializeLine in this.deserializeCode) { + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(deserializeLine)); + this.Write(this.ToStringHelper.ToStringWithCulture(ix == this.deserializeCode.Count ? ".map_err(DeserializationError::InvalidPayload)" : "")); + this.Write("\r\n"); + ix++; } + this.Write(" }\r\n}\r\n"); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class RustSerializationBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/.gitignore b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/.gitignore deleted file mode 100644 index db669da381..0000000000 --- a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/.gitignore +++ /dev/null @@ -1 +0,0 @@ -**/t4/*.cs diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/AliasJsonSchema.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/AliasJsonSchema.cs new file mode 100644 index 0000000000..7dd6e68048 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/AliasJsonSchema.cs @@ -0,0 +1,316 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.SchemaGenerator +{ + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class AliasJsonSchema : AliasJsonSchemaBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("{\r\n \"$schema\": \"https://json-schema.org/draft-07/schema\",\r\n \"title\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName)); + this.Write("\",\r\n"); + if (this.aliasSpec.Type != null) { + this.Write(" \"type\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.aliasSpec.Type)); + this.Write("\",\r\n"); + } + if (this.aliasSpec.Description != null) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.aliasSpec.Description)); + this.Write("\",\r\n"); + } + this.Write(" \"$ref\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaSupport.GetReferencePath(this.aliasSpec.Ref, this.aliasSpec.Base))); + this.Write("\"\r\n}\r\n"); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class AliasJsonSchemaBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/EnumJsonSchema.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/EnumJsonSchema.cs new file mode 100644 index 0000000000..64c434e810 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/EnumJsonSchema.cs @@ -0,0 +1,319 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.SchemaGenerator +{ + using System.Collections.Generic; + using System.Linq; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class EnumJsonSchema : EnumJsonSchemaBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("{\r\n \"$schema\": \"https://json-schema.org/draft-07/schema\",\r\n \"title\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName)); + this.Write("\",\r\n \"type\": \"string\",\r\n"); + if (this.enumSpec.Description != null) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.enumSpec.Description)); + this.Write("\",\r\n"); + } + this.Write(" \"enum\": [\r\n"); + int ix = 1; foreach (string value in this.enumSpec.Values) { + this.Write(" \""); + this.Write(this.ToStringHelper.ToStringWithCulture(value)); + this.Write("\""); + this.Write(this.ToStringHelper.ToStringWithCulture(ix < this.enumSpec.Values.Count ? "," : "")); + this.Write("\r\n"); + ix++; } + this.Write(" ]\r\n}\r\n"); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class EnumJsonSchemaBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/ObjectJsonSchema.cs b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/ObjectJsonSchema.cs new file mode 100644 index 0000000000..d54ab6b507 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.SchemaGenerator/json/t4/ObjectJsonSchema.cs @@ -0,0 +1,337 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.SchemaGenerator +{ + using System.Collections.Generic; + using System.Linq; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class ObjectJsonSchema : ObjectJsonSchemaBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("{\r\n \"$schema\": \"https://json-schema.org/draft-07/schema\",\r\n \"title\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaName)); + this.Write("\",\r\n"); + if (this.objectSpec.Description != null) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.objectSpec.Description)); + this.Write("\",\r\n"); + } + this.Write(" \"type\": \"object\",\r\n \"additionalProperties\": false,\r\n"); + if (this.objectSpec.Fields.Any(f => f.Value.Require || f.Value.Fragment)) { + this.Write(" \"required\": [ "); + this.Write(this.ToStringHelper.ToStringWithCulture(string.Join(", ", this.objectSpec.Fields.Where(f => (f.Value.Require || f.Value.Fragment) && !f.Value.ForceOption).Select(f => $"\"{f.Key}\"")))); + this.Write(" ],\r\n"); + } + this.Write(" \"properties\": {\r\n"); + int ix = 1; foreach (KeyValuePair field in this.objectSpec.Fields.OrderBy(field => field.Key)) { + this.Write(" \""); + this.Write(this.ToStringHelper.ToStringWithCulture(field.Key)); + this.Write("\": {\r\n \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(field.Value.Description)); + this.Write("\",\r\n"); + if (field.Value.Fragment) { + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaSupport.GetFragmented(this.schemaSupport.GetTypeAndAddenda(field.Value.Schema, field.Value.BackupSchemaName, field.Value.Base), field.Value.Require))); + this.Write("\r\n"); + } else { + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaSupport.GetTypeAndAddenda(field.Value.Schema, field.Value.BackupSchemaName, field.Value.Base))); + this.Write("\r\n"); + } + this.Write(" }"); + this.Write(this.ToStringHelper.ToStringWithCulture(ix < this.objectSpec.Fields.Count ? "," : "")); + this.Write("\r\n"); + ix++; } + this.Write(" }\r\n}\r\n"); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class ObjectJsonSchemaBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/.gitignore b/codegen2/src/Azure.Iot.Operations.TypeGenerator/.gitignore deleted file mode 100644 index db669da381..0000000000 --- a/codegen2/src/Azure.Iot.Operations.TypeGenerator/.gitignore +++ /dev/null @@ -1 +0,0 @@ -**/t4/*.cs diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetAlias.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetAlias.cs new file mode 100644 index 0000000000..f074e4615d --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetAlias.cs @@ -0,0 +1,318 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.TypeGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class DotNetAlias : DotNetAliasBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("; DO NOT EDIT. */\r\n\r\n"); + if (this.aliasType.Description != null) { + this.Write(" /// \r\n /// "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.aliasType.Description)); + this.Write("\r\n /// \r\n"); + } + this.Write("global using "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.aliasType.SchemaName.GetTypeName(TargetLanguage.CSharp))); + this.Write(" = "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.projectName)); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.genNamespace.GetTypeName(TargetLanguage.CSharp))); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.aliasType.ReferencedName.GetTypeName(TargetLanguage.CSharp))); + this.Write(";\r\n"); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class DotNetAliasBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetEnum.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetEnum.cs new file mode 100644 index 0000000000..082ce1b898 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetEnum.cs @@ -0,0 +1,332 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.TypeGenerator +{ + using System.Linq; + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class DotNetEnum : DotNetEnumBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("; DO NOT EDIT. */\r\n\r\n#nullable enable\r\n"); + if (this.enumType.SchemaName.AsGiven.All(c => char.IsLower(c))) { + this.Write("\r\n#pragma warning disable CS8981 // The type name \'"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.enumType.SchemaName.AsGiven)); + this.Write("\' only contains lower-cased ascii characters.\r\n"); + } + this.Write("\r\nnamespace "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.projectName)); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.genNamespace.GetTypeName(TargetLanguage.CSharp))); + this.Write("\r\n{\r\n"); + if (this.enumType.Description != null) { + this.Write(" /// \r\n /// "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.enumType.Description)); + this.Write("\r\n /// \r\n"); + } + this.Write(" [System.CodeDom.Compiler.GeneratedCode(\"Azure.Iot.Operations.ProtocolCompiler" + + "Lib\", \""); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("\")]\r\n public enum "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.enumType.SchemaName.AsGiven)); + this.Write("\r\n {\r\n"); + foreach (var enumValue in this.enumType.EnumValues) { + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(enumValue.AsGiven)); + this.Write(",\r\n"); + } + this.Write(" }\r\n}\r\n"); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class DotNetEnumBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetObject.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetObject.cs new file mode 100644 index 0000000000..d7c8da4129 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/dotnet/t4/DotNetObject.cs @@ -0,0 +1,381 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.TypeGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class DotNetObject : DotNetObjectBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("; DO NOT EDIT. */\r\n\r\n#nullable enable\r\n\r\nnamespace "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.projectName)); + this.Write("."); + this.Write(this.ToStringHelper.ToStringWithCulture(this.genNamespace.GetTypeName(TargetLanguage.CSharp))); + this.Write("\r\n{\r\n using System;\r\n using System.Collections.Generic;\r\n"); + if (this.serFormat == SerializationFormat.Json) { + this.Write(" using System.Text.Json.Serialization;\r\n"); + } + this.Write(" using "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.projectName)); + this.Write(";\r\n\r\n"); + if (this.objectType.Description != null) { + this.Write(" /// \r\n /// "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.objectType.Description)); + this.Write("\r\n /// \r\n"); + } + this.Write(" [System.CodeDom.Compiler.GeneratedCode(\"Azure.Iot.Operations.ProtocolCompiler" + + "Lib\", \""); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("\")]\r\n public partial class "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.objectType.SchemaName.GetTypeName(TargetLanguage.CSharp))); + this.Write(this.ToStringHelper.ToStringWithCulture(this.Exports())); + this.Write("\r\n {\r\n"); + foreach (var fieldInfo in this.objectType.FieldInfos) { + if (fieldInfo.Value.Description != null) { + this.Write(" /// \r\n /// "); + this.Write(this.ToStringHelper.ToStringWithCulture(fieldInfo.Value.Description)); + this.Write("\r\n /// \r\n"); + } + if (this.serFormat == SerializationFormat.Json) { + this.Write(" [JsonPropertyName(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(fieldInfo.Key.AsGiven)); + this.Write("\")]\r\n [JsonIgnore(Condition = JsonIgnoreCondition."); + this.Write(this.ToStringHelper.ToStringWithCulture(fieldInfo.Value.IsRequired ? "Never" : "WhenWritingDefault")); + this.Write(")]\r\n"); + if (fieldInfo.Value.IsRequired) { + this.Write(" [JsonRequired]\r\n"); + } + } + this.Write(" public "); + this.Write(this.ToStringHelper.ToStringWithCulture(DotNetSchemaSupport.GetType(fieldInfo.Value.SchemaType))); + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(fieldInfo.Key.GetFieldName(TargetLanguage.CSharp))); + this.Write(" { get; set; } = default"); + this.Write(this.ToStringHelper.ToStringWithCulture(fieldInfo.Value.SchemaType.OrNull ? "" : "!")); + this.Write(";\r\n\r\n"); + } + if (this.serFormat == SerializationFormat.Json && this.needsNullCheck) { + this.Write(" void IJsonOnDeserialized.OnDeserialized()\r\n {\r\n"); + foreach (var fieldInfo in this.objectType.FieldInfos) { + if (!fieldInfo.Value.SchemaType.OrNull && DotNetSchemaSupport.IsNullable(fieldInfo.Value.SchemaType)) { + this.Write(" if ("); + this.Write(this.ToStringHelper.ToStringWithCulture(fieldInfo.Key.GetFieldName(TargetLanguage.CSharp))); + this.Write(" is null)\r\n {\r\n throw new ArgumentNullException(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(fieldInfo.Key.AsGiven)); + this.Write(" field cannot be null\");\r\n }\r\n"); + } + } + this.Write(" }\r\n\r\n void IJsonOnSerializing.OnSerializing()\r\n {\r\n"); + foreach (var fieldInfo in this.objectType.FieldInfos) { + if (!fieldInfo.Value.SchemaType.OrNull && DotNetSchemaSupport.IsNullable(fieldInfo.Value.SchemaType)) { + this.Write(" if ("); + this.Write(this.ToStringHelper.ToStringWithCulture(fieldInfo.Key.GetFieldName(TargetLanguage.CSharp))); + this.Write(" is null)\r\n {\r\n throw new ArgumentNullException(\""); + this.Write(this.ToStringHelper.ToStringWithCulture(fieldInfo.Key.AsGiven)); + this.Write(" field cannot be null\");\r\n }\r\n"); + } + } + this.Write(" }\r\n"); + } + this.Write(" }\r\n}\r\n"); + return this.GenerationEnvironment.ToString(); + } + + public string Exports() => this.serFormat switch + { + SerializationFormat.Json when this.needsNullCheck => " : IJsonOnDeserialized, IJsonOnSerializing", + _ => "", + }; + + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class DotNetObjectBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustAlias.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustAlias.cs new file mode 100644 index 0000000000..71d7fb7c59 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustAlias.cs @@ -0,0 +1,318 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.TypeGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class RustAlias : RustAliasBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("; DO NOT EDIT. */\r\n\r\nuse super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.aliasType.ReferencedName.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.aliasType.ReferencedName.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n\r\n"); + if (this.aliasType.Description != null) { + this.Write("/// "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.aliasType.Description)); + this.Write("\r\n"); + } + this.Write("pub type "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.aliasType.SchemaName.GetTypeName(TargetLanguage.Rust))); + this.Write(" = "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.aliasType.ReferencedName.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class RustAliasBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustEnum.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustEnum.cs new file mode 100644 index 0000000000..e054669843 --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustEnum.cs @@ -0,0 +1,322 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.TypeGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class RustEnum : RustEnumBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write("; DO NOT EDIT. */\r\n"); + if (this.hasNonPascalNames) { + this.Write("\r\n#![allow(non_camel_case_types)]\r\n"); + } + this.Write("\r\nuse serde::{Deserialize, Serialize};\r\n\r\n"); + if (this.enumType.Description != null) { + this.Write("/// "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.enumType.Description)); + this.Write("\r\n"); + } + this.Write("#[derive(Serialize, Deserialize, Debug, Clone)]\r\npub enum "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.enumType.SchemaName.GetTypeName(TargetLanguage.Rust))); + this.Write(" {\r\n"); + int index = 0; foreach (var enumValue in this.enumType.EnumValues) { + this.Write(" "); + this.Write(this.ToStringHelper.ToStringWithCulture(enumValue.AsGiven)); + this.Write(",\r\n"); + ++index; } + this.Write("}\r\n"); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class RustEnumBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustObject.cs b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustObject.cs new file mode 100644 index 0000000000..c7681ff99b --- /dev/null +++ b/codegen2/src/Azure.Iot.Operations.TypeGenerator/rust/t4/RustObject.cs @@ -0,0 +1,363 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Azure.Iot.Operations.TypeGenerator +{ + using Azure.Iot.Operations.CodeGeneration; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class RustObject : RustObjectBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); + this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); + this.Write(@"; DO NOT EDIT. */ +#![allow(unused_imports)] + +use std::collections::HashMap; + +use chrono::{DateTime, Utc}; +use derive_builder::Builder; +use iso8601_duration::Duration; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; +"); + foreach (var referencedSchema in this.referencedSchemas) { + if (!referencedSchema.SchemaName.Equals(this.objectType.SchemaName)) { + this.Write("use super::"); + this.Write(this.ToStringHelper.ToStringWithCulture(referencedSchema.SchemaName.GetFileName(TargetLanguage.Rust))); + this.Write("::"); + this.Write(this.ToStringHelper.ToStringWithCulture(referencedSchema.SchemaName.GetTypeName(TargetLanguage.Rust))); + this.Write(";\r\n"); + } + } + this.Write("\r\n"); + if (this.objectType.Description != null) { + this.Write("/// "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.objectType.Description)); + this.Write("\r\n"); + } + this.Write("#[derive(Serialize, Deserialize, Debug, Clone, Builder)]\r\npub struct "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.objectType.SchemaName.GetTypeName(TargetLanguage.Rust))); + this.Write(" {\r\n"); + bool firstField = true; foreach (var fieldInfo in this.objectType.FieldInfos) { + if (!firstField) { + this.Write("\r\n"); + } + if (fieldInfo.Value.Description != null) { + this.Write(" /// "); + this.Write(this.ToStringHelper.ToStringWithCulture(fieldInfo.Value.Description)); + this.Write("\r\n"); + } + if (fieldInfo.Key.GetFieldName(TargetLanguage.Rust) != fieldInfo.Key.AsGiven) { + this.Write(" #[serde(rename = \""); + this.Write(this.ToStringHelper.ToStringWithCulture(fieldInfo.Key.AsGiven)); + this.Write("\")]\r\n"); + } + if (fieldInfo.Value.SchemaType.OrNull) { + if (this.allowSkipping && !fieldInfo.Value.IsRequired) { + this.Write(" #[serde(skip_serializing_if = \"Option::is_none\")]\r\n"); + } + this.Write(" #[builder(default = \"None\")]\r\n"); + } else if (RustSchemaSupport.HasNativeDefault(fieldInfo.Value.SchemaType)) { + this.Write(" #[builder(default)]\r\n"); + } + this.Write(" pub "); + this.Write(this.ToStringHelper.ToStringWithCulture(fieldInfo.Key.GetFieldName(TargetLanguage.Rust))); + this.Write(": "); + this.Write(this.ToStringHelper.ToStringWithCulture(RustSchemaSupport.GetType(fieldInfo.Value.SchemaType, fieldInfo.Value.IsIndirect))); + this.Write(",\r\n"); + firstField = false; } + this.Write("}\r\n"); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class RustObjectBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Dtdl2Wot/.gitignore b/codegen2/src/Dtdl2Wot/.gitignore deleted file mode 100644 index db669da381..0000000000 --- a/codegen2/src/Dtdl2Wot/.gitignore +++ /dev/null @@ -1 +0,0 @@ -**/t4/*.cs diff --git a/codegen2/src/Dtdl2Wot/Array/t4/ArrayThingSchema.cs b/codegen2/src/Dtdl2Wot/Array/t4/ArrayThingSchema.cs new file mode 100644 index 0000000000..3bf0c31f1c --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Array/t4/ArrayThingSchema.cs @@ -0,0 +1,313 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Dtdl2Wot +{ + using System.Collections.Generic; + using System.Linq; + using DTDLParser.Models; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class ArrayThingSchema : ArrayThingSchemaBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.PushIndent(new string(' ', this.indent)); + this.Write("\"type\": \"array\",\r\n\"items\": {\r\n"); + if (this.dtArray.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtArray.Description.First().Value)); + this.Write("\",\r\n"); + } + this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.dtArray.ElementSchema, 2))); + this.Write("\r\n}"); + this.PopIndent(); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class ArrayThingSchemaBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Dtdl2Wot/Command/t4/CommandAffordance.cs b/codegen2/src/Dtdl2Wot/Command/t4/CommandAffordance.cs new file mode 100644 index 0000000000..5f4163e8ed --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Command/t4/CommandAffordance.cs @@ -0,0 +1,444 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Dtdl2Wot +{ + using System.Collections.Generic; + using System.Linq; + using DTDLParser; + using DTDLParser.Models; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class CommandAffordance : CommandAffordanceBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write(" \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Name)); + this.Write("\": {\r\n"); + if (this.dtCommand.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Description.First().Value)); + this.Write("\",\r\n"); + } + if (this.dtCommand.Request != null) { + if (this.usesTypes) { + this.Write(" \"input\": {\r\n"); + if (this.isRequestTransparent) { + if (this.dtCommand.Request.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Request.Description.First().Value)); + this.Write("\",\r\n"); + } else if (this.dtCommand.Request.Schema.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Request.Schema.Description.First().Value)); + this.Write("\",\r\n"); + } + this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.dtCommand.Request.Schema, 8))); + this.Write("\r\n"); + } else { + if (this.dtCommand.Request.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Request.Description.First().Value)); + this.Write("\",\r\n"); + } + this.Write(" \"type\": \"object\",\r\n"); + if (!this.dtCommand.Request.Nullable) { + this.Write(" \"required\": [ \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Request.Name)); + this.Write("\" ],\r\n"); + } + this.Write(" \"properties\": {\r\n \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Request.Name)); + this.Write("\": {\r\n"); + if (!this.dtCommand.Request.Schema.Id.AbsoluteUri.StartsWith("dtmi:dtdl:instance:Schema:") && this.dtCommand.Request.Schema.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Request.Schema.Description.First().Value)); + this.Write("\",\r\n"); + } + this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.dtCommand.Request.Schema, 12))); + this.Write("\r\n }\r\n }\r\n"); + } + this.Write(" },\r\n"); + } else { + this.Write(" \"input\": {\r\n \"type\": \"null\"\r\n },\r\n"); + } + } + if (this.dtCommand.Response != null) { + if (this.usesTypes) { + this.Write(" \"output\": {\r\n"); + if (this.isResponseTransparent) { + if (this.dtCommand.Response.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Response.Description.First().Value)); + this.Write("\",\r\n"); + } else if (this.dtCommand.Response.Schema.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Response.Schema.Description.First().Value)); + this.Write("\",\r\n"); + } + this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.dtCommand.Response.Schema, 8))); + this.Write("\r\n"); + } else { + if (this.dtCommand.Response.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtCommand.Response.Description.First().Value)); + this.Write("\",\r\n"); + } + this.Write(" \"type\": \"object\",\r\n"); + if (!this.dtCommand.Response.Nullable) { + this.Write(" \"required\": [ \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.responseName)); + this.Write("\" ],\r\n"); + } + this.Write(" \"properties\": {\r\n \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.responseName)); + this.Write("\": {\r\n"); + if (this.responseDescription?.Any() ?? false) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.responseDescription.First().Value)); + this.Write("\",\r\n"); + } else if (!this.responseSchema.Id.AbsoluteUri.StartsWith("dtmi:dtdl:instance:Schema:") && this.responseSchema.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.responseSchema.Description.First().Value)); + this.Write("\",\r\n"); + } + this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.responseSchema, 12))); + this.Write("\r\n }\r\n }\r\n"); + } + this.Write(" },\r\n"); + } else { + this.Write(" \"output\": {\r\n \"type\": \"null\"\r\n },\r\n"); + } + } + if (this.isCommandIdempotent) { + this.Write(" \"idempotent\": true,\r\n"); + } + if (this.isCommandCacheable) { + this.Write(" \"safe\": true,\r\n"); + } + this.Write(" \"forms\": [\r\n {\r\n \"contentType\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.contentType)); + this.Write("\",\r\n"); + if (this.isResponseSchemaResult) { + if (this.errorSchemaName != null) { + this.Write(" \"additionalResponses\": [\r\n {\r\n \"success\": false" + + ",\r\n \"schema\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.errorSchemaName)); + this.Write("\"\r\n }\r\n ],\r\n"); + } + if (this.infoSchemaName != null) { + this.Write(" \"dtv:headerInfo\": [\r\n {\r\n \"contentType\": \"appli" + + "cation/json\",\r\n \"schema\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.infoSchemaName)); + this.Write("\"\r\n }\r\n ],\r\n"); + } + if (this.codeEnumeration.Count > 0) { + this.Write(" \"dtv:headerCode\": [\r\n"); + int ix = 1; foreach (KeyValuePair kvp in this.codeEnumeration) { + this.Write(" \""); + this.Write(this.ToStringHelper.ToStringWithCulture(kvp.Key)); + this.Write("\""); + this.Write(this.ToStringHelper.ToStringWithCulture(ix < this.codeEnumeration.Count ? "," : "")); + this.Write("\r\n"); + ix++; } + this.Write(" ],\r\n"); + } + } + if (this.serviceGroupId != null) { + this.Write(" \"dtv:serviceGroupId\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.serviceGroupId)); + this.Write("\",\r\n"); + } + this.Write(" \"dtv:topic\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.commandTopic ?? "")); + this.Write("\",\r\n \"op\": \"invokeaction\"\r\n }\r\n ]\r\n }"); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class CommandAffordanceBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Dtdl2Wot/Enum/t4/EnumThingSchema.cs b/codegen2/src/Dtdl2Wot/Enum/t4/EnumThingSchema.cs new file mode 100644 index 0000000000..03141a4a59 --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Enum/t4/EnumThingSchema.cs @@ -0,0 +1,321 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Dtdl2Wot +{ + using System.Collections.Generic; + using System.Linq; + using DTDLParser.Models; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class EnumThingSchema : EnumThingSchemaBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.PushIndent(new string(' ', this.indent)); + if (CanExpressAsEnum(this.dtEnum)) { + this.Write("\"title\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.enumTitle)); + this.Write("\",\r\n\"type\": \"string\",\r\n\"enum\": [\r\n"); + int ix1 = 1; foreach (var enumValue in this.dtEnum.EnumValues.OrderBy(ev => ev.EnumValue)) { + this.Write(" \""); + this.Write(this.ToStringHelper.ToStringWithCulture(enumValue.Name)); + this.Write("\""); + this.Write(this.ToStringHelper.ToStringWithCulture(ix1 < this.dtEnum.EnumValues.Count ? "," : "")); + this.Write("\r\n"); + ix1++; } + this.Write("]"); + } else if (this.valueSchema == "integer") { + this.Write("\"type\": \"integer\",\r\n\"minimum\": -2147483648,\r\n\"maximum\": 2147483647"); + } else { + this.Write("\"type\": \"string\""); + } this.PopIndent(); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class EnumThingSchemaBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.cs b/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.cs new file mode 100644 index 0000000000..cb05e81071 --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Interface/t4/InterfaceThing.cs @@ -0,0 +1,430 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Dtdl2Wot +{ + using System.Collections.Generic; + using System.Linq; + using DTDLParser; + using DTDLParser.Models; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class InterfaceThing : InterfaceThingBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write("{\r\n \"@context\": [\r\n \"https://www.w3.org/2022/wot/td/v1.1\",\r\n { \"dtv\": \"htt" + + "p://azure.com/DigitalTwins/dtmi#\" }\r\n ],\r\n \"@type\": \"tm:ThingModel\",\r\n \"title" + + "\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.serviceName.AsGiven)); + this.Write("\",\r\n \"links\": [\r\n {\r\n \"rel\": \"dtv:naming\",\r\n \"href\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaNamesPath)); + this.Write("\",\r\n \"type\": \"application/json\"\r\n }\r\n ],\r\n"); + if (this.errorSchemas.Any() || this.namespacedEnums.Any()) { + this.Write(" \"schemaDefinitions\": {\r\n"); + int ix1 = 1; foreach (KeyValuePair errorSchema in this.errorSchemas) { + this.Write(" \""); + this.Write(this.ToStringHelper.ToStringWithCulture(errorSchema.Key)); + this.Write("\": {\r\n"); + if (errorSchema.Value.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(errorSchema.Value.Description.First().Value)); + this.Write("\",\r\n"); + } + this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(errorSchema.Value, 6))); + this.Write("\r\n }"); + this.Write(this.ToStringHelper.ToStringWithCulture(ix1 < this.errorSchemas.Count + this.namespacedEnums.Count ? "," : "")); + this.Write("\r\n"); + ix1++; } + foreach (KeyValuePair namespacedEnum in this.namespacedEnums) { + this.Write(" \""); + this.Write(this.ToStringHelper.ToStringWithCulture(namespacedEnum.Key)); + this.Write("\": {\r\n \"type\": \"object\",\r\n \"const\": {\r\n"); + int ix2 = 1; foreach (DTEnumValueInfo enumValue in namespacedEnum.Value.EnumValues) { + this.Write(" \""); + this.Write(this.ToStringHelper.ToStringWithCulture(enumValue.Name)); + this.Write("\": "); + this.Write(this.ToStringHelper.ToStringWithCulture((ThingDescriber.GetPrimitiveType(namespacedEnum.Value.ValueSchema.Id) == "integer") ? enumValue.EnumValue : $"\"{enumValue.EnumValue}\"")); + this.Write(this.ToStringHelper.ToStringWithCulture(ix2 < namespacedEnum.Value.EnumValues.Count ? "," : "")); + this.Write("\r\n"); + ix2++; } + this.Write(" },\r\n"); + if (namespacedEnum.Value.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(namespacedEnum.Value.Description.First().Value)); + this.Write("\",\r\n"); + } + this.Write(" \"properties\": {\r\n"); + ix2 = 1; foreach (DTEnumValueInfo enumValue in namespacedEnum.Value.EnumValues) { + this.Write(" \""); + this.Write(this.ToStringHelper.ToStringWithCulture(enumValue.Name)); + this.Write("\": {\r\n"); + if (enumValue.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(enumValue.Description.First().Value)); + this.Write("\",\r\n"); + } + this.Write(" \"type\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(ThingDescriber.GetPrimitiveType(namespacedEnum.Value.ValueSchema.Id))); + this.Write("\"\r\n }"); + this.Write(this.ToStringHelper.ToStringWithCulture(ix2 < namespacedEnum.Value.EnumValues.Count ? "," : "")); + this.Write("\r\n"); + ix2++; } + this.Write(" }\r\n }"); + this.Write(this.ToStringHelper.ToStringWithCulture(ix1 < this.errorSchemas.Count + this.namespacedEnums.Count ? "," : "")); + this.Write("\r\n"); + ix1++; } + this.Write(" },\r\n"); + } + if (this.aggregateTelemetries || this.aggregateProperties) { + this.Write(" \"forms\": [\r\n"); + if (this.aggregateTelemetries) { + this.Write(" {\r\n \"contentType\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.contentType)); + this.Write("\",\r\n \"dtv:topic\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.telemetryTopic)); + this.Write("\",\r\n \"op\": \"subscribeallevents\"\r\n }"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.aggregateProperties ? "," : "")); + this.Write("\r\n"); + } + if (this.aggregateProperties) { + if (this.dtInterface.Properties.Any(p => p.Value.Writable)) { + this.Write(" {\r\n \"contentType\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.contentType)); + this.Write("\",\r\n"); + if (this.dtInterface.Properties.Values.Any(p => p.Writable && IsSchemaPropertyResult(p.Schema) && ((DTObjectInfo)p.Schema).Fields.Any(f => IsFieldWriteError(f)))) { + this.Write(" \"additionalResponses\": [\r\n {\r\n \"success\": false\r\n }\r" + + "\n ],\r\n"); + } + this.Write(" \"dtv:topic\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyTopic.Replace(DtdlMqttTopicTokens.PropertyAction, "write"))); + this.Write("\",\r\n \"op\": \"writemultipleproperties\"\r\n },\r\n"); + } + this.Write(" {\r\n \"contentType\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.contentType)); + this.Write("\",\r\n"); + if (this.dtInterface.Properties.Values.Any(p => IsSchemaPropertyResult(p.Schema) && ((DTObjectInfo)p.Schema).Fields.Any(f => IsFieldReadError(f)))) { + this.Write(" \"additionalResponses\": [\r\n {\r\n \"success\": false\r\n }\r" + + "\n ],\r\n"); + } + this.Write(" \"dtv:topic\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyTopic.Replace(DtdlMqttTopicTokens.PropertyAction, "read"))); + this.Write("\",\r\n \"op\": \"readallproperties\"\r\n }\r\n"); + } + this.Write(" ],\r\n"); + } + this.Write(" \"actions\": {\r\n"); + int ix = 1; foreach (KeyValuePair dtCommand in this.dtInterface.Commands) { + this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetCommandAffordance(dtCommand.Value, this.usesTypes, this.contentType, this.commandTopic, this.cmdServiceGroupId))); + this.Write(this.ToStringHelper.ToStringWithCulture(ix < this.dtInterface.Commands.Count ? "," : "")); + this.Write("\r\n"); + ix++; } + this.Write(" },\r\n \"properties\": {\r\n"); + ix = 1; foreach (KeyValuePair dtProperty in this.dtInterface.Properties) { + this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetPropertyAffordance(dtProperty.Value, this.usesTypes, this.contentType, this.propertyTopic))); + this.Write(this.ToStringHelper.ToStringWithCulture(ix < this.dtInterface.Properties.Count ? "," : "")); + this.Write("\r\n"); + ix++; } + this.Write(" },\r\n \"events\": {\r\n"); + ix = 1; foreach (KeyValuePair dtTelemetry in this.dtInterface.Telemetries) { + this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTelemetryAffordance(dtTelemetry.Value, this.usesTypes, this.contentType, this.telemetryTopic, this.telemServiceGroupId))); + this.Write(this.ToStringHelper.ToStringWithCulture(ix < this.dtInterface.Telemetries.Count ? "," : "")); + this.Write("\r\n"); + ix++; } + this.Write(" }\r\n}\r\n"); + return this.GenerationEnvironment.ToString(); + } + +private bool IsSchemaPropertyResult(DTSchemaInfo dtSchema) => dtSchema != null && dtSchema.SupplementalTypes.Contains(new Dtmi(string.Format(DtdlMqttExtensionValues.PropertyResultAdjunctTypeFormat, this.mqttVersion))); + +private bool IsFieldReadError(DTFieldInfo dtField) => dtField.SupplementalTypes.Contains(new Dtmi(string.Format(DtdlMqttExtensionValues.ReadErrorAdjunctTypeFormat, this.mqttVersion))); + +private bool IsFieldWriteError(DTFieldInfo dtField) => dtField.SupplementalTypes.Contains(new Dtmi(string.Format(DtdlMqttExtensionValues.WriteErrorAdjunctTypeFormat, this.mqttVersion))); + + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class InterfaceThingBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Dtdl2Wot/Map/t4/MapThingSchema.cs b/codegen2/src/Dtdl2Wot/Map/t4/MapThingSchema.cs new file mode 100644 index 0000000000..4160eedebd --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Map/t4/MapThingSchema.cs @@ -0,0 +1,313 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Dtdl2Wot +{ + using System.Collections.Generic; + using System.Linq; + using DTDLParser.Models; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class MapThingSchema : MapThingSchemaBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.PushIndent(new string(' ', this.indent)); + this.Write("\"type\": \"object\",\r\n\"dtv:additionalProperties\": {\r\n"); + if (this.dtMap.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtMap.Description.First().Value)); + this.Write("\",\r\n"); + } + this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.dtMap.MapValue.Schema, 2))); + this.Write("\r\n}"); + this.PopIndent(); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class MapThingSchemaBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Dtdl2Wot/Map/t4/PlaceholderThingSchema.cs b/codegen2/src/Dtdl2Wot/Map/t4/PlaceholderThingSchema.cs new file mode 100644 index 0000000000..8a9d370342 --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Map/t4/PlaceholderThingSchema.cs @@ -0,0 +1,307 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Dtdl2Wot +{ + using System.Collections.Generic; + using System.Linq; + using DTDLParser.Models; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class PlaceholderThingSchema : PlaceholderThingSchemaBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.PushIndent(new string(' ', this.indent)); + this.Write("\"dtv:placeholder\": true,\r\n"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.dtMap.MapValue.Schema, 0))); + this.PopIndent(); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class PlaceholderThingSchemaBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Dtdl2Wot/Object/t4/ObjectThingSchema.cs b/codegen2/src/Dtdl2Wot/Object/t4/ObjectThingSchema.cs new file mode 100644 index 0000000000..73f307b70f --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Object/t4/ObjectThingSchema.cs @@ -0,0 +1,343 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Dtdl2Wot +{ + using System.Collections.Generic; + using System.Linq; + using DTDLParser.Models; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class ObjectThingSchema : ObjectThingSchemaBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.PushIndent(new string(' ', this.indent)); + this.Write("\"title\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.objectTitle)); + this.Write("\",\r\n\"type\": \"object\",\r\n"); + if (this.objectFields.Any(f => IsFieldRequired(f))) { + this.Write("\"required\": [ "); + this.Write(this.ToStringHelper.ToStringWithCulture(string.Join(", ", this.objectFields.Where(f => IsFieldRequired(f)).Select(f => $"\"{f.Name}\"")))); + this.Write(" ],\r\n"); + } + if (this.objectFields.Any(f => IsFieldMessage(f))) { + this.Write("\"dtv:errorMessage\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.objectFields.First(f => IsFieldMessage(f)).Name)); + this.Write("\",\r\n"); + } + this.Write("\"properties\": {\r\n"); + int ix2 = 1; foreach (var dtField in this.objectFields) { + this.Write(" \""); + this.Write(this.ToStringHelper.ToStringWithCulture(dtField.Name)); + this.Write("\": {\r\n"); + if (dtField.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(dtField.Description.First().Value)); + this.Write("\",\r\n"); + } else if (!dtField.Schema.Id.AbsoluteUri.StartsWith("dtmi:dtdl:instance:Schema:") && dtField.Schema.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(dtField.Schema.Description.First().Value)); + this.Write("\",\r\n"); + } + this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(dtField.Schema, 4))); + this.Write("\r\n }"); + this.Write(this.ToStringHelper.ToStringWithCulture(ix2 < this.objectFields.Count ? "," : "")); + this.Write("\r\n"); + ix2++; } + this.Write("}"); + this.PopIndent(); + return this.GenerationEnvironment.ToString(); + } + + private bool IsFieldRequired(DTFieldInfo dtField) => dtField.SupplementalTypes.Any(t => DtdlMqttExtensionValues.RequiredAdjunctTypeRegex.IsMatch(t.AbsoluteUri)); + + private bool IsFieldMessage(DTFieldInfo dtField) => dtField.SupplementalTypes.Contains(this.errorMessageAdjunctTypeId); + + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class ObjectThingSchemaBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.cs b/codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.cs new file mode 100644 index 0000000000..886bb31307 --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Property/t4/PropertyAffordance.cs @@ -0,0 +1,351 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Dtdl2Wot +{ + using System.Collections.Generic; + using System.Linq; + using DTDLParser; + using DTDLParser.Models; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class PropertyAffordance : PropertyAffordanceBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write(" \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtProperty.Name)); + this.Write("\": {\r\n"); + if (this.dtProperty.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtProperty.Description.First().Value)); + this.Write("\",\r\n"); + } + if (this.usesTypes) { + this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.valueSchema, 6, this.isSchemaFragmented))); + this.Write(",\r\n \"readOnly\": "); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtProperty.Writable ? "false" : "true")); + this.Write(",\r\n"); + } + this.Write(" \"forms\": [\r\n"); + if (this.dtProperty.Writable) { + this.Write(" {\r\n \"contentType\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.contentType)); + this.Write("\",\r\n"); + if (this.isSchemaPropertyResult && this.writeErrorSchemaName != null) { + this.Write(" \"additionalResponses\": [\r\n {\r\n \"success\": false" + + ",\r\n \"schema\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.writeErrorSchemaName)); + this.Write("\"\r\n }\r\n ],\r\n"); + } + if (this.separate) { + this.Write(" \"dtv:topic\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyTopic.Replace(DtdlMqttTopicTokens.PropertyAction, "write"))); + this.Write("\",\r\n"); + } + this.Write(" \"op\": \"writeproperty\"\r\n },\r\n"); + } + this.Write(" {\r\n \"contentType\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.contentType)); + this.Write("\",\r\n"); + if (this.isSchemaPropertyResult && this.readErrorSchemaName != null) { + this.Write(" \"additionalResponses\": [\r\n {\r\n \"success\": false" + + ",\r\n \"schema\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.readErrorSchemaName)); + this.Write("\"\r\n }\r\n ],\r\n"); + } + if (this.separate) { + this.Write(" \"dtv:topic\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyTopic.Replace(DtdlMqttTopicTokens.PropertyAction, "read"))); + this.Write("\",\r\n"); + } + this.Write(" \"op\": \"readproperty\"\r\n }\r\n ]\r\n }"); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class PropertyAffordanceBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} diff --git a/codegen2/src/Dtdl2Wot/Telemetry/t4/TelemetryAffordance.cs b/codegen2/src/Dtdl2Wot/Telemetry/t4/TelemetryAffordance.cs new file mode 100644 index 0000000000..9a70a2505d --- /dev/null +++ b/codegen2/src/Dtdl2Wot/Telemetry/t4/TelemetryAffordance.cs @@ -0,0 +1,333 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version: 18.0.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +namespace Dtdl2Wot +{ + using System.Collections.Generic; + using System.Linq; + using DTDLParser; + using DTDLParser.Models; + using System; + + /// + /// Class to produce the template output + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public partial class TelemetryAffordance : TelemetryAffordanceBase + { + /// + /// Create the template output + /// + public virtual string TransformText() + { + this.Write(" \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtTelemetry.Name)); + this.Write("\": {\r\n"); + if (this.dtTelemetry.Description.Any()) { + this.Write(" \"description\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.dtTelemetry.Description.First().Value)); + this.Write("\",\r\n"); + } + if (this.usesTypes) { + this.Write(" \"data\": {\r\n"); + this.Write(this.ToStringHelper.ToStringWithCulture(this.thingDescriber.GetTypeAndAddenda(this.dtTelemetry.Schema, 8))); + this.Write("\r\n },\r\n"); + } else { + this.Write(" \"data\": {\r\n \"type\": \"null\"\r\n },\r\n"); + } + this.Write(" \"forms\": [\r\n {\r\n \"contentType\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.contentType)); + this.Write("\",\r\n"); + if (this.serviceGroupId != null) { + this.Write(" \"dtv:serviceGroupId\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.serviceGroupId)); + this.Write("\",\r\n"); + } + if (this.separate) { + this.Write(" \"dtv:topic\": \""); + this.Write(this.ToStringHelper.ToStringWithCulture(this.telemetryTopic)); + this.Write("\",\r\n"); + } + this.Write(" \"op\": \"subscribeevent\"\r\n }\r\n ]\r\n }"); + return this.GenerationEnvironment.ToString(); + } + } + #region Base class + /// + /// Base class for this transformation + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")] + public class TelemetryAffordanceBase + { + #region Fields + private global::System.Text.StringBuilder generationEnvironmentField; + private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; + private global::System.Collections.Generic.List indentLengthsField; + private string currentIndentField = ""; + private bool endsWithNewline; + private global::System.Collections.Generic.IDictionary sessionField; + #endregion + #region Properties + /// + /// The string builder that generation-time code is using to assemble generated output + /// + public System.Text.StringBuilder GenerationEnvironment + { + get + { + if ((this.generationEnvironmentField == null)) + { + this.generationEnvironmentField = new global::System.Text.StringBuilder(); + } + return this.generationEnvironmentField; + } + set + { + this.generationEnvironmentField = value; + } + } + /// + /// The error collection for the generation process + /// + public System.CodeDom.Compiler.CompilerErrorCollection Errors + { + get + { + if ((this.errorsField == null)) + { + this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); + } + return this.errorsField; + } + } + /// + /// A list of the lengths of each indent that was added with PushIndent + /// + private System.Collections.Generic.List indentLengths + { + get + { + if ((this.indentLengthsField == null)) + { + this.indentLengthsField = new global::System.Collections.Generic.List(); + } + return this.indentLengthsField; + } + } + /// + /// Gets the current indent we use when adding lines to the output + /// + public string CurrentIndent + { + get + { + return this.currentIndentField; + } + } + /// + /// Current transformation session + /// + public virtual global::System.Collections.Generic.IDictionary Session + { + get + { + return this.sessionField; + } + set + { + this.sessionField = value; + } + } + #endregion + #region Transform-time helpers + /// + /// Write text directly into the generated output + /// + public void Write(string textToAppend) + { + if (string.IsNullOrEmpty(textToAppend)) + { + return; + } + // If we're starting off, or if the previous text ended with a newline, + // we have to append the current indent first. + if (((this.GenerationEnvironment.Length == 0) + || this.endsWithNewline)) + { + this.GenerationEnvironment.Append(this.currentIndentField); + this.endsWithNewline = false; + } + // Check if the current text ends with a newline + if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) + { + this.endsWithNewline = true; + } + // This is an optimization. If the current indent is "", then we don't have to do any + // of the more complex stuff further down. + if ((this.currentIndentField.Length == 0)) + { + this.GenerationEnvironment.Append(textToAppend); + return; + } + // Everywhere there is a newline in the text, add an indent after it + textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); + // If the text ends with a newline, then we should strip off the indent added at the very end + // because the appropriate indent will be added when the next time Write() is called + if (this.endsWithNewline) + { + this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); + } + else + { + this.GenerationEnvironment.Append(textToAppend); + } + } + /// + /// Write text directly into the generated output + /// + public void WriteLine(string textToAppend) + { + this.Write(textToAppend); + this.GenerationEnvironment.AppendLine(); + this.endsWithNewline = true; + } + /// + /// Write formatted text directly into the generated output + /// + public void Write(string format, params object[] args) + { + this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Write formatted text directly into the generated output + /// + public void WriteLine(string format, params object[] args) + { + this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); + } + /// + /// Raise an error + /// + public void Error(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + this.Errors.Add(error); + } + /// + /// Raise a warning + /// + public void Warning(string message) + { + System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); + error.ErrorText = message; + error.IsWarning = true; + this.Errors.Add(error); + } + /// + /// Increase the indent + /// + public void PushIndent(string indent) + { + if ((indent == null)) + { + throw new global::System.ArgumentNullException("indent"); + } + this.currentIndentField = (this.currentIndentField + indent); + this.indentLengths.Add(indent.Length); + } + /// + /// Remove the last indent that was added with PushIndent + /// + public string PopIndent() + { + string returnValue = ""; + if ((this.indentLengths.Count > 0)) + { + int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; + this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); + if ((indentLength > 0)) + { + returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); + this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); + } + } + return returnValue; + } + /// + /// Remove any indentation + /// + public void ClearIndent() + { + this.indentLengths.Clear(); + this.currentIndentField = ""; + } + #endregion + #region ToString Helpers + /// + /// Utility class to produce culture-oriented representation of an object as a string. + /// + public class ToStringInstanceHelper + { + private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; + /// + /// Gets or sets format provider to be used by ToStringWithCulture method. + /// + public System.IFormatProvider FormatProvider + { + get + { + return this.formatProviderField ; + } + set + { + if ((value != null)) + { + this.formatProviderField = value; + } + } + } + /// + /// This is called from the compile/run appdomain to convert objects within an expression block to a string + /// + public string ToStringWithCulture(object objectToConvert) + { + if ((objectToConvert == null)) + { + throw new global::System.ArgumentNullException("objectToConvert"); + } + System.Type t = objectToConvert.GetType(); + System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { + typeof(System.IFormatProvider)}); + if ((method == null)) + { + return objectToConvert.ToString(); + } + else + { + return ((string)(method.Invoke(objectToConvert, new object[] { + this.formatProviderField }))); + } + } + } + private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); + /// + /// Helper to produce culture-oriented representation of an object as a string + /// + public ToStringInstanceHelper ToStringHelper + { + get + { + return this.toStringHelperField; + } + } + #endregion + } + #endregion +} From 98c0da7a4d60412f3da9972eb8d7cf3f4390729d Mon Sep 17 00:00:00 2001 From: "John (JD) Douceur" Date: Wed, 21 Jan 2026 12:30:59 -0800 Subject: [PATCH 45/52] add 19 more test cases for Golden Path properties --- .../failure/IntegerConstDecimalPlaces.json | 16 ++++++++ .../failure/IntegerConstScaleFactor.json | 16 ++++++++ .../IntegerDecimalPlacesNotInteger.json | 16 ++++++++ ...IntegerDecimalPlacesWithoutAovContext.json | 16 ++++++++ .../failure/IntegerScaleFactorNotInteger.json | 16 ++++++++ .../IntegerScaleFactorWithoutAovContext.json | 16 ++++++++ .../failure/NumberConstDecimalPlaces.json | 16 ++++++++ .../failure/NumberConstScaleFactor.json | 16 ++++++++ .../NumberDecimalPlacesNotInteger.json | 16 ++++++++ .../NumberDecimalPlacesWithoutAovContext.json | 16 ++++++++ .../NumberScaleFactorWithoutAovContext.json | 16 ++++++++ .../failure/ObjectPropertyNamespaceEmpty.json | 16 ++++++++ ...ectPropertyNamespaceWithoutAovContext.json | 16 ++++++++ .../failure/ObjectTypeRefEmpty.json | 16 ++++++++ .../ObjectTypeRefWithoutAovContext.json | 16 ++++++++ .../failure/StringDecimalPlaces.json | 16 ++++++++ .../test-cases/failure/StringScaleFactor.json | 16 ++++++++ .../success/ObjectPropertyNamespace.json | 7 ++++ .../test-cases/success/ObjectTypeRef.json | 7 ++++ .../IntegerConstDecimalPlaces.TM.json | 32 +++++++++++++++ .../IntegerConstScaleFactor.TM.json | 32 +++++++++++++++ .../IntegerDecimalPlacesNotInteger.TM.json | 26 ++++++++++++ ...egerDecimalPlacesWithoutAovContext.TM.json | 25 +++++++++++ .../IntegerScaleFactorNotInteger.TM.json | 26 ++++++++++++ ...ntegerScaleFactorWithoutAovContext.TM.json | 25 +++++++++++ .../NumberConstDecimalPlaces.TM.json | 32 +++++++++++++++ .../NumberConstScaleFactor.TM.json | 32 +++++++++++++++ .../NumberDecimalPlacesNotInteger.TM.json | 26 ++++++++++++ ...mberDecimalPlacesWithoutAovContext.TM.json | 25 +++++++++++ ...NumberScaleFactorWithoutAovContext.TM.json | 25 +++++++++++ .../ObjectPropertyNamespaceEmpty.TM.json | 41 +++++++++++++++++++ ...PropertyNamespaceWithoutAovContext.TM.json | 40 ++++++++++++++++++ .../ObjectTypeRefEmpty.TM.json | 41 +++++++++++++++++++ .../ObjectTypeRefWithoutAovContext.TM.json | 40 ++++++++++++++++++ .../StringDecimalPlaces.TM.json | 26 ++++++++++++ .../StringScaleFactor.TM.json | 26 ++++++++++++ .../valid/ObjectPropertyNamespace.TM.json | 41 +++++++++++++++++++ .../thing-models/valid/ObjectTypeRef.TM.json | 41 +++++++++++++++++++ 38 files changed, 888 insertions(+) create mode 100644 codegen2/test/test-cases/failure/IntegerConstDecimalPlaces.json create mode 100644 codegen2/test/test-cases/failure/IntegerConstScaleFactor.json create mode 100644 codegen2/test/test-cases/failure/IntegerDecimalPlacesNotInteger.json create mode 100644 codegen2/test/test-cases/failure/IntegerDecimalPlacesWithoutAovContext.json create mode 100644 codegen2/test/test-cases/failure/IntegerScaleFactorNotInteger.json create mode 100644 codegen2/test/test-cases/failure/IntegerScaleFactorWithoutAovContext.json create mode 100644 codegen2/test/test-cases/failure/NumberConstDecimalPlaces.json create mode 100644 codegen2/test/test-cases/failure/NumberConstScaleFactor.json create mode 100644 codegen2/test/test-cases/failure/NumberDecimalPlacesNotInteger.json create mode 100644 codegen2/test/test-cases/failure/NumberDecimalPlacesWithoutAovContext.json create mode 100644 codegen2/test/test-cases/failure/NumberScaleFactorWithoutAovContext.json create mode 100644 codegen2/test/test-cases/failure/ObjectPropertyNamespaceEmpty.json create mode 100644 codegen2/test/test-cases/failure/ObjectPropertyNamespaceWithoutAovContext.json create mode 100644 codegen2/test/test-cases/failure/ObjectTypeRefEmpty.json create mode 100644 codegen2/test/test-cases/failure/ObjectTypeRefWithoutAovContext.json create mode 100644 codegen2/test/test-cases/failure/StringDecimalPlaces.json create mode 100644 codegen2/test/test-cases/failure/StringScaleFactor.json create mode 100644 codegen2/test/test-cases/success/ObjectPropertyNamespace.json create mode 100644 codegen2/test/test-cases/success/ObjectTypeRef.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/IntegerConstDecimalPlaces.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/IntegerConstScaleFactor.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/IntegerDecimalPlacesNotInteger.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/IntegerDecimalPlacesWithoutAovContext.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/IntegerScaleFactorNotInteger.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/IntegerScaleFactorWithoutAovContext.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/NumberConstDecimalPlaces.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/NumberConstScaleFactor.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/NumberDecimalPlacesNotInteger.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/NumberDecimalPlacesWithoutAovContext.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/NumberScaleFactorWithoutAovContext.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/ObjectPropertyNamespaceEmpty.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/ObjectPropertyNamespaceWithoutAovContext.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/ObjectTypeRefEmpty.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/ObjectTypeRefWithoutAovContext.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/StringDecimalPlaces.TM.json create mode 100644 codegen2/test/thing-models/invalidAioBinding/StringScaleFactor.TM.json create mode 100644 codegen2/test/thing-models/valid/ObjectPropertyNamespace.TM.json create mode 100644 codegen2/test/thing-models/valid/ObjectTypeRef.TM.json diff --git a/codegen2/test/test-cases/failure/IntegerConstDecimalPlaces.json b/codegen2/test/test-cases/failure/IntegerConstDecimalPlaces.json new file mode 100644 index 0000000000..ba88983d97 --- /dev/null +++ b/codegen2/test/test-cases/failure/IntegerConstDecimalPlaces.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/IntegerConstDecimalPlaces.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "IntegerConstDecimalPlaces.TM.json", + "line": 13, + "cfLine": 12, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/IntegerConstScaleFactor.json b/codegen2/test/test-cases/failure/IntegerConstScaleFactor.json new file mode 100644 index 0000000000..9b3097459e --- /dev/null +++ b/codegen2/test/test-cases/failure/IntegerConstScaleFactor.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/IntegerConstScaleFactor.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "IntegerConstScaleFactor.TM.json", + "line": 13, + "cfLine": 12, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/IntegerDecimalPlacesNotInteger.json b/codegen2/test/test-cases/failure/IntegerDecimalPlacesNotInteger.json new file mode 100644 index 0000000000..55acd87eae --- /dev/null +++ b/codegen2/test/test-cases/failure/IntegerDecimalPlacesNotInteger.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/IntegerDecimalPlacesNotInteger.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "IntegerDecimalPlacesNotInteger.TM.json", + "line": 14, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/IntegerDecimalPlacesWithoutAovContext.json b/codegen2/test/test-cases/failure/IntegerDecimalPlacesWithoutAovContext.json new file mode 100644 index 0000000000..7b72f4f9f1 --- /dev/null +++ b/codegen2/test/test-cases/failure/IntegerDecimalPlacesWithoutAovContext.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/IntegerDecimalPlacesWithoutAovContext.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "IntegerDecimalPlacesWithoutAovContext.TM.json", + "line": 13, + "cfLine": 2, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/IntegerScaleFactorNotInteger.json b/codegen2/test/test-cases/failure/IntegerScaleFactorNotInteger.json new file mode 100644 index 0000000000..7acb327dd1 --- /dev/null +++ b/codegen2/test/test-cases/failure/IntegerScaleFactorNotInteger.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/IntegerScaleFactorNotInteger.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "IntegerScaleFactorNotInteger.TM.json", + "line": 14, + "cfLine": 13, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/IntegerScaleFactorWithoutAovContext.json b/codegen2/test/test-cases/failure/IntegerScaleFactorWithoutAovContext.json new file mode 100644 index 0000000000..3ec2eca4dd --- /dev/null +++ b/codegen2/test/test-cases/failure/IntegerScaleFactorWithoutAovContext.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/IntegerScaleFactorWithoutAovContext.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "IntegerScaleFactorWithoutAovContext.TM.json", + "line": 13, + "cfLine": 2, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/NumberConstDecimalPlaces.json b/codegen2/test/test-cases/failure/NumberConstDecimalPlaces.json new file mode 100644 index 0000000000..766e82f46f --- /dev/null +++ b/codegen2/test/test-cases/failure/NumberConstDecimalPlaces.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/NumberConstDecimalPlaces.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "NumberConstDecimalPlaces.TM.json", + "line": 13, + "cfLine": 12, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/NumberConstScaleFactor.json b/codegen2/test/test-cases/failure/NumberConstScaleFactor.json new file mode 100644 index 0000000000..928e9c7ffb --- /dev/null +++ b/codegen2/test/test-cases/failure/NumberConstScaleFactor.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/NumberConstScaleFactor.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "NumberConstScaleFactor.TM.json", + "line": 13, + "cfLine": 12, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/NumberDecimalPlacesNotInteger.json b/codegen2/test/test-cases/failure/NumberDecimalPlacesNotInteger.json new file mode 100644 index 0000000000..378dfdf451 --- /dev/null +++ b/codegen2/test/test-cases/failure/NumberDecimalPlacesNotInteger.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/NumberDecimalPlacesNotInteger.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "TypeMismatch", + "filename": "NumberDecimalPlacesNotInteger.TM.json", + "line": 14, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/NumberDecimalPlacesWithoutAovContext.json b/codegen2/test/test-cases/failure/NumberDecimalPlacesWithoutAovContext.json new file mode 100644 index 0000000000..5dfe258f5e --- /dev/null +++ b/codegen2/test/test-cases/failure/NumberDecimalPlacesWithoutAovContext.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/NumberDecimalPlacesWithoutAovContext.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "NumberDecimalPlacesWithoutAovContext.TM.json", + "line": 13, + "cfLine": 2, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/NumberScaleFactorWithoutAovContext.json b/codegen2/test/test-cases/failure/NumberScaleFactorWithoutAovContext.json new file mode 100644 index 0000000000..b970950f97 --- /dev/null +++ b/codegen2/test/test-cases/failure/NumberScaleFactorWithoutAovContext.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/NumberScaleFactorWithoutAovContext.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "NumberScaleFactorWithoutAovContext.TM.json", + "line": 13, + "cfLine": 2, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/ObjectPropertyNamespaceEmpty.json b/codegen2/test/test-cases/failure/ObjectPropertyNamespaceEmpty.json new file mode 100644 index 0000000000..33e025b599 --- /dev/null +++ b/codegen2/test/test-cases/failure/ObjectPropertyNamespaceEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ObjectPropertyNamespaceEmpty.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "ObjectPropertyNamespaceEmpty.TM.json", + "line": 15, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/ObjectPropertyNamespaceWithoutAovContext.json b/codegen2/test/test-cases/failure/ObjectPropertyNamespaceWithoutAovContext.json new file mode 100644 index 0000000000..fa0452da7c --- /dev/null +++ b/codegen2/test/test-cases/failure/ObjectPropertyNamespaceWithoutAovContext.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ObjectPropertyNamespaceWithoutAovContext.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "ObjectPropertyNamespaceWithoutAovContext.TM.json", + "line": 14, + "cfLine": 2, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/ObjectTypeRefEmpty.json b/codegen2/test/test-cases/failure/ObjectTypeRefEmpty.json new file mode 100644 index 0000000000..be3b23230c --- /dev/null +++ b/codegen2/test/test-cases/failure/ObjectTypeRefEmpty.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ObjectTypeRefEmpty.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyEmpty", + "filename": "ObjectTypeRefEmpty.TM.json", + "line": 12, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/ObjectTypeRefWithoutAovContext.json b/codegen2/test/test-cases/failure/ObjectTypeRefWithoutAovContext.json new file mode 100644 index 0000000000..86e2828a35 --- /dev/null +++ b/codegen2/test/test-cases/failure/ObjectTypeRefWithoutAovContext.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/ObjectTypeRefWithoutAovContext.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyInvalid", + "filename": "ObjectTypeRefWithoutAovContext.TM.json", + "line": 11, + "cfLine": 2, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/StringDecimalPlaces.json b/codegen2/test/test-cases/failure/StringDecimalPlaces.json new file mode 100644 index 0000000000..508e95db8a --- /dev/null +++ b/codegen2/test/test-cases/failure/StringDecimalPlaces.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/StringDecimalPlaces.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "StringDecimalPlaces.TM.json", + "line": 14, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/failure/StringScaleFactor.json b/codegen2/test/test-cases/failure/StringScaleFactor.json new file mode 100644 index 0000000000..7d4ddd28ea --- /dev/null +++ b/codegen2/test/test-cases/failure/StringScaleFactor.json @@ -0,0 +1,16 @@ +{ + "success": false, + "commandLine": { + "thingFiles": [ "invalidAioBinding/StringScaleFactor.TM.json" ], + "lang": "none" + }, + "errors": [ + { + "condition": "PropertyUnsupported", + "filename": "StringScaleFactor.TM.json", + "line": 14, + "cfLine": 0, + "crossRef": "" + } + ] +} diff --git a/codegen2/test/test-cases/success/ObjectPropertyNamespace.json b/codegen2/test/test-cases/success/ObjectPropertyNamespace.json new file mode 100644 index 0000000000..b5a40567c3 --- /dev/null +++ b/codegen2/test/test-cases/success/ObjectPropertyNamespace.json @@ -0,0 +1,7 @@ +{ + "success": true, + "commandLine": { + "thingFiles": [ "valid/ObjectPropertyNamespace.TM.json" ], + "lang": "none" + } +} diff --git a/codegen2/test/test-cases/success/ObjectTypeRef.json b/codegen2/test/test-cases/success/ObjectTypeRef.json new file mode 100644 index 0000000000..4d7779462f --- /dev/null +++ b/codegen2/test/test-cases/success/ObjectTypeRef.json @@ -0,0 +1,7 @@ +{ + "success": true, + "commandLine": { + "thingFiles": [ "valid/ObjectTypeRef.TM.json" ], + "lang": "none" + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/IntegerConstDecimalPlaces.TM.json b/codegen2/test/thing-models/invalidAioBinding/IntegerConstDecimalPlaces.TM.json new file mode 100644 index 0000000000..8f3f57250b --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/IntegerConstDecimalPlaces.TM.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "schemaDefinitions": { + "someSchema": { + "type": "integer", + "const": 50, + "aov:decimalPlaces": 2 + } + }, + "actions": { + }, + "properties": { + "alpha": { + "type": "integer", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/IntegerConstScaleFactor.TM.json b/codegen2/test/thing-models/invalidAioBinding/IntegerConstScaleFactor.TM.json new file mode 100644 index 0000000000..0c78d049ac --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/IntegerConstScaleFactor.TM.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "schemaDefinitions": { + "someSchema": { + "type": "integer", + "const": 50, + "aov:scaleFactor": 2 + } + }, + "actions": { + }, + "properties": { + "alpha": { + "type": "number", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/IntegerDecimalPlacesNotInteger.TM.json b/codegen2/test/thing-models/invalidAioBinding/IntegerDecimalPlacesNotInteger.TM.json new file mode 100644 index 0000000000..bc0eb71e10 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/IntegerDecimalPlacesNotInteger.TM.json @@ -0,0 +1,26 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + "alpha": { + "type": "integer", + "aov:decimalPlaces": 2.2, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/IntegerDecimalPlacesWithoutAovContext.TM.json b/codegen2/test/thing-models/invalidAioBinding/IntegerDecimalPlacesWithoutAovContext.TM.json new file mode 100644 index 0000000000..1df2152db5 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/IntegerDecimalPlacesWithoutAovContext.TM.json @@ -0,0 +1,25 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + "alpha": { + "type": "integer", + "aov:decimalPlaces": 2, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/IntegerScaleFactorNotInteger.TM.json b/codegen2/test/thing-models/invalidAioBinding/IntegerScaleFactorNotInteger.TM.json new file mode 100644 index 0000000000..c2c3594cba --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/IntegerScaleFactorNotInteger.TM.json @@ -0,0 +1,26 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + "alpha": { + "type": "integer", + "aov:scaleFactor": 2.2, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/IntegerScaleFactorWithoutAovContext.TM.json b/codegen2/test/thing-models/invalidAioBinding/IntegerScaleFactorWithoutAovContext.TM.json new file mode 100644 index 0000000000..423fc03c3f --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/IntegerScaleFactorWithoutAovContext.TM.json @@ -0,0 +1,25 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + "alpha": { + "type": "integer", + "aov:scaleFactor": 2, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/NumberConstDecimalPlaces.TM.json b/codegen2/test/thing-models/invalidAioBinding/NumberConstDecimalPlaces.TM.json new file mode 100644 index 0000000000..e7c29ea078 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/NumberConstDecimalPlaces.TM.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "schemaDefinitions": { + "someSchema": { + "type": "number", + "const": 50, + "aov:decimalPlaces": 2 + } + }, + "actions": { + }, + "properties": { + "alpha": { + "type": "number", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/NumberConstScaleFactor.TM.json b/codegen2/test/thing-models/invalidAioBinding/NumberConstScaleFactor.TM.json new file mode 100644 index 0000000000..ad4ec397c6 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/NumberConstScaleFactor.TM.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "schemaDefinitions": { + "someSchema": { + "type": "number", + "const": 50, + "aov:scaleFactor": 2 + } + }, + "actions": { + }, + "properties": { + "alpha": { + "type": "number", + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/NumberDecimalPlacesNotInteger.TM.json b/codegen2/test/thing-models/invalidAioBinding/NumberDecimalPlacesNotInteger.TM.json new file mode 100644 index 0000000000..0b473612e4 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/NumberDecimalPlacesNotInteger.TM.json @@ -0,0 +1,26 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + "alpha": { + "type": "number", + "aov:decimalPlaces": 2.2, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/NumberDecimalPlacesWithoutAovContext.TM.json b/codegen2/test/thing-models/invalidAioBinding/NumberDecimalPlacesWithoutAovContext.TM.json new file mode 100644 index 0000000000..1ee664f4dc --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/NumberDecimalPlacesWithoutAovContext.TM.json @@ -0,0 +1,25 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + "alpha": { + "type": "number", + "aov:decimalPlaces": 2, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/NumberScaleFactorWithoutAovContext.TM.json b/codegen2/test/thing-models/invalidAioBinding/NumberScaleFactorWithoutAovContext.TM.json new file mode 100644 index 0000000000..f18092c2f3 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/NumberScaleFactorWithoutAovContext.TM.json @@ -0,0 +1,25 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + "alpha": { + "type": "number", + "aov:scaleFactor": 2.2, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/ObjectPropertyNamespaceEmpty.TM.json b/codegen2/test/thing-models/invalidAioBinding/ObjectPropertyNamespaceEmpty.TM.json new file mode 100644 index 0000000000..689c2d0c2e --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/ObjectPropertyNamespaceEmpty.TM.json @@ -0,0 +1,41 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Echo", + "actions": { + "echo": { + "input": { + "type": "object", + "properties": { + "value": { + "aov:namespace": "", + "type": "string" + } + } + }, + "output": { + "type": "object", + "properties": { + "value": { + "type": "integer" + } + } + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/poke/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/ObjectPropertyNamespaceWithoutAovContext.TM.json b/codegen2/test/thing-models/invalidAioBinding/ObjectPropertyNamespaceWithoutAovContext.TM.json new file mode 100644 index 0000000000..da578a739e --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/ObjectPropertyNamespaceWithoutAovContext.TM.json @@ -0,0 +1,40 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Echo", + "actions": { + "echo": { + "input": { + "type": "object", + "properties": { + "value": { + "aov:namespace": "MyNamespace", + "type": "string" + } + } + }, + "output": { + "type": "object", + "properties": { + "value": { + "type": "integer" + } + } + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/poke/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/ObjectTypeRefEmpty.TM.json b/codegen2/test/thing-models/invalidAioBinding/ObjectTypeRefEmpty.TM.json new file mode 100644 index 0000000000..b6d15233fc --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/ObjectTypeRefEmpty.TM.json @@ -0,0 +1,41 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Echo", + "actions": { + "echo": { + "input": { + "aov:typeRef": "", + "type": "object", + "properties": { + "value": { + "type": "string" + } + } + }, + "output": { + "type": "object", + "properties": { + "value": { + "type": "integer" + } + } + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/poke/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/ObjectTypeRefWithoutAovContext.TM.json b/codegen2/test/thing-models/invalidAioBinding/ObjectTypeRefWithoutAovContext.TM.json new file mode 100644 index 0000000000..a13bcb2ed2 --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/ObjectTypeRefWithoutAovContext.TM.json @@ -0,0 +1,40 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Echo", + "actions": { + "echo": { + "input": { + "aov:typeRef": "SomeOtherItem", + "type": "object", + "properties": { + "value": { + "type": "string" + } + } + }, + "output": { + "type": "object", + "properties": { + "value": { + "type": "integer" + } + } + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/poke/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/StringDecimalPlaces.TM.json b/codegen2/test/thing-models/invalidAioBinding/StringDecimalPlaces.TM.json new file mode 100644 index 0000000000..f44c1965cc --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/StringDecimalPlaces.TM.json @@ -0,0 +1,26 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "aov:decimalPlaces": 2, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/invalidAioBinding/StringScaleFactor.TM.json b/codegen2/test/thing-models/invalidAioBinding/StringScaleFactor.TM.json new file mode 100644 index 0000000000..fca2e3afbd --- /dev/null +++ b/codegen2/test/thing-models/invalidAioBinding/StringScaleFactor.TM.json @@ -0,0 +1,26 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Noop", + "actions": { + }, + "properties": { + "alpha": { + "type": "string", + "aov:scaleFactor": 2, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/alpha/{maintainerId}", + "op": "readproperty" + } + ] + } + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/valid/ObjectPropertyNamespace.TM.json b/codegen2/test/thing-models/valid/ObjectPropertyNamespace.TM.json new file mode 100644 index 0000000000..6ee4edb403 --- /dev/null +++ b/codegen2/test/thing-models/valid/ObjectPropertyNamespace.TM.json @@ -0,0 +1,41 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Echo", + "actions": { + "echo": { + "input": { + "type": "object", + "properties": { + "value": { + "aov:namespace": "MyNamespace", + "type": "string" + } + } + }, + "output": { + "type": "object", + "properties": { + "value": { + "type": "integer" + } + } + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/poke/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/codegen2/test/thing-models/valid/ObjectTypeRef.TM.json b/codegen2/test/thing-models/valid/ObjectTypeRef.TM.json new file mode 100644 index 0000000000..2821180e5c --- /dev/null +++ b/codegen2/test/thing-models/valid/ObjectTypeRef.TM.json @@ -0,0 +1,41 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" }, + { "aov": "http://azure.com/IoT/operations/tm#" } + ], + "@type": "tm:ThingModel", + "title": "Echo", + "actions": { + "echo": { + "input": { + "aov:typeRef": "SomeOtherItem", + "type": "object", + "properties": { + "value": { + "type": "string" + } + } + }, + "output": { + "type": "object", + "properties": { + "value": { + "type": "integer" + } + } + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "sample/poke/{executorId}", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} From 8573d91f975e4ccd877f677fb56567cd79588082 Mon Sep 17 00:00:00 2001 From: "John (JD) Douceur" Date: Wed, 21 Jan 2026 12:34:01 -0800 Subject: [PATCH 46/52] suppress src subdir on --noProj option --- .../CommandPerformer.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/codegen2/src/Azure.Iot.Operations.ProtocolCompilerLib/CommandPerformer.cs b/codegen2/src/Azure.Iot.Operations.ProtocolCompilerLib/CommandPerformer.cs index 4b49cc5f9b..e7a41df9a9 100644 --- a/codegen2/src/Azure.Iot.Operations.ProtocolCompilerLib/CommandPerformer.cs +++ b/codegen2/src/Azure.Iot.Operations.ProtocolCompilerLib/CommandPerformer.cs @@ -47,6 +47,11 @@ public static ErrorLog GenerateCode(OptionContainer options, Action parsedThings = ParseThings(options.ThingFiles, errorLog, out HashSet serializationFormats, statusReceiver); From e3a2e58ec9e18e2a952732d23a91324b51d9c4d2 Mon Sep 17 00:00:00 2001 From: vaavva Date: Wed, 21 Jan 2026 16:56:51 -0500 Subject: [PATCH 47/52] .tt file updates --- .../rust/Actions/t4/RustCommandExecutor.tt | 26 ++++++------- .../Actions/t4/RustCommandExecutorHeaders.tt | 7 +--- .../rust/Actions/t4/RustCommandInvoker.tt | 24 ++++++------ .../Actions/t4/RustCommandInvokerHeaders.tt | 7 +--- .../rust/Events/t4/RustTelemetryReceiver.tt | 18 +++------ .../rust/Events/t4/RustTelemetrySender.tt | 16 +++----- .../rust/Project/t4/RustCargoToml.tt | 4 +- .../Properties/t4/RustPropertyConsumer.tt | 38 +++++++------------ .../Properties/t4/RustPropertyMaintainer.tt | 34 ++++++----------- .../Serialization/t4/RustSerialization.tt | 12 +++--- 10 files changed, 73 insertions(+), 113 deletions(-) diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutor.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutor.tt index 3b104a413a..3c182fc725 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutor.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutor.tt @@ -4,7 +4,7 @@ use std::collections::HashMap; -use azure_iot_operations_mqtt::interface::ManagedClient; +use azure_iot_operations_mqtt::session::SessionManagedClient; use azure_iot_operations_protocol::application::ApplicationContext; use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; <# if (this.respSchema != null) { #> @@ -48,6 +48,12 @@ impl <#=this.commandName.GetTypeName(TargetLanguage.Rust, "response", "builder") self } + /// Cloud event for the response + pub fn cloud_event(&mut self, cloud_event: Option) -> &mut Self { + self.inner_builder.cloud_event(cloud_event); + self + } + <# if (this.respSchema != null) { #> /// Payload of the response /// @@ -98,23 +104,17 @@ impl <#=this.commandName.GetTypeName(TargetLanguage.Rust, "response", "builder") } /// Command Executor for `<#=this.commandName.AsGiven#>` -pub struct <#=this.componentName.GetTypeName(TargetLanguage.Rust)#>( - rpc_command::Executor<<#=this.RequestType()#>, <#=this.ResponseType()#>, C>, -) -where - C: ManagedClient + Clone + Send + Sync + 'static, - C::PubReceiver: Send + Sync + 'static; - -impl <#=this.componentName.GetTypeName(TargetLanguage.Rust)#> -where - C: ManagedClient + Clone + Send + Sync + 'static, - C::PubReceiver: Send + Sync + 'static, +pub struct <#=this.componentName.GetTypeName(TargetLanguage.Rust)#>( + rpc_command::Executor<<#=this.RequestType()#>, <#=this.ResponseType()#>>, +); + +impl <#=this.componentName.GetTypeName(TargetLanguage.Rust)#> { /// Creates a new [`<#=this.componentName.GetTypeName(TargetLanguage.Rust)#>`] /// /// # Panics /// If the DTDL that generated this code was invalid - pub fn new(application_context: ApplicationContext, client: C, options: &CommandExecutorOptions) -> Self { + pub fn new(application_context: ApplicationContext, client: SessionManagedClient, options: &CommandExecutorOptions) -> Self { let mut executor_options_builder = rpc_command::executor::OptionsBuilder::default(); if let Some(topic_namespace) = &options.topic_namespace { executor_options_builder.topic_namespace(topic_namespace.clone()); diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutorHeaders.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutorHeaders.tt index b091b416d3..ed7a96c52a 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutorHeaders.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutorHeaders.tt @@ -3,7 +3,7 @@ <#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> /* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ -use azure_iot_operations_mqtt::interface::ManagedClient; +use azure_iot_operations_mqtt::session::SessionManagedClient; use serde_json; use super::<#=this.errorCodeSchema.GetFileName(TargetLanguage.Rust)#>::<#=this.errorCodeSchema.GetTypeName(TargetLanguage.Rust)#>; @@ -14,10 +14,7 @@ pub use super::<#=this.componentName.GetFileName(TargetLanguage.Rust)#>::<#=this use azure_iot_operations_protocol::rpc_command::executor; -impl <#=this.componentName.GetTypeName(TargetLanguage.Rust)#> -where - C: ManagedClient + Clone + Send + Sync + 'static, - C::PubReceiver: Send + Sync + 'static, +impl <#=this.componentName.GetTypeName(TargetLanguage.Rust)#> { pub fn application_error_headers( custom_user_data: &mut Vec<(String, String)>, diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.tt index 7401727179..b0a9688e93 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.tt @@ -9,7 +9,7 @@ use std::error::Error; <# } #> use std::time::Duration; -use azure_iot_operations_mqtt::interface::ManagedClient; +use azure_iot_operations_mqtt::session::SessionManagedClient; use azure_iot_operations_protocol::application::ApplicationContext; use azure_iot_operations_protocol::common::aio_protocol_error::{ AIOProtocolError, @@ -64,6 +64,12 @@ impl <#=this.commandName.GetTypeName(TargetLanguage.Rust, "request", "builder")# self } + /// Cloud event for the request + pub fn cloud_event(&mut self, cloud_event: Option) -> &mut Self { + self.inner_builder.cloud_event(cloud_event); + self + } + /// Topic token keys/values to be replaced into the publish topic of the request message. /// A prefix of "ex:" will be prepended to each key before scanning the topic pattern. /// Thus, only tokens of the form `{ex:SOMEKEY}` will be replaced. @@ -129,23 +135,17 @@ impl <#=this.commandName.GetTypeName(TargetLanguage.Rust, "request", "builder")# } /// Command Invoker for `<#=this.commandName.AsGiven#>` -pub struct <#=this.componentName.GetTypeName(TargetLanguage.Rust)#>( - rpc_command::Invoker<<#=this.RequestType()#>, <#=this.ExternalResponseType()#>, C>, -) -where - C: ManagedClient + Clone + Send + Sync + 'static, - C::PubReceiver: Send + Sync + 'static; +pub struct <#=this.componentName.GetTypeName(TargetLanguage.Rust)#>( + rpc_command::Invoker<<#=this.RequestType()#>, <#=this.ExternalResponseType()#>>, +); -impl <#=this.componentName.GetTypeName(TargetLanguage.Rust)#> -where - C: ManagedClient + Clone + Send + Sync + 'static, - C::PubReceiver: Send + Sync + 'static, +impl <#=this.componentName.GetTypeName(TargetLanguage.Rust)#> { /// Creates a new [`<#=this.componentName.GetTypeName(TargetLanguage.Rust)#>`] /// /// # Panics /// If the DTDL that generated this code was invalid - pub fn new(application_context: ApplicationContext, client: C, options: &CommandInvokerOptions) -> Self { + pub fn new(application_context: ApplicationContext, client: SessionManagedClient, options: &CommandInvokerOptions) -> Self { let mut invoker_options_builder = rpc_command::invoker::OptionsBuilder::default(); if let Some(topic_namespace) = &options.topic_namespace { invoker_options_builder.topic_namespace(topic_namespace.clone()); diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvokerHeaders.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvokerHeaders.tt index 12bedb4f27..d3fcd3bb7d 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvokerHeaders.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvokerHeaders.tt @@ -3,7 +3,7 @@ <#@ import namespace="Azure.Iot.Operations.CodeGeneration" #> /* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v<#=System.Reflection.Assembly.GetExecutingAssembly().GetName().Version#>; DO NOT EDIT. */ -use azure_iot_operations_mqtt::interface::ManagedClient; +use azure_iot_operations_mqtt::session::SessionManagedClient; use serde_json; <# if (this.errorInfoSchema != null) { #> @@ -14,10 +14,7 @@ pub use super::<#=this.componentName.GetFileName(TargetLanguage.Rust)#>::<#=this use azure_iot_operations_protocol::rpc_command::invoker; -impl <#=this.componentName.GetTypeName(TargetLanguage.Rust)#> -where - C: ManagedClient + Clone + Send + Sync + 'static, - C::PubReceiver: Send + Sync + 'static, +impl <#=this.componentName.GetTypeName(TargetLanguage.Rust)#> { pub fn application_error_headers( custom_user_data: &Vec<(String, String)>, diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.tt index 8ce04748e7..9845ffd752 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.tt @@ -4,7 +4,7 @@ use std::collections::HashMap; -use azure_iot_operations_mqtt::interface::{AckToken, ManagedClient}; +use azure_iot_operations_mqtt::{session::SessionManagedClient, token::AckToken}; use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; use azure_iot_operations_protocol::telemetry; use azure_iot_operations_protocol::application::ApplicationContext; @@ -20,23 +20,17 @@ use super::super::common_types::options::TelemetryReceiverOptions; pub type <#=this.messageName.GetTypeName(TargetLanguage.Rust)#> = telemetry::receiver::Message<<#=this.schemaType.GetTypeName(TargetLanguage.Rust)#>>; /// Telemetry Receiver for `<#=this.schemaType.GetTypeName(TargetLanguage.Rust)#>` -pub struct <#=this.componentName.GetTypeName(TargetLanguage.Rust)#>( - telemetry::Receiver<<#=this.schemaType.GetTypeName(TargetLanguage.Rust)#>, C>, -) -where - C: ManagedClient + Clone + Send + Sync + 'static, - C::PubReceiver: Send + Sync + 'static; +pub struct <#=this.componentName.GetTypeName(TargetLanguage.Rust)#>( + telemetry::Receiver<<#=this.schemaType.GetTypeName(TargetLanguage.Rust)#>>, +); -impl <#=this.componentName.GetTypeName(TargetLanguage.Rust)#> -where - C: ManagedClient + Clone + Send + Sync + 'static, - C::PubReceiver: Send + Sync + 'static, +impl <#=this.componentName.GetTypeName(TargetLanguage.Rust)#> { /// Creates a new [`<#=this.componentName.GetTypeName(TargetLanguage.Rust)#>`] /// /// # Panics /// If the DTDL that generated this code was invalid - pub fn new(application_context: ApplicationContext, client: C, options: &TelemetryReceiverOptions) -> Self { + pub fn new(application_context: ApplicationContext, client: SessionManagedClient, options: &TelemetryReceiverOptions) -> Self { let mut receiver_options_builder = telemetry::receiver::OptionsBuilder::default(); if let Some(topic_namespace) = &options.topic_namespace { receiver_options_builder.topic_namespace(topic_namespace.clone()); diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.tt index 1b84d65f05..b7a23cce86 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.tt @@ -6,7 +6,7 @@ use std::collections::HashMap; use std::time::Duration; use azure_iot_operations_mqtt::control_packet::QoS; -use azure_iot_operations_mqtt::interface::ManagedClient; +use azure_iot_operations_mqtt::session::SessionManagedClient; use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; use azure_iot_operations_protocol::telemetry; @@ -89,15 +89,11 @@ impl <#=this.messageName.GetTypeName(TargetLanguage.Rust)#>Builder { } /// Telemetry Sender for `<#=this.schemaType.GetTypeName(TargetLanguage.Rust)#>` -pub struct <#=this.componentName.GetTypeName(TargetLanguage.Rust)#>( - telemetry::Sender<<#=this.schemaType.GetTypeName(TargetLanguage.Rust)#>, C>, -) -where - C: ManagedClient + Send + Sync + 'static; - -impl <#=this.componentName.GetTypeName(TargetLanguage.Rust)#> -where - C: ManagedClient + Send + Sync + 'static, +pub struct <#=this.componentName.GetTypeName(TargetLanguage.Rust)#>( + telemetry::Sender<<#=this.schemaType.GetTypeName(TargetLanguage.Rust)#>>, +); + +impl <#=this.componentName.GetTypeName(TargetLanguage.Rust)#> { /// Creates a new [`<#=this.componentName.GetTypeName(TargetLanguage.Rust)#>`] /// diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustCargoToml.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustCargoToml.tt index a2f53295f6..b881006a44 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustCargoToml.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustCargoToml.tt @@ -32,8 +32,8 @@ derive_builder = "0.20" azure_iot_operations_mqtt = { <#=this.IfLocal("path", "git")#> = "<#=this.sdkPath#><#=this.IfLocal("/azure_iot_operations_mqtt")#>" } azure_iot_operations_protocol = { <#=this.IfLocal("path", "git")#> = "<#=this.sdkPath#><#=this.IfLocal("/azure_iot_operations_protocol")#>" } <# } else { #> -azure_iot_operations_mqtt = { version = "0.11.0", registry = "aio-sdks" } -azure_iot_operations_protocol = { version = "0.12.0", registry = "aio-sdks" } +azure_iot_operations_mqtt = { version = "1.0", registry = "aio-sdks" } +azure_iot_operations_protocol = { version = "1.0", registry = "aio-sdks" } <# } #> <# if (!this.generateProject) { #> ``` diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyConsumer.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyConsumer.tt index eeef3fb4b0..78147e3fb5 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyConsumer.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyConsumer.tt @@ -8,7 +8,7 @@ use std::error::Error; <# } #> use std::time::Duration; -use azure_iot_operations_mqtt::interface::ManagedClient; +use azure_iot_operations_mqtt::session::SessionManagedClient; use azure_iot_operations_protocol::common::aio_protocol_error::{ AIOProtocolError, <# if (this.readErrorName != null) { #> @@ -210,23 +210,17 @@ impl <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "request", " <# } else { #> /// Read requester for a Property collection <# } #> -pub struct <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "requester")#>( - rpc_command::Invoker<<#=this.readSerializerEmptyType.GetTypeName(TargetLanguage.Rust)#>, <#=this.readRespSchema.GetTypeName(TargetLanguage.Rust)#>, C>, -) -where - C: ManagedClient + Clone + Send + Sync + 'static, - C::PubReceiver: Send + Sync + 'static; - -impl <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "requester")#> -where - C: ManagedClient + Clone + Send + Sync + 'static, - C::PubReceiver: Send + Sync + 'static, +pub struct <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "requester")#>( + rpc_command::Invoker<<#=this.readSerializerEmptyType.GetTypeName(TargetLanguage.Rust)#>, <#=this.readRespSchema.GetTypeName(TargetLanguage.Rust)#>>, +); + +impl <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "requester")#> { /// Creates a new [`<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "requester")#>`] /// /// # Panics /// If the DTDL that generated this code was invalid - pub fn new(application_context: ApplicationContext, client: C, options: &CommandInvokerOptions) -> Self { + pub fn new(application_context: ApplicationContext, client: SessionManagedClient, options: &CommandInvokerOptions) -> Self { let mut invoker_options_builder = rpc_command::invoker::OptionsBuilder::default(); if let Some(topic_namespace) = &options.topic_namespace { invoker_options_builder.topic_namespace(topic_namespace.clone()); @@ -338,23 +332,17 @@ where <# } else { #> /// Write requester for a Property collection <# } #> -pub struct <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "requester")#>( - rpc_command::Invoker<<#=this.writeReqSchema.GetTypeName(TargetLanguage.Rust)#>, <#=((ITypeName)this.writeRespSchema ?? this.writeSerializerEmptyType).GetTypeName(TargetLanguage.Rust)#>, C>, -) -where - C: ManagedClient + Clone + Send + Sync + 'static, - C::PubReceiver: Send + Sync + 'static; - -impl <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "requester")#> -where - C: ManagedClient + Clone + Send + Sync + 'static, - C::PubReceiver: Send + Sync + 'static, +pub struct <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "requester")#>( + rpc_command::Invoker<<#=this.writeReqSchema.GetTypeName(TargetLanguage.Rust)#>, <#=((ITypeName)this.writeRespSchema ?? this.writeSerializerEmptyType).GetTypeName(TargetLanguage.Rust)#>>, +); + +impl <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "requester")#> { /// Creates a new [`<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "requester")#>`] /// /// # Panics /// If the DTDL that generated this code was invalid - pub fn new(application_context: ApplicationContext, client: C, options: &CommandInvokerOptions) -> Self { + pub fn new(application_context: ApplicationContext, client: SessionManagedClient, options: &CommandInvokerOptions) -> Self { let mut invoker_options_builder = rpc_command::invoker::OptionsBuilder::default(); if let Some(topic_namespace) = &options.topic_namespace { invoker_options_builder.topic_namespace(topic_namespace.clone()); diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyMaintainer.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyMaintainer.tt index c5debd7ef4..32e0cc6e99 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyMaintainer.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyMaintainer.tt @@ -4,7 +4,7 @@ use std::collections::HashMap; -use azure_iot_operations_mqtt::interface::ManagedClient; +use azure_iot_operations_mqtt::session::SessionManagedClient; use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; <# if (this.readRespSchema != null || this.writeRespSchema != null) { #> use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; @@ -137,23 +137,17 @@ impl <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "response", <# } else { #> /// Read responder for a Property collection <# } #> -pub struct <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "responder")#>( - rpc_command::Executor<<#=this.readSerializerEmptyType.GetTypeName(TargetLanguage.Rust)#>, <#=this.readRespSchema.GetTypeName(TargetLanguage.Rust)#>, C>, -) -where - C: ManagedClient + Clone + Send + Sync + 'static, - C::PubReceiver: Send + Sync + 'static; +pub struct <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "responder")#>( + rpc_command::Executor<<#=this.readSerializerEmptyType.GetTypeName(TargetLanguage.Rust)#>, <#=this.readRespSchema.GetTypeName(TargetLanguage.Rust)#>>, +); -impl <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "responder")#> -where - C: ManagedClient + Clone + Send + Sync + 'static, - C::PubReceiver: Send + Sync + 'static, +impl <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "responder")#> { /// Creates a new [`<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "responder")#>`] /// /// # Panics /// If the DTDL that generated this code was invalid - pub fn new(application_context: ApplicationContext, client: C, options: &CommandExecutorOptions) -> Self { + pub fn new(application_context: ApplicationContext, client: SessionManagedClient, options: &CommandExecutorOptions) -> Self { let mut executor_options_builder = rpc_command::executor::OptionsBuilder::default(); if let Some(topic_namespace) = &options.topic_namespace { executor_options_builder.topic_namespace(topic_namespace.clone()); @@ -207,23 +201,17 @@ where <# } else { #> /// Write responder for a Property collection <# } #> -pub struct <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "responder")#>( - rpc_command::Executor<<#=this.writeReqSchema.GetTypeName(TargetLanguage.Rust)#>, <#=((ITypeName)this.writeRespSchema ?? this.writeSerializerEmptyType).GetTypeName(TargetLanguage.Rust)#>, C>, -) -where - C: ManagedClient + Clone + Send + Sync + 'static, - C::PubReceiver: Send + Sync + 'static; +pub struct <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "responder")#>( + rpc_command::Executor<<#=this.writeReqSchema.GetTypeName(TargetLanguage.Rust)#>, <#=((ITypeName)this.writeRespSchema ?? this.writeSerializerEmptyType).GetTypeName(TargetLanguage.Rust)#>>, +); -impl <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "responder")#> -where - C: ManagedClient + Clone + Send + Sync + 'static, - C::PubReceiver: Send + Sync + 'static, +impl <#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "responder")#> { /// Creates a new [`<#=this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "responder")#>`] /// /// # Panics /// If the DTDL that generated this code was invalid - pub fn new(application_context: ApplicationContext, client: C, options: &CommandExecutorOptions) -> Self { + pub fn new(application_context: ApplicationContext, client: SessionManagedClient, options: &CommandExecutorOptions) -> Self { let mut executor_options_builder = rpc_command::executor::OptionsBuilder::default(); if let Some(topic_namespace) = &options.topic_namespace { executor_options_builder.topic_namespace(topic_namespace.clone()); diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Serialization/t4/RustSerialization.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Serialization/t4/RustSerialization.tt index c09fc6b446..b78095082d 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Serialization/t4/RustSerialization.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Serialization/t4/RustSerialization.tt @@ -59,12 +59,12 @@ impl PayloadSerialize for <#=this.schemaClassName.GetTypeName(TargetLanguage.Rus content_type: Option<&String>, _format_indicator: &FormatIndicator, ) -> Result> { - if let Some(content_type) = content_type { - if !<#=this.schemaClassName.GetTypeName(TargetLanguage.Rust)#>::is_content_type(content_type) { - return Err(DeserializationError::UnsupportedContentType(format!( - "Invalid content type: '{content_type}'. Must be '<#=this.contentType#>'" - ))); - } + if let Some(content_type) = content_type + && !<#=this.schemaClassName.GetTypeName(TargetLanguage.Rust)#>::is_content_type(content_type) + { + return Err(DeserializationError::UnsupportedContentType(format!( + "Invalid content type: '{content_type}'. Must be '<#=this.contentType#>'" + ))); } <# ix = 1; foreach (string deserializeLine in this.deserializeCode) { #> <#=deserializeLine#><#=ix == this.deserializeCode.Count ? ".map_err(DeserializationError::InvalidPayload)" : ""#> From d2fa68e7d6849fff4e025ca67be037e89727f312 Mon Sep 17 00:00:00 2001 From: vaavva Date: Wed, 21 Jan 2026 17:00:13 -0500 Subject: [PATCH 48/52] update .cs files --- .../rust/Actions/t4/RustCommandExecutor.cs | 29 ++++++++++++------- .../Actions/t4/RustCommandExecutorHeaders.cs | 11 ++++--- .../rust/Actions/t4/RustCommandInvoker.cs | 24 ++++++++------- .../Actions/t4/RustCommandInvokerHeaders.cs | 11 ++++--- .../rust/Events/t4/RustTelemetryReceiver.cs | 12 ++++---- .../rust/Events/t4/RustTelemetrySender.cs | 9 +++--- .../rust/Project/t4/RustCargoToml.cs | 4 +-- .../Properties/t4/RustPropertyConsumer.cs | 26 +++++++---------- .../Properties/t4/RustPropertyMaintainer.cs | 24 +++++++-------- .../Serialization/t4/RustSerialization.cs | 12 ++++---- 10 files changed, 81 insertions(+), 81 deletions(-) diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutor.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutor.cs index 3dcb28ab6c..2eaa9e24d1 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutor.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutor.cs @@ -29,7 +29,7 @@ public virtual string TransformText() use std::collections::HashMap; -use azure_iot_operations_mqtt::interface::ManagedClient; +use azure_iot_operations_mqtt::session::SessionManagedClient; use azure_iot_operations_protocol::application::ApplicationContext; use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; "); @@ -94,9 +94,20 @@ public virtual string TransformText() this.Write(this.ToStringHelper.ToStringWithCulture(this.ResponseType())); this.Write(">,\r\n}\r\n\r\nimpl "); this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.GetTypeName(TargetLanguage.Rust, "response", "builder"))); - this.Write(" {\r\n /// Custom user data to set on the response\r\n pub fn custom_user_data(" + - "&mut self, custom_user_data: Vec<(String, String)>) -> &mut Self {\r\n self" + - ".inner_builder.custom_user_data(custom_user_data);\r\n self\r\n }\r\n\r\n"); + this.Write(@" { + /// Custom user data to set on the response + pub fn custom_user_data(&mut self, custom_user_data: Vec<(String, String)>) -> &mut Self { + self.inner_builder.custom_user_data(custom_user_data); + self + } + + /// Cloud event for the response + pub fn cloud_event(&mut self, cloud_event: Option) -> &mut Self { + self.inner_builder.cloud_event(cloud_event); + self + } + +"); if (this.respSchema != null) { this.Write(" /// Payload of the response\r\n ///\r\n /// # Errors\r\n /// If the payloa" + "d cannot be serialized\r\n pub fn payload(\r\n &mut self,\r\n payload" + @@ -155,21 +166,19 @@ public virtual string TransformText() this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.AsGiven)); this.Write("`\r\npub struct "); this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); - this.Write("(\r\n rpc_command::Executor<"); + this.Write("(\r\n rpc_command::Executor<"); this.Write(this.ToStringHelper.ToStringWithCulture(this.RequestType())); this.Write(", "); this.Write(this.ToStringHelper.ToStringWithCulture(this.ResponseType())); - this.Write(", C>,\r\n)\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::Pu" + - "bReceiver: Send + Sync + \'static;\r\n\r\nimpl "); + this.Write(">,\r\n);\r\n\r\nimpl "); this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); - this.Write("\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::PubRece" + - "iver: Send + Sync + \'static,\r\n{\r\n /// Creates a new [`"); + this.Write("\r\n{\r\n /// Creates a new [`"); this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); this.Write(@"`] /// /// # Panics /// If the DTDL that generated this code was invalid - pub fn new(application_context: ApplicationContext, client: C, options: &CommandExecutorOptions) -> Self { + pub fn new(application_context: ApplicationContext, client: SessionManagedClient, options: &CommandExecutorOptions) -> Self { let mut executor_options_builder = rpc_command::executor::OptionsBuilder::default(); if let Some(topic_namespace) = &options.topic_namespace { executor_options_builder.topic_namespace(topic_namespace.clone()); diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutorHeaders.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutorHeaders.cs index 1cf45b3c89..092d713631 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutorHeaders.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandExecutorHeaders.cs @@ -26,8 +26,8 @@ public virtual string TransformText() { this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); - this.Write("; DO NOT EDIT. */\r\n\r\nuse azure_iot_operations_mqtt::interface::ManagedClient;\r\nus" + - "e serde_json;\r\n\r\nuse super::"); + this.Write("; DO NOT EDIT. */\r\n\r\nuse azure_iot_operations_mqtt::session::SessionManagedClient" + + ";\r\nuse serde_json;\r\n\r\nuse super::"); this.Write(this.ToStringHelper.ToStringWithCulture(this.errorCodeSchema.GetFileName(TargetLanguage.Rust))); this.Write("::"); this.Write(this.ToStringHelper.ToStringWithCulture(this.errorCodeSchema.GetTypeName(TargetLanguage.Rust))); @@ -43,11 +43,10 @@ public virtual string TransformText() this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetFileName(TargetLanguage.Rust))); this.Write("::"); this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); - this.Write(";\r\n\r\nuse azure_iot_operations_protocol::rpc_command::executor;\r\n\r\nimpl "); + this.Write(";\r\n\r\nuse azure_iot_operations_protocol::rpc_command::executor;\r\n\r\nimpl "); this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); - this.Write("\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::PubRece" + - "iver: Send + Sync + \'static,\r\n{\r\n pub fn application_error_headers(\r\n " + - "custom_user_data: &mut Vec<(String, String)>,\r\n "); + this.Write("\r\n{\r\n pub fn application_error_headers(\r\n custom_user_data: &mut Vec<(S" + + "tring, String)>,\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(this.errorCodeName.GetVariableName(TargetLanguage.Rust))); this.Write(": "); this.Write(this.ToStringHelper.ToStringWithCulture(this.errorCodeSchema.GetTypeName(TargetLanguage.Rust))); diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.cs index 0728bec853..b758b46029 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.cs @@ -30,10 +30,10 @@ public virtual string TransformText() if (this.errorResultName != null) { this.Write("use std::error::Error;\r\n"); } - this.Write("use std::time::Duration;\r\n\r\nuse azure_iot_operations_mqtt::interface::ManagedClie" + - "nt;\r\nuse azure_iot_operations_protocol::application::ApplicationContext;\r\nuse az" + - "ure_iot_operations_protocol::common::aio_protocol_error::{\r\n AIOProtocolError" + - ",\r\n"); + this.Write("use std::time::Duration;\r\n\r\nuse azure_iot_operations_mqtt::session::SessionManage" + + "dClient;\r\nuse azure_iot_operations_protocol::application::ApplicationContext;\r\nu" + + "se azure_iot_operations_protocol::common::aio_protocol_error::{\r\n AIOProtocol" + + "Error,\r\n"); if (this.errorResultName != null) { this.Write(" AIOProtocolErrorKind,\r\n"); } @@ -117,6 +117,12 @@ pub fn custom_user_data(&mut self, custom_user_data: Vec<(String, String)>) -> & self } + /// Cloud event for the request + pub fn cloud_event(&mut self, cloud_event: Option) -> &mut Self { + self.inner_builder.cloud_event(cloud_event); + self + } + /// Topic token keys/values to be replaced into the publish topic of the request message. /// A prefix of ""ex:"" will be prepended to each key before scanning the topic pattern. /// Thus, only tokens of the form `{ex:SOMEKEY}` will be replaced. @@ -178,21 +184,19 @@ pub fn executor_id(&mut self, executor_id: &str) -> &mut Self { this.Write(this.ToStringHelper.ToStringWithCulture(this.commandName.AsGiven)); this.Write("`\r\npub struct "); this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); - this.Write("(\r\n rpc_command::Invoker<"); + this.Write("(\r\n rpc_command::Invoker<"); this.Write(this.ToStringHelper.ToStringWithCulture(this.RequestType())); this.Write(", "); this.Write(this.ToStringHelper.ToStringWithCulture(this.ExternalResponseType())); - this.Write(", C>,\r\n)\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::Pu" + - "bReceiver: Send + Sync + \'static;\r\n\r\nimpl "); + this.Write(">,\r\n);\r\n\r\nimpl "); this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); - this.Write("\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::PubRece" + - "iver: Send + Sync + \'static,\r\n{\r\n /// Creates a new [`"); + this.Write("\r\n{\r\n /// Creates a new [`"); this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); this.Write(@"`] /// /// # Panics /// If the DTDL that generated this code was invalid - pub fn new(application_context: ApplicationContext, client: C, options: &CommandInvokerOptions) -> Self { + pub fn new(application_context: ApplicationContext, client: SessionManagedClient, options: &CommandInvokerOptions) -> Self { let mut invoker_options_builder = rpc_command::invoker::OptionsBuilder::default(); if let Some(topic_namespace) = &options.topic_namespace { invoker_options_builder.topic_namespace(topic_namespace.clone()); diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvokerHeaders.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvokerHeaders.cs index d3ccb4397d..0668accaef 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvokerHeaders.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvokerHeaders.cs @@ -26,8 +26,8 @@ public virtual string TransformText() { this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); - this.Write("; DO NOT EDIT. */\r\n\r\nuse azure_iot_operations_mqtt::interface::ManagedClient;\r\nus" + - "e serde_json;\r\n\r\n"); + this.Write("; DO NOT EDIT. */\r\n\r\nuse azure_iot_operations_mqtt::session::SessionManagedClient" + + ";\r\nuse serde_json;\r\n\r\n"); if (this.errorInfoSchema != null) { this.Write("use super::"); this.Write(this.ToStringHelper.ToStringWithCulture(this.errorInfoSchema.GetFileName(TargetLanguage.Rust))); @@ -43,11 +43,10 @@ public virtual string TransformText() this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetFileName(TargetLanguage.Rust))); this.Write("::"); this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); - this.Write(";\r\n\r\nuse azure_iot_operations_protocol::rpc_command::invoker;\r\n\r\nimpl "); + this.Write(";\r\n\r\nuse azure_iot_operations_protocol::rpc_command::invoker;\r\n\r\nimpl "); this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); - this.Write("\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::PubRece" + - "iver: Send + Sync + \'static,\r\n{\r\n pub fn application_error_headers(\r\n " + - "custom_user_data: &Vec<(String, String)>,\r\n ) -> (Option<"); + this.Write("\r\n{\r\n pub fn application_error_headers(\r\n custom_user_data: &Vec<(Strin" + + "g, String)>,\r\n ) -> (Option<"); this.Write(this.ToStringHelper.ToStringWithCulture(this.errorCodeSchema.GetTypeName(TargetLanguage.Rust))); this.Write(">, Option<"); this.Write(this.ToStringHelper.ToStringWithCulture(this.errorInfoSchema?.GetTypeName(TargetLanguage.Rust) ?? "String")); diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.cs index 79302222f8..fa5f09eea8 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.cs @@ -29,7 +29,7 @@ public virtual string TransformText() use std::collections::HashMap; -use azure_iot_operations_mqtt::interface::{AckToken, ManagedClient}; +use azure_iot_operations_mqtt::{session::SessionManagedClient, token::AckToken}; use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; use azure_iot_operations_protocol::telemetry; use azure_iot_operations_protocol::application::ApplicationContext; @@ -53,19 +53,17 @@ public virtual string TransformText() this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaType.GetTypeName(TargetLanguage.Rust))); this.Write("`\r\npub struct "); this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); - this.Write("(\r\n telemetry::Receiver<"); + this.Write("(\r\n telemetry::Receiver<"); this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaType.GetTypeName(TargetLanguage.Rust))); - this.Write(", C>,\r\n)\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::Pu" + - "bReceiver: Send + Sync + \'static;\r\n\r\nimpl "); + this.Write(">,\r\n);\r\n\r\nimpl "); this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); - this.Write("\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::PubRece" + - "iver: Send + Sync + \'static,\r\n{\r\n /// Creates a new [`"); + this.Write("\r\n{\r\n /// Creates a new [`"); this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); this.Write(@"`] /// /// # Panics /// If the DTDL that generated this code was invalid - pub fn new(application_context: ApplicationContext, client: C, options: &TelemetryReceiverOptions) -> Self { + pub fn new(application_context: ApplicationContext, client: SessionManagedClient, options: &TelemetryReceiverOptions) -> Self { let mut receiver_options_builder = telemetry::receiver::OptionsBuilder::default(); if let Some(topic_namespace) = &options.topic_namespace { receiver_options_builder.topic_namespace(topic_namespace.clone()); diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.cs index c9c6628692..b5cc4f5d84 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.cs @@ -31,7 +31,7 @@ public virtual string TransformText() use std::time::Duration; use azure_iot_operations_mqtt::control_packet::QoS; -use azure_iot_operations_mqtt::interface::ManagedClient; +use azure_iot_operations_mqtt::session::SessionManagedClient; use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; use azure_iot_operations_protocol::telemetry; @@ -96,12 +96,11 @@ public virtual string TransformText() this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaType.GetTypeName(TargetLanguage.Rust))); this.Write("`\r\npub struct "); this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); - this.Write("(\r\n telemetry::Sender<"); + this.Write("(\r\n telemetry::Sender<"); this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaType.GetTypeName(TargetLanguage.Rust))); - this.Write(", C>,\r\n)\r\nwhere\r\n C: ManagedClient + Send + Sync + \'static;\r\n\r\nimpl "); + this.Write(">,\r\n);\r\n\r\nimpl "); this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); - this.Write("\r\nwhere\r\n C: ManagedClient + Send + Sync + \'static,\r\n{\r\n /// Creates a n" + - "ew [`"); + this.Write("\r\n{\r\n /// Creates a new [`"); this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); this.Write(@"`] /// diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustCargoToml.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustCargoToml.cs index 47b90b4880..37157bb374 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustCargoToml.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Project/t4/RustCargoToml.cs @@ -61,8 +61,8 @@ public virtual string TransformText() this.Write(this.ToStringHelper.ToStringWithCulture(this.IfLocal("/azure_iot_operations_protocol"))); this.Write("\" }\r\n"); } else { - this.Write("azure_iot_operations_mqtt = { version = \"0.11.0\", registry = \"aio-sdks\" }\r\nazure_" + - "iot_operations_protocol = { version = \"0.12.0\", registry = \"aio-sdks\" }\r\n"); + this.Write("azure_iot_operations_mqtt = { version = \"1.0\", registry = \"aio-sdks\" }\r\nazure_iot" + + "_operations_protocol = { version = \"1.0\", registry = \"aio-sdks\" }\r\n"); } if (!this.generateProject) { this.Write("```\r\n"); diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyConsumer.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyConsumer.cs index 6613016cea..509c4ab711 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyConsumer.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyConsumer.cs @@ -29,9 +29,9 @@ public virtual string TransformText() if (this.readErrorName != null) { this.Write("use std::error::Error;\r\n"); } - this.Write("use std::time::Duration;\r\n\r\nuse azure_iot_operations_mqtt::interface::ManagedClie" + - "nt;\r\nuse azure_iot_operations_protocol::common::aio_protocol_error::{\r\n AIOPr" + - "otocolError,\r\n"); + this.Write("use std::time::Duration;\r\n\r\nuse azure_iot_operations_mqtt::session::SessionManage" + + "dClient;\r\nuse azure_iot_operations_protocol::common::aio_protocol_error::{\r\n " + + "AIOProtocolError,\r\n"); if (this.readErrorName != null) { this.Write(" AIOProtocolErrorKind,\r\n"); } @@ -285,21 +285,19 @@ pub fn maintainer_id(&mut self, maintainer_id: &str) -> &mut Self { } this.Write("pub struct "); this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "requester"))); - this.Write("(\r\n rpc_command::Invoker<"); + this.Write("(\r\n rpc_command::Invoker<"); this.Write(this.ToStringHelper.ToStringWithCulture(this.readSerializerEmptyType.GetTypeName(TargetLanguage.Rust))); this.Write(", "); this.Write(this.ToStringHelper.ToStringWithCulture(this.readRespSchema.GetTypeName(TargetLanguage.Rust))); - this.Write(", C>,\r\n)\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::Pu" + - "bReceiver: Send + Sync + \'static;\r\n\r\nimpl "); + this.Write(">,\r\n);\r\n\r\nimpl "); this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "requester"))); - this.Write("\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::PubRece" + - "iver: Send + Sync + \'static,\r\n{\r\n /// Creates a new [`"); + this.Write("\r\n{\r\n /// Creates a new [`"); this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "requester"))); this.Write(@"`] /// /// # Panics /// If the DTDL that generated this code was invalid - pub fn new(application_context: ApplicationContext, client: C, options: &CommandInvokerOptions) -> Self { + pub fn new(application_context: ApplicationContext, client: SessionManagedClient, options: &CommandInvokerOptions) -> Self { let mut invoker_options_builder = rpc_command::invoker::OptionsBuilder::default(); if let Some(topic_namespace) = &options.topic_namespace { invoker_options_builder.topic_namespace(topic_namespace.clone()); @@ -441,21 +439,19 @@ pub async fn shutdown(&self) -> Result<(), AIOProtocolError> { } this.Write("pub struct "); this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "requester"))); - this.Write("(\r\n rpc_command::Invoker<"); + this.Write("(\r\n rpc_command::Invoker<"); this.Write(this.ToStringHelper.ToStringWithCulture(this.writeReqSchema.GetTypeName(TargetLanguage.Rust))); this.Write(", "); this.Write(this.ToStringHelper.ToStringWithCulture(((ITypeName)this.writeRespSchema ?? this.writeSerializerEmptyType).GetTypeName(TargetLanguage.Rust))); - this.Write(", C>,\r\n)\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::Pu" + - "bReceiver: Send + Sync + \'static;\r\n\r\nimpl "); + this.Write(">,\r\n);\r\n\r\nimpl "); this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "requester"))); - this.Write("\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::PubRece" + - "iver: Send + Sync + \'static,\r\n{\r\n /// Creates a new [`"); + this.Write("\r\n{\r\n /// Creates a new [`"); this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "requester"))); this.Write(@"`] /// /// # Panics /// If the DTDL that generated this code was invalid - pub fn new(application_context: ApplicationContext, client: C, options: &CommandInvokerOptions) -> Self { + pub fn new(application_context: ApplicationContext, client: SessionManagedClient, options: &CommandInvokerOptions) -> Self { let mut invoker_options_builder = rpc_command::invoker::OptionsBuilder::default(); if let Some(topic_namespace) = &options.topic_namespace { invoker_options_builder.topic_namespace(topic_namespace.clone()); diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyMaintainer.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyMaintainer.cs index c774cd90d1..56a3fe8c87 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyMaintainer.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Properties/t4/RustPropertyMaintainer.cs @@ -26,8 +26,8 @@ public virtual string TransformText() this.Write("/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v"); this.Write(this.ToStringHelper.ToStringWithCulture(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); this.Write("; DO NOT EDIT. */\r\n\r\nuse std::collections::HashMap;\r\n\r\nuse azure_iot_operations_m" + - "qtt::interface::ManagedClient;\r\nuse azure_iot_operations_protocol::common::aio_p" + - "rotocol_error::AIOProtocolError;\r\n"); + "qtt::session::SessionManagedClient;\r\nuse azure_iot_operations_protocol::common::" + + "aio_protocol_error::AIOProtocolError;\r\n"); if (this.readRespSchema != null || this.writeRespSchema != null) { this.Write("use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize;\r\n" + ""); @@ -218,21 +218,19 @@ pub fn payload( } this.Write("pub struct "); this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "responder"))); - this.Write("(\r\n rpc_command::Executor<"); + this.Write("(\r\n rpc_command::Executor<"); this.Write(this.ToStringHelper.ToStringWithCulture(this.readSerializerEmptyType.GetTypeName(TargetLanguage.Rust))); this.Write(", "); this.Write(this.ToStringHelper.ToStringWithCulture(this.readRespSchema.GetTypeName(TargetLanguage.Rust))); - this.Write(", C>,\r\n)\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::Pu" + - "bReceiver: Send + Sync + \'static;\r\n\r\nimpl "); + this.Write(">,\r\n);\r\n\r\nimpl "); this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "responder"))); - this.Write("\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::PubRece" + - "iver: Send + Sync + \'static,\r\n{\r\n /// Creates a new [`"); + this.Write("\r\n{\r\n /// Creates a new [`"); this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "read", "responder"))); this.Write(@"`] /// /// # Panics /// If the DTDL that generated this code was invalid - pub fn new(application_context: ApplicationContext, client: C, options: &CommandExecutorOptions) -> Self { + pub fn new(application_context: ApplicationContext, client: SessionManagedClient, options: &CommandExecutorOptions) -> Self { let mut executor_options_builder = rpc_command::executor::OptionsBuilder::default(); if let Some(topic_namespace) = &options.topic_namespace { executor_options_builder.topic_namespace(topic_namespace.clone()); @@ -298,21 +296,19 @@ pub async fn shutdown(&mut self) -> Result<(), AIOProtocolError> { } this.Write("pub struct "); this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "responder"))); - this.Write("(\r\n rpc_command::Executor<"); + this.Write("(\r\n rpc_command::Executor<"); this.Write(this.ToStringHelper.ToStringWithCulture(this.writeReqSchema.GetTypeName(TargetLanguage.Rust))); this.Write(", "); this.Write(this.ToStringHelper.ToStringWithCulture(((ITypeName)this.writeRespSchema ?? this.writeSerializerEmptyType).GetTypeName(TargetLanguage.Rust))); - this.Write(", C>,\r\n)\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::Pu" + - "bReceiver: Send + Sync + \'static;\r\n\r\nimpl "); + this.Write(">,\r\n);\r\n\r\nimpl "); this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "responder"))); - this.Write("\r\nwhere\r\n C: ManagedClient + Clone + Send + Sync + \'static,\r\n C::PubRece" + - "iver: Send + Sync + \'static,\r\n{\r\n /// Creates a new [`"); + this.Write("\r\n{\r\n /// Creates a new [`"); this.Write(this.ToStringHelper.ToStringWithCulture(this.propertyName.GetTypeName(TargetLanguage.Rust, "write", "responder"))); this.Write(@"`] /// /// # Panics /// If the DTDL that generated this code was invalid - pub fn new(application_context: ApplicationContext, client: C, options: &CommandExecutorOptions) -> Self { + pub fn new(application_context: ApplicationContext, client: SessionManagedClient, options: &CommandExecutorOptions) -> Self { let mut executor_options_builder = rpc_command::executor::OptionsBuilder::default(); if let Some(topic_namespace) = &options.topic_namespace { executor_options_builder.topic_namespace(topic_namespace.clone()); diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Serialization/t4/RustSerialization.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Serialization/t4/RustSerialization.cs index 2fb41c7140..30abdf7a32 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Serialization/t4/RustSerialization.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Serialization/t4/RustSerialization.cs @@ -97,14 +97,14 @@ fn deserialize( content_type: Option<&String>, _format_indicator: &FormatIndicator, ) -> Result> { - if let Some(content_type) = content_type { - if !"); + if let Some(content_type) = content_type + && !"); this.Write(this.ToStringHelper.ToStringWithCulture(this.schemaClassName.GetTypeName(TargetLanguage.Rust))); - this.Write("::is_content_type(content_type) {\r\n return Err(DeserializationErro" + - "r::UnsupportedContentType(format!(\r\n \"Invalid content type: \'" + - "{content_type}\'. Must be \'"); + this.Write("::is_content_type(content_type)\r\n {\r\n return Err(Deserializatio" + + "nError::UnsupportedContentType(format!(\r\n \"Invalid content type: " + + "\'{content_type}\'. Must be \'"); this.Write(this.ToStringHelper.ToStringWithCulture(this.contentType)); - this.Write("\'\"\r\n )));\r\n }\r\n }\r\n"); + this.Write("\'\"\r\n )));\r\n }\r\n"); ix = 1; foreach (string deserializeLine in this.deserializeCode) { this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(deserializeLine)); From a3de4e9a7ffaa90acae16e3dfe66b2657d26ae02 Mon Sep 17 00:00:00 2001 From: vaavva Date: Wed, 21 Jan 2026 17:08:19 -0500 Subject: [PATCH 49/52] .tt updates related to codegen changes --- .../rust/Actions/t4/RustCommandInvoker.tt | 2 +- .../rust/Events/t4/RustTelemetryReceiver.tt | 2 +- .../rust/Events/t4/RustTelemetrySender.tt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.tt index b0a9688e93..b6a82e2ef4 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.tt @@ -201,7 +201,7 @@ impl <#=this.componentName.GetTypeName(TargetLanguage.Rust)#> payload: <#=this.normalResultSchema.GetTypeName(TargetLanguage.Rust)#> { <# foreach (CodeName normalResultField in this.normalResultFields) { #> <# if (this.normalRequiredFields.Contains(normalResultField)) { #> - <#=normalResultField.GetFieldName(TargetLanguage.Rust)#>: response.payload.<#=normalResultField.GetFieldName(TargetLanguage.Rust)#>.ok_or(<#=this.componentName.GetTypeName(TargetLanguage.Rust)#>::::get_err("<#=normalResultField.AsGiven#>"))?, + <#=normalResultField.GetFieldName(TargetLanguage.Rust)#>: response.payload.<#=normalResultField.GetFieldName(TargetLanguage.Rust)#>.ok_or(<#=this.componentName.GetTypeName(TargetLanguage.Rust)#>::get_err("<#=normalResultField.AsGiven#>"))?, <# } else { #> <#=normalResultField.GetFieldName(TargetLanguage.Rust)#>: response.payload.<#=normalResultField.GetFieldName(TargetLanguage.Rust)#>, <# } #> diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.tt index 9845ffd752..32445f35f5 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.tt @@ -36,7 +36,7 @@ impl <#=this.componentName.GetTypeName(TargetLanguage.Rust)#> receiver_options_builder.topic_namespace(topic_namespace.clone()); } - let mut topic_token_map: HashMap = options + let topic_token_map: HashMap = options .topic_token_map .clone() .into_iter() diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.tt b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.tt index b7a23cce86..47f7bec80b 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.tt +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.tt @@ -99,7 +99,7 @@ impl <#=this.componentName.GetTypeName(TargetLanguage.Rust)#> /// /// # Panics /// If the DTDL that generated this code was invalid - pub fn new(application_context: ApplicationContext, client: C, options: &TelemetrySenderOptions) -> Self { + pub fn new(application_context: ApplicationContext, client: SessionManagedClient, options: &TelemetrySenderOptions) -> Self { let mut sender_options_builder = telemetry::sender::OptionsBuilder::default(); if let Some(topic_namespace) = &options.topic_namespace { sender_options_builder.topic_namespace(topic_namespace.clone()); From 7527007be31259613776994676d5979ab0152a14 Mon Sep 17 00:00:00 2001 From: vaavva Date: Wed, 21 Jan 2026 17:09:43 -0500 Subject: [PATCH 50/52] update .cs files --- .../rust/Actions/t4/RustCommandInvoker.cs | 2 +- .../rust/Events/t4/RustTelemetryReceiver.cs | 2 +- .../rust/Events/t4/RustTelemetrySender.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.cs index b758b46029..a6eefb47ee 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Actions/t4/RustCommandInvoker.cs @@ -272,7 +272,7 @@ pub fn executor_id(&mut self, executor_id: &str) -> &mut Self { this.Write(this.ToStringHelper.ToStringWithCulture(normalResultField.GetFieldName(TargetLanguage.Rust))); this.Write(".ok_or("); this.Write(this.ToStringHelper.ToStringWithCulture(this.componentName.GetTypeName(TargetLanguage.Rust))); - this.Write("::::get_err(\""); + this.Write("::get_err(\""); this.Write(this.ToStringHelper.ToStringWithCulture(normalResultField.AsGiven)); this.Write("\"))?,\r\n"); } else { diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.cs index fa5f09eea8..318b2418da 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetryReceiver.cs @@ -69,7 +69,7 @@ public virtual string TransformText() receiver_options_builder.topic_namespace(topic_namespace.clone()); } - let mut topic_token_map: HashMap = options + let topic_token_map: HashMap = options .topic_token_map .clone() .into_iter() diff --git a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.cs b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.cs index b5cc4f5d84..cac391ec2b 100644 --- a/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.cs +++ b/codegen2/src/Azure.Iot.Operations.EnvoyGenerator/rust/Events/t4/RustTelemetrySender.cs @@ -106,7 +106,7 @@ public virtual string TransformText() /// /// # Panics /// If the DTDL that generated this code was invalid - pub fn new(application_context: ApplicationContext, client: C, options: &TelemetrySenderOptions) -> Self { + pub fn new(application_context: ApplicationContext, client: SessionManagedClient, options: &TelemetrySenderOptions) -> Self { let mut sender_options_builder = telemetry::sender::OptionsBuilder::default(); if let Some(topic_namespace) = &options.topic_namespace { sender_options_builder.topic_namespace(topic_namespace.clone()); From 7d3be62e3f6507c4a01e0281c0f09aa9e901df18 Mon Sep 17 00:00:00 2001 From: vaavva Date: Wed, 21 Jan 2026 18:45:24 -0500 Subject: [PATCH 51/52] generated rust services --- codegen2/eval/aio/conv.sh | 2 +- eng/dtdl/AdrBaseService.TM.json | 4810 +++++++++++++++++ eng/dtdl/DeviceDiscoveryService.TM.json | 218 + eng/dtdl/SchemaNames.json | 52 + eng/dtdl/SchemaRegistry.TM.json | 408 ++ eng/dtdl/StateStore.TM.json | 36 + rust/azure_iot_operations_services/gen.sh | 18 +- .../adr_base_gen/adr_base_service.rs | 114 +- .../adr_base_gen/adr_base_service/asset.rs | 1 + .../adr_base_service/asset_device_ref.rs | 2 +- .../asset_management_group_action_type.rs | 4 +- .../adr_base_service/asset_status.rs | 1 + .../asset_update_event_telemetry.rs | 1 + .../asset_update_event_telemetry_receiver.rs | 9 +- .../asset_update_event_telemetry_sender.rs | 136 + .../adr_base_service/authentication_schema.rs | 1 + .../adr_base_service/code_schema.rs | 6 +- .../adr_base_service/config_error.rs | 1 + .../adr_base_service/config_status.rs | 1 + ...pdate_discovered_asset_command_executor.rs | 153 + ...update_discovered_asset_command_invoker.rs | 61 +- ...update_discovered_asset_request_payload.rs | 3 +- ...pdate_discovered_asset_response_payload.rs | 3 +- ...update_discovered_asset_response_schema.rs | 3 +- .../adr_base_service/dataset_target.rs | 4 +- .../destination_configuration.rs | 1 + .../adr_base_gen/adr_base_service/device.rs | 2 +- .../device_endpoints_schema.rs | 1 + .../adr_base_service/device_status.rs | 1 + .../device_status_endpoint_schema.rs | 1 + .../device_update_event_telemetry.rs | 1 + .../device_update_event_telemetry_receiver.rs | 9 +- .../device_update_event_telemetry_sender.rs | 136 + .../adr_base_service/discovered_asset.rs | 1 + .../discovered_asset_response_schema.rs | 1 + .../adr_base_service/event_stream_target.rs | 3 +- .../get_asset_command_executor.rs | 136 + .../get_asset_command_invoker.rs | 54 +- .../get_asset_request_payload.rs | 3 +- .../get_asset_response_payload.rs | 3 +- .../get_asset_response_schema.rs | 3 +- .../get_asset_status_command_executor.rs | 136 + .../get_asset_status_command_invoker.rs | 54 +- .../get_asset_status_request_payload.rs | 3 +- .../get_asset_status_response_payload.rs | 3 +- .../get_asset_status_response_schema.rs | 3 +- .../get_device_command_executor.rs | 133 + .../get_device_command_invoker.rs | 54 +- .../get_device_response_payload.rs | 3 +- .../get_device_response_schema.rs | 3 +- .../get_device_status_command_executor.rs | 138 + .../get_device_status_command_invoker.rs | 54 +- .../get_device_status_response_payload.rs | 3 +- .../get_device_status_response_schema.rs | 3 +- .../adr_base_service/method_schema.rs | 4 +- .../notification_preference.rs | 2 - .../adr_base_service/outbound_schema.rs | 1 + .../adr_base_gen/adr_base_service/qos.rs | 3 +- .../adr_base_gen/adr_base_service/retain.rs | 3 +- ...ence_for_asset_updates_command_executor.rs | 154 + ...rence_for_asset_updates_command_invoker.rs | 56 +- ...rence_for_asset_updates_request_payload.rs | 3 +- ...ence_for_asset_updates_response_payload.rs | 3 +- ...rence_for_asset_updates_response_schema.rs | 3 +- ...nce_for_device_updates_command_executor.rs | 154 + ...ence_for_device_updates_command_invoker.rs | 56 +- ...ence_for_device_updates_request_payload.rs | 3 +- ...nce_for_device_updates_response_payload.rs | 3 +- ...ence_for_device_updates_response_schema.rs | 3 +- .../adr_base_service/trust_settings_schema.rs | 1 + .../update_asset_status_command_executor.rs | 143 + .../update_asset_status_command_invoker.rs | 51 +- .../update_asset_status_request_payload.rs | 3 +- .../update_asset_status_response_payload.rs | 3 +- .../update_asset_status_response_schema.rs | 3 +- .../update_device_status_command_executor.rs | 143 + .../update_device_status_command_invoker.rs | 51 +- .../update_device_status_request_payload.rs | 3 +- .../update_device_status_response_payload.rs | 3 +- .../update_device_status_response_schema.rs | 3 +- .../username_password_credentials_schema.rs | 1 + .../x509credentials_schema.rs | 1 + .../device_discovery_service.rs | 4 - .../device_discovery_service/code_schema.rs | 6 +- ...pdate_discovered_device_command_invoker.rs | 59 +- ...pdate_discovered_device_request_payload.rs | 3 +- ...date_discovered_device_response_payload.rs | 3 +- ...pdate_discovered_device_response_schema.rs | 3 +- .../discovered_device.rs | 1 + .../discovered_device_endpoints.rs | 1 + ...overed_device_outbound_endpoints_schema.rs | 1 + .../discovered_device_response_schema.rs | 1 + .../schemaregistry_gen/schema_registry.rs | 4 - .../schema_registry/format.rs | 15 +- .../schema_registry/get_command_invoker.rs | 58 +- .../schema_registry/get_request_schema.rs | 1 + .../schema_registry/get_response_payload.rs | 3 +- .../schema_registry/get_response_schema.rs | 6 +- .../schema_registry/put_command_invoker.rs | 58 +- .../schema_registry/put_request_schema.rs | 4 +- .../schema_registry/put_response_payload.rs | 3 +- .../schema_registry/put_response_schema.rs | 6 +- .../schema_registry/schema.rs | 5 +- .../schema_registry/schema_registry_error.rs | 6 +- .../schema_registry_error_code.rs | 15 +- .../schema_registry_error_details.rs | 2 +- .../schema_registry_error_target.rs | 59 +- .../schema_registry/schema_type.rs | 3 +- 108 files changed, 7685 insertions(+), 499 deletions(-) mode change 100644 => 100755 codegen2/eval/aio/conv.sh create mode 100644 eng/dtdl/AdrBaseService.TM.json create mode 100644 eng/dtdl/DeviceDiscoveryService.TM.json create mode 100644 eng/dtdl/SchemaNames.json create mode 100644 eng/dtdl/SchemaRegistry.TM.json create mode 100644 eng/dtdl/StateStore.TM.json create mode 100644 rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/asset_update_event_telemetry_sender.rs create mode 100644 rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/create_or_update_discovered_asset_command_executor.rs create mode 100644 rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/device_update_event_telemetry_sender.rs create mode 100644 rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_command_executor.rs create mode 100644 rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_status_command_executor.rs create mode 100644 rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_command_executor.rs create mode 100644 rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_status_command_executor.rs create mode 100644 rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_asset_updates_command_executor.rs create mode 100644 rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_device_updates_command_executor.rs create mode 100644 rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_asset_status_command_executor.rs create mode 100644 rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_device_status_command_executor.rs diff --git a/codegen2/eval/aio/conv.sh b/codegen2/eval/aio/conv.sh old mode 100644 new mode 100755 index eaec63684b..2f779dc9f5 --- a/codegen2/eval/aio/conv.sh +++ b/codegen2/eval/aio/conv.sh @@ -1,6 +1,6 @@ #!/bin/sh -conv=../../src/Dtdl2Wot/bin/Debug/net9.0/Dtdl2Wot.exe +conv=./codegen2/src/Dtdl2Wot/bin/Debug/net9.0/Dtdl2Wot $conv ./eng/dtdl/adr-base-service.json ./eng/dtdl $conv ./eng/dtdl/device-discovery-service.json ./eng/dtdl diff --git a/eng/dtdl/AdrBaseService.TM.json b/eng/dtdl/AdrBaseService.TM.json new file mode 100644 index 0000000000..3c7ff83fad --- /dev/null +++ b/eng/dtdl/AdrBaseService.TM.json @@ -0,0 +1,4810 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "AdrBaseService", + "links": [ + { + "rel": "dtv:naming", + "href": "SchemaNames.json", + "type": "application/json" + } + ], + "schemaDefinitions": { + "AkriServiceError": { + "title": "AkriServiceError", + "type": "object", + "required": [ "code", "message", "timestamp" ], + "dtv:errorMessage": "message", + "properties": { + "code": { + "description": "The error code that identifies the error.", + "title": "CodeSchema", + "type": "string", + "enum": [ + "BadRequest", + "InternalError", + "KubeError", + "SerializationError", + "Unauthorized" + ] + }, + "message": { + "description": "A human-readable description of the error.", + "type": "string" + }, + "timestamp": { + "description": "The timestamp (in UTC) when the error occurred.", + "type": "string", + "format": "date-time" + } + } + } + }, + "actions": { + "getDevice": { + "description": "Retrieve a device by device name and inbound endpoint name.", + "output": { + "description": "Response containing the device resource or error details if the device could not be retrieved.", + "type": "object", + "required": [ "device" ], + "properties": { + "device": { + "description": "The device resource, containing the specific inbound endpoint details as specified by the request.", + "title": "Device", + "type": "object", + "properties": { + "attributes": { + "description": "A set of key-value pairs that contain custom attributes set by the customer.", + "type": "object", + "dtv:additionalProperties": { + "type": "string" + } + }, + "discoveredDeviceRef": { + "description": "Reference to a device. Populated only if the device had been created from discovery flow. Discovered device name must be provided.", + "type": "string" + }, + "enabled": { + "description": "Indicates if the resource and identity are enabled or not. A disabled device cannot authenticate with Microsoft Entra ID.", + "type": "boolean" + }, + "endpoints": { + "description": "Connection endpoint url a device can use to connect to a service.", + "title": "DeviceEndpointsSchema", + "type": "object", + "properties": { + "inbound": { + "type": "object", + "dtv:additionalProperties": { + "title": "InboundSchemaMapValueSchema", + "type": "object", + "required": [ "address", "endpointType" ], + "properties": { + "additionalConfiguration": { + "description": "Stringified JSON that contains connectivity type specific further configuration (e.g. OPC UA, ONVIF).", + "type": "string" + }, + "address": { + "description": "The endpoint address & port. This can be either an IP address (e.g., 192.168.1.1) or a fully qualified domain name (FQDN, e.g., server.example.com).", + "type": "string" + }, + "authentication": { + "description": "Defines the client authentication mechanism to the server.", + "title": "AuthenticationSchema", + "type": "object", + "required": [ "method" ], + "properties": { + "method": { + "description": "Defines the method to authenticate the user of the client at the server.", + "title": "MethodSchema", + "type": "string", + "enum": [ + "Anonymous", + "Certificate", + "UsernamePassword" + ] + }, + "usernamePasswordCredentials": { + "description": "The credentials for authentication mode UsernamePassword.", + "title": "UsernamePasswordCredentialsSchema", + "type": "object", + "required": [ "usernameSecretName", "passwordSecretName" ], + "properties": { + "usernameSecretName": { + "description": "The name of the secret containing the username.", + "type": "string" + }, + "passwordSecretName": { + "description": "The name of the secret containing the password.", + "type": "string" + } + } + }, + "x509Credentials": { + "description": "The x509 certificate for authentication mode Certificate.", + "title": "X509CredentialsSchema", + "type": "object", + "required": [ "certificateSecretName" ], + "properties": { + "certificateSecretName": { + "description": "The name of the secret containing the certificate and private key (e.g. stored as .der/.pem or .der/.pfx).", + "type": "string" + }, + "intermediateCertificatesSecretName": { + "description": "A reference to the secret containing the combined intermediate certificates in PEM format.", + "type": "string" + }, + "keySecretName": { + "description": "A reference to the secret containing the certificate private key in PEM or DER format.", + "type": "string" + } + } + } + } + }, + "endpointType": { + "description": "Type of connection endpoint.", + "type": "string" + }, + "trustSettings": { + "description": "Defines server trust settings for the endpoint.", + "title": "TrustSettingsSchema", + "type": "object", + "properties": { + "trustList": { + "description": "Secret reference to certificates list to trust.", + "type": "string" + } + } + }, + "version": { + "description": "Version associated with device endpoint.", + "type": "string" + } + } + } + }, + "outbound": { + "description": "Set of endpoints for device to connect to.", + "title": "OutboundSchema", + "type": "object", + "required": [ "assigned" ], + "properties": { + "assigned": { + "description": "Device messaging endpoint model.", + "type": "object", + "dtv:additionalProperties": { + "title": "DeviceOutboundEndpoint", + "type": "object", + "required": [ "address" ], + "properties": { + "address": { + "description": "The endpoint address to connect to.", + "type": "string" + }, + "endpointType": { + "description": "Type of connection used for the messaging endpoint.", + "type": "string" + } + } + } + }, + "unassigned": { + "description": "Device messaging endpoint model.", + "type": "object", + "dtv:additionalProperties": { + "title": "DeviceOutboundEndpoint", + "type": "object", + "required": [ "address" ], + "properties": { + "address": { + "description": "The endpoint address to connect to.", + "type": "string" + }, + "endpointType": { + "description": "Type of connection used for the messaging endpoint.", + "type": "string" + } + } + } + } + } + } + } + }, + "externalDeviceId": { + "description": "The Device ID provided by the customer.", + "type": "string" + }, + "lastTransitionTime": { + "description": "A timestamp (in UTC) that is updated each time the resource is modified.", + "type": "string", + "format": "date-time" + }, + "manufacturer": { + "description": "Device manufacturer.", + "type": "string" + }, + "model": { + "description": "Device model.", + "type": "string" + }, + "operatingSystem": { + "description": "Device operating system.", + "type": "string" + }, + "operatingSystemVersion": { + "description": "Device operating system version.", + "type": "string" + }, + "uuid": { + "description": "Gets a unique identifier for this resource.", + "type": "string" + }, + "version": { + "description": "An integer that is incremented each time the resource is modified.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + } + } + }, + "forms": [ + { + "contentType": "application/json", + "additionalResponses": [ + { + "success": false, + "schema": "AkriServiceError" + } + ], + "dtv:topic": "akri/connector/resources/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/getDevice", + "op": "invokeaction" + } + ] + }, + "getDeviceStatus": { + "description": "Retrieve the status of a device by device name and inbound endpoint name.", + "output": { + "description": "Response containing the device status or error details if the status could not be retrieved.", + "type": "object", + "required": [ "deviceStatus" ], + "properties": { + "deviceStatus": { + "description": "The device status, containing the specific inbound endpoint status as specified by the request.", + "title": "DeviceStatus", + "type": "object", + "properties": { + "config": { + "description": "The configuration status of the device.", + "title": "ConfigStatus", + "type": "object", + "properties": { + "error": { + "description": "The last error that occurred while processing the configuration.", + "title": "ConfigError", + "type": "object", + "properties": { + "code": { + "description": "Error code for classification of errors (ex: '400', '404', '500', etc.).", + "type": "string" + }, + "details": { + "description": "Array of error details that describe the status of each error.", + "type": "array", + "items": { + "title": "DetailsSchemaElementSchema", + "type": "object", + "properties": { + "code": { + "description": "Multi-part error code for classification and root causing of errors (ex: 400.200.100.432).", + "type": "string" + }, + "correlationId": { + "description": "Unique identifier for the transaction to aid in debugging.", + "type": "string" + }, + "info": { + "description": "Human readable helpful detailed text context for debugging (ex: “The following mechanisms are supported...”).", + "type": "string" + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “Authentication method not supported”).", + "type": "string" + } + } + } + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “capability Id ''foo'' does not exist”).", + "type": "string" + } + } + }, + "lastTransitionTime": { + "description": "A read only timestamp indicating the last time the configuration has been modified from the perspective of the current actual (Edge) state of the CRD. Edge would be the only writer of this value and would sync back up to the cloud.", + "type": "string", + "format": "date-time" + }, + "version": { + "description": "A read only incremental counter indicating the number of times the configuration has been modified from the perspective of the current actual (Edge) state of the CRD. Edge would be the only writer of this value and would sync back up to the cloud. In steady state, this should equal version.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + }, + "endpoints": { + "description": "Defines the device status for inbound/outbound endpoints.", + "title": "DeviceStatusEndpointSchema", + "type": "object", + "properties": { + "inbound": { + "type": "object", + "dtv:additionalProperties": { + "title": "DeviceStatusInboundEndpointSchemaMapValueSchema", + "type": "object", + "properties": { + "error": { + "description": "The last error that occurred while processing the endpoint.", + "title": "ConfigError", + "type": "object", + "properties": { + "code": { + "description": "Error code for classification of errors (ex: '400', '404', '500', etc.).", + "type": "string" + }, + "details": { + "description": "Array of error details that describe the status of each error.", + "type": "array", + "items": { + "title": "DetailsSchemaElementSchema", + "type": "object", + "properties": { + "code": { + "description": "Multi-part error code for classification and root causing of errors (ex: 400.200.100.432).", + "type": "string" + }, + "correlationId": { + "description": "Unique identifier for the transaction to aid in debugging.", + "type": "string" + }, + "info": { + "description": "Human readable helpful detailed text context for debugging (ex: “The following mechanisms are supported...”).", + "type": "string" + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “Authentication method not supported”).", + "type": "string" + } + } + } + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “capability Id ''foo'' does not exist”).", + "type": "string" + } + } + } + } + } + } + } + } + } + } + } + }, + "forms": [ + { + "contentType": "application/json", + "additionalResponses": [ + { + "success": false, + "schema": "AkriServiceError" + } + ], + "dtv:topic": "akri/connector/resources/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/getDeviceStatus", + "op": "invokeaction" + } + ] + }, + "getAsset": { + "description": "Retrieve an asset by asset name.", + "input": { + "description": "The name of the asset to retrieve.", + "type": "object", + "required": [ "assetName" ], + "properties": { + "assetName": { + "type": "string" + } + } + }, + "output": { + "description": "Response containing the asset resource or error details if the asset could not be retrieved.", + "type": "object", + "required": [ "asset" ], + "properties": { + "asset": { + "description": "The asset resource", + "title": "Asset", + "type": "object", + "required": [ "deviceRef" ], + "properties": { + "assetTypeRefs": { + "description": "URIs or type definition IDs.", + "type": "array", + "items": { + "type": "string" + } + }, + "attributes": { + "description": "A set of key-value pairs that contain custom attributes set by the customer.", + "type": "object", + "dtv:additionalProperties": { + "type": "string" + } + }, + "datasets": { + "description": "Array of data sets that are part of the asset. Each data set describes the data points that make up the set.", + "type": "array", + "items": { + "title": "AssetDatasetSchemaElementSchema", + "type": "object", + "required": [ "name" ], + "properties": { + "dataPoints": { + "type": "array", + "items": { + "title": "AssetDatasetDataPointSchemaElementSchema", + "type": "object", + "required": [ "name" ], + "properties": { + "dataPointConfiguration": { + "description": "Stringified JSON that contains connector-specific configuration for the data point.", + "type": "string" + }, + "dataSource": { + "description": "The address of the source of the data in the asset (e.g. URL) so that a client can access the data source on the asset.", + "type": "string" + }, + "name": { + "description": "The name of the data point.", + "type": "string" + }, + "typeRef": { + "description": "URI or type definition ID.", + "type": "string" + } + } + } + }, + "dataSource": { + "description": "Reference to a data source for a given dataset.", + "type": "string" + }, + "datasetConfiguration": { + "description": "Stringified JSON that contains connector-specific JSON string that describes configuration for the specific dataset.", + "type": "string" + }, + "destinations": { + "description": "Destinations for a dataset.", + "type": "array", + "items": { + "title": "DatasetDestination", + "type": "object", + "required": [ "configuration", "target" ], + "properties": { + "configuration": { + "description": "The destination configuration.", + "title": "DestinationConfiguration", + "type": "object", + "properties": { + "key": { + "description": "The BrokerStateStore destination configuration key.", + "type": "string" + }, + "path": { + "description": "The Storage destination configuration path.", + "type": "string" + }, + "qos": { + "description": "The MQTT QoS setting.", + "title": "Qos", + "type": "string", + "enum": [ + "Qos0", + "Qos1" + ] + }, + "retain": { + "description": "When set to 'Keep', messages published to an MQTT broker will have the retain flag set.", + "title": "Retain", + "type": "string", + "enum": [ + "Keep", + "Never" + ] + }, + "topic": { + "description": "The MQTT topic.", + "type": "string" + }, + "ttl": { + "description": "The MQTT TTL setting.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + }, + "target": { + "description": "The target destination.", + "title": "DatasetTarget", + "type": "string", + "enum": [ + "BrokerStateStore", + "Mqtt", + "Storage" + ] + } + } + } + }, + "name": { + "description": "Name of the dataset.", + "type": "string" + }, + "typeRef": { + "description": "URI or type definition ID.", + "type": "string" + } + } + } + }, + "defaultDatasetsConfiguration": { + "description": "Stringified JSON that contains connector-specific default configuration for all datasets. Each dataset can have its own configuration that overrides the default settings here.", + "type": "string" + }, + "defaultDatasetsDestinations": { + "description": "Default destinations for a dataset.", + "type": "array", + "items": { + "title": "DatasetDestination", + "type": "object", + "required": [ "configuration", "target" ], + "properties": { + "configuration": { + "description": "The destination configuration.", + "title": "DestinationConfiguration", + "type": "object", + "properties": { + "key": { + "description": "The BrokerStateStore destination configuration key.", + "type": "string" + }, + "path": { + "description": "The Storage destination configuration path.", + "type": "string" + }, + "qos": { + "description": "The MQTT QoS setting.", + "title": "Qos", + "type": "string", + "enum": [ + "Qos0", + "Qos1" + ] + }, + "retain": { + "description": "When set to 'Keep', messages published to an MQTT broker will have the retain flag set.", + "title": "Retain", + "type": "string", + "enum": [ + "Keep", + "Never" + ] + }, + "topic": { + "description": "The MQTT topic.", + "type": "string" + }, + "ttl": { + "description": "The MQTT TTL setting.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + }, + "target": { + "description": "The target destination.", + "title": "DatasetTarget", + "type": "string", + "enum": [ + "BrokerStateStore", + "Mqtt", + "Storage" + ] + } + } + } + }, + "defaultEventsConfiguration": { + "description": "Stringified JSON that contains connector-specific default configuration for all events. Each event can have its own configuration that overrides the default settings here.", + "type": "string" + }, + "defaultEventsDestinations": { + "description": "Default destinations for an event.", + "type": "array", + "items": { + "title": "EventStreamDestination", + "type": "object", + "required": [ "configuration", "target" ], + "properties": { + "configuration": { + "description": "The destination configuration.", + "title": "DestinationConfiguration", + "type": "object", + "properties": { + "key": { + "description": "The BrokerStateStore destination configuration key.", + "type": "string" + }, + "path": { + "description": "The Storage destination configuration path.", + "type": "string" + }, + "qos": { + "description": "The MQTT QoS setting.", + "title": "Qos", + "type": "string", + "enum": [ + "Qos0", + "Qos1" + ] + }, + "retain": { + "description": "When set to 'Keep', messages published to an MQTT broker will have the retain flag set.", + "title": "Retain", + "type": "string", + "enum": [ + "Keep", + "Never" + ] + }, + "topic": { + "description": "The MQTT topic.", + "type": "string" + }, + "ttl": { + "description": "The MQTT TTL setting.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + }, + "target": { + "description": "The target destination.", + "title": "EventStreamTarget", + "type": "string", + "enum": [ + "Mqtt", + "Storage" + ] + } + } + } + }, + "defaultManagementGroupsConfiguration": { + "description": "Stringified JSON that contains connector-specific default configuration for all management groups. Each management group can have its own configuration that overrides the default settings here.", + "type": "string" + }, + "defaultStreamsConfiguration": { + "description": "Stringified JSON that contains connector-specific default configuration for all streams. Each stream can have its own configuration that overrides the default settings here.", + "type": "string" + }, + "defaultStreamsDestinations": { + "description": "Default destinations for a stream.", + "type": "array", + "items": { + "title": "EventStreamDestination", + "type": "object", + "required": [ "configuration", "target" ], + "properties": { + "configuration": { + "description": "The destination configuration.", + "title": "DestinationConfiguration", + "type": "object", + "properties": { + "key": { + "description": "The BrokerStateStore destination configuration key.", + "type": "string" + }, + "path": { + "description": "The Storage destination configuration path.", + "type": "string" + }, + "qos": { + "description": "The MQTT QoS setting.", + "title": "Qos", + "type": "string", + "enum": [ + "Qos0", + "Qos1" + ] + }, + "retain": { + "description": "When set to 'Keep', messages published to an MQTT broker will have the retain flag set.", + "title": "Retain", + "type": "string", + "enum": [ + "Keep", + "Never" + ] + }, + "topic": { + "description": "The MQTT topic.", + "type": "string" + }, + "ttl": { + "description": "The MQTT TTL setting.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + }, + "target": { + "description": "The target destination.", + "title": "EventStreamTarget", + "type": "string", + "enum": [ + "Mqtt", + "Storage" + ] + } + } + } + }, + "description": { + "description": "Human-readable description of the asset.", + "type": "string" + }, + "deviceRef": { + "description": "Reference to the device that provides data for this asset. Must provide device name & endpoint on the device to use.", + "title": "AssetDeviceRef", + "type": "object", + "required": [ "deviceName", "endpointName" ], + "properties": { + "deviceName": { + "description": "Name of the device resource.", + "type": "string" + }, + "endpointName": { + "description": "The name of endpoint to use.", + "type": "string" + } + } + }, + "discoveredAssetRefs": { + "description": "Reference to a list of discovered assets. Populated only if the asset has been created from discovery flow. Discovered asset names must be provided.", + "type": "array", + "items": { + "type": "string" + } + }, + "displayName": { + "description": "Human-readable display name.", + "type": "string" + }, + "documentationUri": { + "description": "Asset documentation reference.", + "type": "string" + }, + "enabled": { + "description": "Enabled/Disabled status of the asset.", + "type": "boolean" + }, + "eventGroups": { + "description": "Array of events that are part of the asset. Each event can have per-event configuration.", + "type": "array", + "items": { + "title": "AssetEventGroupSchemaElementSchema", + "type": "object", + "required": [ "name" ], + "properties": { + "dataSource": { + "description": "The address of the notifier of the event in the asset (e.g. URL) so that a client can access the event on the asset.", + "type": "string" + }, + "defaultEventsDestinations": { + "description": "Default destinations for an event.", + "type": "array", + "items": { + "title": "EventStreamDestination", + "type": "object", + "required": [ "configuration", "target" ], + "properties": { + "configuration": { + "description": "The destination configuration.", + "title": "DestinationConfiguration", + "type": "object", + "properties": { + "key": { + "description": "The BrokerStateStore destination configuration key.", + "type": "string" + }, + "path": { + "description": "The Storage destination configuration path.", + "type": "string" + }, + "qos": { + "description": "The MQTT QoS setting.", + "title": "Qos", + "type": "string", + "enum": [ + "Qos0", + "Qos1" + ] + }, + "retain": { + "description": "When set to 'Keep', messages published to an MQTT broker will have the retain flag set.", + "title": "Retain", + "type": "string", + "enum": [ + "Keep", + "Never" + ] + }, + "topic": { + "description": "The MQTT topic.", + "type": "string" + }, + "ttl": { + "description": "The MQTT TTL setting.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + }, + "target": { + "description": "The target destination.", + "title": "EventStreamTarget", + "type": "string", + "enum": [ + "Mqtt", + "Storage" + ] + } + } + } + }, + "eventGroupConfiguration": { + "description": "Stringified JSON that contains connector-specific configuration for the event. For OPC UA, this could include configuration like, publishingInterval, samplingInterval, and queueSize.", + "type": "string" + }, + "events": { + "description": "Array of events that are part of the asset. Each event can have per-event configuration.", + "type": "array", + "items": { + "title": "AssetEventSchemaElementSchema", + "type": "object", + "required": [ "name" ], + "properties": { + "dataSource": { + "description": "Reference to a data source for a given event.", + "type": "string" + }, + "destinations": { + "description": "Destinations for an event.", + "type": "array", + "items": { + "title": "EventStreamDestination", + "type": "object", + "required": [ "configuration", "target" ], + "properties": { + "configuration": { + "description": "The destination configuration.", + "title": "DestinationConfiguration", + "type": "object", + "properties": { + "key": { + "description": "The BrokerStateStore destination configuration key.", + "type": "string" + }, + "path": { + "description": "The Storage destination configuration path.", + "type": "string" + }, + "qos": { + "description": "The MQTT QoS setting.", + "title": "Qos", + "type": "string", + "enum": [ + "Qos0", + "Qos1" + ] + }, + "retain": { + "description": "When set to 'Keep', messages published to an MQTT broker will have the retain flag set.", + "title": "Retain", + "type": "string", + "enum": [ + "Keep", + "Never" + ] + }, + "topic": { + "description": "The MQTT topic.", + "type": "string" + }, + "ttl": { + "description": "The MQTT TTL setting.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + }, + "target": { + "description": "The target destination.", + "title": "EventStreamTarget", + "type": "string", + "enum": [ + "Mqtt", + "Storage" + ] + } + } + } + }, + "eventConfiguration": { + "description": "Stringified JSON that contains connector-specific configuration for the specific event.", + "type": "string" + }, + "name": { + "description": "The name of the event.", + "type": "string" + }, + "typeRef": { + "description": "URI or type definition ID.", + "type": "string" + } + } + } + }, + "name": { + "description": "Name of the event group.", + "type": "string" + }, + "typeRef": { + "description": "URI or type definition ID.", + "type": "string" + } + } + } + }, + "externalAssetId": { + "description": "Asset ID provided by the customer.", + "type": "string" + }, + "hardwareRevision": { + "description": "Asset hardware revision number.", + "type": "string" + }, + "lastTransitionTime": { + "description": "A timestamp (in UTC) that is updated each time the resource is modified.", + "type": "string", + "format": "date-time" + }, + "managementGroups": { + "description": "Array of management groups that are part of the asset.", + "type": "array", + "items": { + "title": "AssetManagementGroupSchemaElementSchema", + "type": "object", + "required": [ "name" ], + "properties": { + "actions": { + "description": "Array of actions that are part of the management group. Each action can have an individual configuration.", + "type": "array", + "items": { + "title": "AssetManagementGroupActionSchemaElementSchema", + "type": "object", + "required": [ "actionType", "name", "targetUri" ], + "properties": { + "actionConfiguration": { + "description": "Configuration for the action.", + "type": "string" + }, + "actionType": { + "description": "Type of the action.", + "title": "AssetManagementGroupActionType", + "type": "string", + "enum": [ + "Call", + "Read", + "Write" + ] + }, + "name": { + "description": "Name of the action.", + "type": "string" + }, + "targetUri": { + "description": "The target URI on which a client can invoke the specific action.", + "type": "string" + }, + "timeoutInSeconds": { + "description": "Response timeout for the action.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + }, + "topic": { + "description": "The MQTT topic path on which a client will receive the request for the action.", + "type": "string" + }, + "typeRef": { + "description": "URI or type definition ID.", + "type": "string" + } + } + } + }, + "dataSource": { + "description": "Reference to a data source for a given management group.", + "type": "string" + }, + "defaultTimeoutInSeconds": { + "description": "Default response timeout for all actions that are part of the management group.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + }, + "defaultTopic": { + "description": "Default MQTT topic path on which a client will receive the request for all actions that are part of the management group.", + "type": "string" + }, + "managementGroupConfiguration": { + "description": "Stringified JSON that contains connector-specific configuration for the management group.", + "type": "string" + }, + "name": { + "description": "Name of the management group.", + "type": "string" + }, + "typeRef": { + "description": "URI or type definition ID.", + "type": "string" + } + } + } + }, + "manufacturer": { + "description": "Asset manufacturer.", + "type": "string" + }, + "manufacturerUri": { + "description": "Asset manufacturer URI.", + "type": "string" + }, + "model": { + "description": "Asset model.", + "type": "string" + }, + "productCode": { + "description": "Asset product code.", + "type": "string" + }, + "serialNumber": { + "description": "Asset serial number.", + "type": "string" + }, + "softwareRevision": { + "description": "Asset software revision number.", + "type": "string" + }, + "streams": { + "description": "Array of streams that are part of the asset. Each stream can have per-stream configuration.", + "type": "array", + "items": { + "title": "AssetStreamSchemaElementSchema", + "type": "object", + "required": [ "name" ], + "properties": { + "destinations": { + "description": "Destinations for a Stream.", + "type": "array", + "items": { + "title": "EventStreamDestination", + "type": "object", + "required": [ "configuration", "target" ], + "properties": { + "configuration": { + "description": "The destination configuration.", + "title": "DestinationConfiguration", + "type": "object", + "properties": { + "key": { + "description": "The BrokerStateStore destination configuration key.", + "type": "string" + }, + "path": { + "description": "The Storage destination configuration path.", + "type": "string" + }, + "qos": { + "description": "The MQTT QoS setting.", + "title": "Qos", + "type": "string", + "enum": [ + "Qos0", + "Qos1" + ] + }, + "retain": { + "description": "When set to 'Keep', messages published to an MQTT broker will have the retain flag set.", + "title": "Retain", + "type": "string", + "enum": [ + "Keep", + "Never" + ] + }, + "topic": { + "description": "The MQTT topic.", + "type": "string" + }, + "ttl": { + "description": "The MQTT TTL setting.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + }, + "target": { + "description": "The target destination.", + "title": "EventStreamTarget", + "type": "string", + "enum": [ + "Mqtt", + "Storage" + ] + } + } + } + }, + "name": { + "description": "Name of the stream definition.", + "type": "string" + }, + "streamConfiguration": { + "description": "Stringified JSON that contains connector-specific JSON string that describes configuration for the specific stream.", + "type": "string" + }, + "typeRef": { + "description": "URI or type definition ID.", + "type": "string" + } + } + } + }, + "uuid": { + "description": "Globally unique, immutable, non-reusable id.", + "type": "string" + }, + "version": { + "description": "A read-only integer that is incremented each time the resource is modified the cloud.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + } + } + }, + "forms": [ + { + "contentType": "application/json", + "additionalResponses": [ + { + "success": false, + "schema": "AkriServiceError" + } + ], + "dtv:topic": "akri/connector/resources/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/getAsset", + "op": "invokeaction" + } + ] + }, + "getAssetStatus": { + "description": "Retrieve the status of an asset by asset name.", + "input": { + "description": "The name of the asset to retrieve the status for.", + "type": "object", + "required": [ "assetName" ], + "properties": { + "assetName": { + "type": "string" + } + } + }, + "output": { + "description": "Response containing the asset status or error details if the status could not be retrieved.", + "type": "object", + "required": [ "assetStatus" ], + "properties": { + "assetStatus": { + "description": "The asset status", + "title": "AssetStatus", + "type": "object", + "properties": { + "config": { + "description": "The configuration status of the asset.", + "title": "ConfigStatus", + "type": "object", + "properties": { + "error": { + "description": "The last error that occurred while processing the configuration.", + "title": "ConfigError", + "type": "object", + "properties": { + "code": { + "description": "Error code for classification of errors (ex: '400', '404', '500', etc.).", + "type": "string" + }, + "details": { + "description": "Array of error details that describe the status of each error.", + "type": "array", + "items": { + "title": "DetailsSchemaElementSchema", + "type": "object", + "properties": { + "code": { + "description": "Multi-part error code for classification and root causing of errors (ex: 400.200.100.432).", + "type": "string" + }, + "correlationId": { + "description": "Unique identifier for the transaction to aid in debugging.", + "type": "string" + }, + "info": { + "description": "Human readable helpful detailed text context for debugging (ex: “The following mechanisms are supported...”).", + "type": "string" + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “Authentication method not supported”).", + "type": "string" + } + } + } + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “capability Id ''foo'' does not exist”).", + "type": "string" + } + } + }, + "lastTransitionTime": { + "description": "A read only timestamp indicating the last time the configuration has been modified from the perspective of the current actual (Edge) state of the CRD. Edge would be the only writer of this value and would sync back up to the cloud.", + "type": "string", + "format": "date-time" + }, + "version": { + "description": "A read only incremental counter indicating the number of times the configuration has been modified from the perspective of the current actual (Edge) state of the CRD. Edge would be the only writer of this value and would sync back up to the cloud. In steady state, this should equal version.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + }, + "datasets": { + "description": "Array of dataset statuses that describe the status of each dataset.", + "type": "array", + "items": { + "title": "AssetDatasetEventStreamStatus", + "type": "object", + "required": [ "name" ], + "properties": { + "error": { + "description": "The last error that occurred while processing the dataset/event/stream.", + "title": "ConfigError", + "type": "object", + "properties": { + "code": { + "description": "Error code for classification of errors (ex: '400', '404', '500', etc.).", + "type": "string" + }, + "details": { + "description": "Array of error details that describe the status of each error.", + "type": "array", + "items": { + "title": "DetailsSchemaElementSchema", + "type": "object", + "properties": { + "code": { + "description": "Multi-part error code for classification and root causing of errors (ex: 400.200.100.432).", + "type": "string" + }, + "correlationId": { + "description": "Unique identifier for the transaction to aid in debugging.", + "type": "string" + }, + "info": { + "description": "Human readable helpful detailed text context for debugging (ex: “The following mechanisms are supported...”).", + "type": "string" + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “Authentication method not supported”).", + "type": "string" + } + } + } + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “capability Id ''foo'' does not exist”).", + "type": "string" + } + } + }, + "messageSchemaReference": { + "description": "The message schema reference object.", + "title": "MessageSchemaReference", + "type": "object", + "required": [ "schemaName", "schemaRegistryNamespace", "schemaVersion" ], + "properties": { + "schemaName": { + "description": "The reference to the message schema name.", + "type": "string" + }, + "schemaRegistryNamespace": { + "description": "The reference to the message schema registry namespace.", + "type": "string" + }, + "schemaVersion": { + "description": "The reference to the message schema version.", + "type": "string" + } + } + }, + "name": { + "description": "The name of the dataset/event/stream. Must be unique within the status.datasets[i]/events[i]/streams[i] array. This name is used to correlate between the spec and status dataset/event/stream information.", + "type": "string" + } + } + } + }, + "eventGroups": { + "description": "Array of event group statuses that describe the status of each event group.", + "type": "array", + "items": { + "title": "AssetEventGroupStatusSchemaElementSchema", + "type": "object", + "required": [ "name" ], + "properties": { + "events": { + "description": "Array of event statuses that describe the status of each event in the event group.", + "type": "array", + "items": { + "title": "AssetDatasetEventStreamStatus", + "type": "object", + "required": [ "name" ], + "properties": { + "error": { + "description": "The last error that occurred while processing the dataset/event/stream.", + "title": "ConfigError", + "type": "object", + "properties": { + "code": { + "description": "Error code for classification of errors (ex: '400', '404', '500', etc.).", + "type": "string" + }, + "details": { + "description": "Array of error details that describe the status of each error.", + "type": "array", + "items": { + "title": "DetailsSchemaElementSchema", + "type": "object", + "properties": { + "code": { + "description": "Multi-part error code for classification and root causing of errors (ex: 400.200.100.432).", + "type": "string" + }, + "correlationId": { + "description": "Unique identifier for the transaction to aid in debugging.", + "type": "string" + }, + "info": { + "description": "Human readable helpful detailed text context for debugging (ex: “The following mechanisms are supported...”).", + "type": "string" + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “Authentication method not supported”).", + "type": "string" + } + } + } + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “capability Id ''foo'' does not exist”).", + "type": "string" + } + } + }, + "messageSchemaReference": { + "description": "The message schema reference object.", + "title": "MessageSchemaReference", + "type": "object", + "required": [ "schemaName", "schemaRegistryNamespace", "schemaVersion" ], + "properties": { + "schemaName": { + "description": "The reference to the message schema name.", + "type": "string" + }, + "schemaRegistryNamespace": { + "description": "The reference to the message schema registry namespace.", + "type": "string" + }, + "schemaVersion": { + "description": "The reference to the message schema version.", + "type": "string" + } + } + }, + "name": { + "description": "The name of the dataset/event/stream. Must be unique within the status.datasets[i]/events[i]/streams[i] array. This name is used to correlate between the spec and status dataset/event/stream information.", + "type": "string" + } + } + } + }, + "name": { + "description": "The name of the event group. Must be unique within the status.eventGroups array. This name is used to correlate between the spec and status event group information.", + "type": "string" + } + } + } + }, + "managementGroups": { + "description": "Array of management group statuses that describe the status of each management group.", + "type": "array", + "items": { + "title": "AssetManagementGroupStatusSchemaElementSchema", + "type": "object", + "required": [ "name" ], + "properties": { + "actions": { + "description": "Array of action statuses that describe the status of each action.", + "type": "array", + "items": { + "title": "AssetManagementGroupActionStatusSchemaElementSchema", + "type": "object", + "required": [ "name" ], + "properties": { + "error": { + "description": "The last error that occurred while processing the action.", + "title": "ConfigError", + "type": "object", + "properties": { + "code": { + "description": "Error code for classification of errors (ex: '400', '404', '500', etc.).", + "type": "string" + }, + "details": { + "description": "Array of error details that describe the status of each error.", + "type": "array", + "items": { + "title": "DetailsSchemaElementSchema", + "type": "object", + "properties": { + "code": { + "description": "Multi-part error code for classification and root causing of errors (ex: 400.200.100.432).", + "type": "string" + }, + "correlationId": { + "description": "Unique identifier for the transaction to aid in debugging.", + "type": "string" + }, + "info": { + "description": "Human readable helpful detailed text context for debugging (ex: “The following mechanisms are supported...”).", + "type": "string" + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “Authentication method not supported”).", + "type": "string" + } + } + } + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “capability Id ''foo'' does not exist”).", + "type": "string" + } + } + }, + "name": { + "description": "The name of the action. Must be unique within the status.managementGroup[i].actions array. This name is used to correlate between the spec and status management group action information.", + "type": "string" + }, + "requestMessageSchemaReference": { + "description": "The request message schema reference object.", + "title": "MessageSchemaReference", + "type": "object", + "required": [ "schemaName", "schemaRegistryNamespace", "schemaVersion" ], + "properties": { + "schemaName": { + "description": "The reference to the message schema name.", + "type": "string" + }, + "schemaRegistryNamespace": { + "description": "The reference to the message schema registry namespace.", + "type": "string" + }, + "schemaVersion": { + "description": "The reference to the message schema version.", + "type": "string" + } + } + }, + "responseMessageSchemaReference": { + "description": "The response message schema reference object.", + "title": "MessageSchemaReference", + "type": "object", + "required": [ "schemaName", "schemaRegistryNamespace", "schemaVersion" ], + "properties": { + "schemaName": { + "description": "The reference to the message schema name.", + "type": "string" + }, + "schemaRegistryNamespace": { + "description": "The reference to the message schema registry namespace.", + "type": "string" + }, + "schemaVersion": { + "description": "The reference to the message schema version.", + "type": "string" + } + } + } + } + } + }, + "name": { + "description": "The name of the managementgroup. Must be unique within the status.managementGroup array. This name is used to correlate between the spec and status management group information.", + "type": "string" + } + } + } + }, + "streams": { + "description": "Array of stream statuses that describe the status of each stream.", + "type": "array", + "items": { + "title": "AssetDatasetEventStreamStatus", + "type": "object", + "required": [ "name" ], + "properties": { + "error": { + "description": "The last error that occurred while processing the dataset/event/stream.", + "title": "ConfigError", + "type": "object", + "properties": { + "code": { + "description": "Error code for classification of errors (ex: '400', '404', '500', etc.).", + "type": "string" + }, + "details": { + "description": "Array of error details that describe the status of each error.", + "type": "array", + "items": { + "title": "DetailsSchemaElementSchema", + "type": "object", + "properties": { + "code": { + "description": "Multi-part error code for classification and root causing of errors (ex: 400.200.100.432).", + "type": "string" + }, + "correlationId": { + "description": "Unique identifier for the transaction to aid in debugging.", + "type": "string" + }, + "info": { + "description": "Human readable helpful detailed text context for debugging (ex: “The following mechanisms are supported...”).", + "type": "string" + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “Authentication method not supported”).", + "type": "string" + } + } + } + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “capability Id ''foo'' does not exist”).", + "type": "string" + } + } + }, + "messageSchemaReference": { + "description": "The message schema reference object.", + "title": "MessageSchemaReference", + "type": "object", + "required": [ "schemaName", "schemaRegistryNamespace", "schemaVersion" ], + "properties": { + "schemaName": { + "description": "The reference to the message schema name.", + "type": "string" + }, + "schemaRegistryNamespace": { + "description": "The reference to the message schema registry namespace.", + "type": "string" + }, + "schemaVersion": { + "description": "The reference to the message schema version.", + "type": "string" + } + } + }, + "name": { + "description": "The name of the dataset/event/stream. Must be unique within the status.datasets[i]/events[i]/streams[i] array. This name is used to correlate between the spec and status dataset/event/stream information.", + "type": "string" + } + } + } + } + } + } + } + }, + "forms": [ + { + "contentType": "application/json", + "additionalResponses": [ + { + "success": false, + "schema": "AkriServiceError" + } + ], + "dtv:topic": "akri/connector/resources/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/getAssetStatus", + "op": "invokeaction" + } + ] + }, + "updateDeviceStatus": { + "description": "Update the status of a device by device name and inbound endpoint name.", + "input": { + "description": "The device status to update. Fields omitted in the request will be removed. The specified inbound endpoint status will be added or updated in the inbound endpoints map.", + "type": "object", + "required": [ "deviceStatusUpdate" ], + "properties": { + "deviceStatusUpdate": { + "title": "DeviceStatus", + "type": "object", + "properties": { + "config": { + "description": "The configuration status of the device.", + "title": "ConfigStatus", + "type": "object", + "properties": { + "error": { + "description": "The last error that occurred while processing the configuration.", + "title": "ConfigError", + "type": "object", + "properties": { + "code": { + "description": "Error code for classification of errors (ex: '400', '404', '500', etc.).", + "type": "string" + }, + "details": { + "description": "Array of error details that describe the status of each error.", + "type": "array", + "items": { + "title": "DetailsSchemaElementSchema", + "type": "object", + "properties": { + "code": { + "description": "Multi-part error code for classification and root causing of errors (ex: 400.200.100.432).", + "type": "string" + }, + "correlationId": { + "description": "Unique identifier for the transaction to aid in debugging.", + "type": "string" + }, + "info": { + "description": "Human readable helpful detailed text context for debugging (ex: “The following mechanisms are supported...”).", + "type": "string" + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “Authentication method not supported”).", + "type": "string" + } + } + } + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “capability Id ''foo'' does not exist”).", + "type": "string" + } + } + }, + "lastTransitionTime": { + "description": "A read only timestamp indicating the last time the configuration has been modified from the perspective of the current actual (Edge) state of the CRD. Edge would be the only writer of this value and would sync back up to the cloud.", + "type": "string", + "format": "date-time" + }, + "version": { + "description": "A read only incremental counter indicating the number of times the configuration has been modified from the perspective of the current actual (Edge) state of the CRD. Edge would be the only writer of this value and would sync back up to the cloud. In steady state, this should equal version.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + }, + "endpoints": { + "description": "Defines the device status for inbound/outbound endpoints.", + "title": "DeviceStatusEndpointSchema", + "type": "object", + "properties": { + "inbound": { + "type": "object", + "dtv:additionalProperties": { + "title": "DeviceStatusInboundEndpointSchemaMapValueSchema", + "type": "object", + "properties": { + "error": { + "description": "The last error that occurred while processing the endpoint.", + "title": "ConfigError", + "type": "object", + "properties": { + "code": { + "description": "Error code for classification of errors (ex: '400', '404', '500', etc.).", + "type": "string" + }, + "details": { + "description": "Array of error details that describe the status of each error.", + "type": "array", + "items": { + "title": "DetailsSchemaElementSchema", + "type": "object", + "properties": { + "code": { + "description": "Multi-part error code for classification and root causing of errors (ex: 400.200.100.432).", + "type": "string" + }, + "correlationId": { + "description": "Unique identifier for the transaction to aid in debugging.", + "type": "string" + }, + "info": { + "description": "Human readable helpful detailed text context for debugging (ex: “The following mechanisms are supported...”).", + "type": "string" + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “Authentication method not supported”).", + "type": "string" + } + } + } + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “capability Id ''foo'' does not exist”).", + "type": "string" + } + } + } + } + } + } + } + } + } + } + } + }, + "output": { + "description": "Response containing the updated device status or error details if the update failed.", + "type": "object", + "required": [ "updatedDeviceStatus" ], + "properties": { + "updatedDeviceStatus": { + "description": "The updated device status containing the specific inbound endpoint status as specified by the request.", + "title": "DeviceStatus", + "type": "object", + "properties": { + "config": { + "description": "The configuration status of the device.", + "title": "ConfigStatus", + "type": "object", + "properties": { + "error": { + "description": "The last error that occurred while processing the configuration.", + "title": "ConfigError", + "type": "object", + "properties": { + "code": { + "description": "Error code for classification of errors (ex: '400', '404', '500', etc.).", + "type": "string" + }, + "details": { + "description": "Array of error details that describe the status of each error.", + "type": "array", + "items": { + "title": "DetailsSchemaElementSchema", + "type": "object", + "properties": { + "code": { + "description": "Multi-part error code for classification and root causing of errors (ex: 400.200.100.432).", + "type": "string" + }, + "correlationId": { + "description": "Unique identifier for the transaction to aid in debugging.", + "type": "string" + }, + "info": { + "description": "Human readable helpful detailed text context for debugging (ex: “The following mechanisms are supported...”).", + "type": "string" + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “Authentication method not supported”).", + "type": "string" + } + } + } + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “capability Id ''foo'' does not exist”).", + "type": "string" + } + } + }, + "lastTransitionTime": { + "description": "A read only timestamp indicating the last time the configuration has been modified from the perspective of the current actual (Edge) state of the CRD. Edge would be the only writer of this value and would sync back up to the cloud.", + "type": "string", + "format": "date-time" + }, + "version": { + "description": "A read only incremental counter indicating the number of times the configuration has been modified from the perspective of the current actual (Edge) state of the CRD. Edge would be the only writer of this value and would sync back up to the cloud. In steady state, this should equal version.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + }, + "endpoints": { + "description": "Defines the device status for inbound/outbound endpoints.", + "title": "DeviceStatusEndpointSchema", + "type": "object", + "properties": { + "inbound": { + "type": "object", + "dtv:additionalProperties": { + "title": "DeviceStatusInboundEndpointSchemaMapValueSchema", + "type": "object", + "properties": { + "error": { + "description": "The last error that occurred while processing the endpoint.", + "title": "ConfigError", + "type": "object", + "properties": { + "code": { + "description": "Error code for classification of errors (ex: '400', '404', '500', etc.).", + "type": "string" + }, + "details": { + "description": "Array of error details that describe the status of each error.", + "type": "array", + "items": { + "title": "DetailsSchemaElementSchema", + "type": "object", + "properties": { + "code": { + "description": "Multi-part error code for classification and root causing of errors (ex: 400.200.100.432).", + "type": "string" + }, + "correlationId": { + "description": "Unique identifier for the transaction to aid in debugging.", + "type": "string" + }, + "info": { + "description": "Human readable helpful detailed text context for debugging (ex: “The following mechanisms are supported...”).", + "type": "string" + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “Authentication method not supported”).", + "type": "string" + } + } + } + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “capability Id ''foo'' does not exist”).", + "type": "string" + } + } + } + } + } + } + } + } + } + } + } + }, + "forms": [ + { + "contentType": "application/json", + "additionalResponses": [ + { + "success": false, + "schema": "AkriServiceError" + } + ], + "dtv:topic": "akri/connector/resources/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/updateDeviceStatus", + "op": "invokeaction" + } + ] + }, + "updateAssetStatus": { + "description": "Update the status of an asset by asset name.", + "input": { + "description": "The asset status update request.", + "type": "object", + "required": [ "assetStatusUpdate" ], + "properties": { + "assetStatusUpdate": { + "title": "UpdateAssetStatusRequestSchema", + "type": "object", + "required": [ "assetName", "assetStatus" ], + "properties": { + "assetName": { + "description": "The name of the asset to update the status for.", + "type": "string" + }, + "assetStatus": { + "description": "The asset status to update. Fields omitted in the request will be removed.", + "title": "AssetStatus", + "type": "object", + "properties": { + "config": { + "description": "The configuration status of the asset.", + "title": "ConfigStatus", + "type": "object", + "properties": { + "error": { + "description": "The last error that occurred while processing the configuration.", + "title": "ConfigError", + "type": "object", + "properties": { + "code": { + "description": "Error code for classification of errors (ex: '400', '404', '500', etc.).", + "type": "string" + }, + "details": { + "description": "Array of error details that describe the status of each error.", + "type": "array", + "items": { + "title": "DetailsSchemaElementSchema", + "type": "object", + "properties": { + "code": { + "description": "Multi-part error code for classification and root causing of errors (ex: 400.200.100.432).", + "type": "string" + }, + "correlationId": { + "description": "Unique identifier for the transaction to aid in debugging.", + "type": "string" + }, + "info": { + "description": "Human readable helpful detailed text context for debugging (ex: “The following mechanisms are supported...”).", + "type": "string" + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “Authentication method not supported”).", + "type": "string" + } + } + } + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “capability Id ''foo'' does not exist”).", + "type": "string" + } + } + }, + "lastTransitionTime": { + "description": "A read only timestamp indicating the last time the configuration has been modified from the perspective of the current actual (Edge) state of the CRD. Edge would be the only writer of this value and would sync back up to the cloud.", + "type": "string", + "format": "date-time" + }, + "version": { + "description": "A read only incremental counter indicating the number of times the configuration has been modified from the perspective of the current actual (Edge) state of the CRD. Edge would be the only writer of this value and would sync back up to the cloud. In steady state, this should equal version.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + }, + "datasets": { + "description": "Array of dataset statuses that describe the status of each dataset.", + "type": "array", + "items": { + "title": "AssetDatasetEventStreamStatus", + "type": "object", + "required": [ "name" ], + "properties": { + "error": { + "description": "The last error that occurred while processing the dataset/event/stream.", + "title": "ConfigError", + "type": "object", + "properties": { + "code": { + "description": "Error code for classification of errors (ex: '400', '404', '500', etc.).", + "type": "string" + }, + "details": { + "description": "Array of error details that describe the status of each error.", + "type": "array", + "items": { + "title": "DetailsSchemaElementSchema", + "type": "object", + "properties": { + "code": { + "description": "Multi-part error code for classification and root causing of errors (ex: 400.200.100.432).", + "type": "string" + }, + "correlationId": { + "description": "Unique identifier for the transaction to aid in debugging.", + "type": "string" + }, + "info": { + "description": "Human readable helpful detailed text context for debugging (ex: “The following mechanisms are supported...”).", + "type": "string" + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “Authentication method not supported”).", + "type": "string" + } + } + } + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “capability Id ''foo'' does not exist”).", + "type": "string" + } + } + }, + "messageSchemaReference": { + "description": "The message schema reference object.", + "title": "MessageSchemaReference", + "type": "object", + "required": [ "schemaName", "schemaRegistryNamespace", "schemaVersion" ], + "properties": { + "schemaName": { + "description": "The reference to the message schema name.", + "type": "string" + }, + "schemaRegistryNamespace": { + "description": "The reference to the message schema registry namespace.", + "type": "string" + }, + "schemaVersion": { + "description": "The reference to the message schema version.", + "type": "string" + } + } + }, + "name": { + "description": "The name of the dataset/event/stream. Must be unique within the status.datasets[i]/events[i]/streams[i] array. This name is used to correlate between the spec and status dataset/event/stream information.", + "type": "string" + } + } + } + }, + "eventGroups": { + "description": "Array of event group statuses that describe the status of each event group.", + "type": "array", + "items": { + "title": "AssetEventGroupStatusSchemaElementSchema", + "type": "object", + "required": [ "name" ], + "properties": { + "events": { + "description": "Array of event statuses that describe the status of each event in the event group.", + "type": "array", + "items": { + "title": "AssetDatasetEventStreamStatus", + "type": "object", + "required": [ "name" ], + "properties": { + "error": { + "description": "The last error that occurred while processing the dataset/event/stream.", + "title": "ConfigError", + "type": "object", + "properties": { + "code": { + "description": "Error code for classification of errors (ex: '400', '404', '500', etc.).", + "type": "string" + }, + "details": { + "description": "Array of error details that describe the status of each error.", + "type": "array", + "items": { + "title": "DetailsSchemaElementSchema", + "type": "object", + "properties": { + "code": { + "description": "Multi-part error code for classification and root causing of errors (ex: 400.200.100.432).", + "type": "string" + }, + "correlationId": { + "description": "Unique identifier for the transaction to aid in debugging.", + "type": "string" + }, + "info": { + "description": "Human readable helpful detailed text context for debugging (ex: “The following mechanisms are supported...”).", + "type": "string" + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “Authentication method not supported”).", + "type": "string" + } + } + } + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “capability Id ''foo'' does not exist”).", + "type": "string" + } + } + }, + "messageSchemaReference": { + "description": "The message schema reference object.", + "title": "MessageSchemaReference", + "type": "object", + "required": [ "schemaName", "schemaRegistryNamespace", "schemaVersion" ], + "properties": { + "schemaName": { + "description": "The reference to the message schema name.", + "type": "string" + }, + "schemaRegistryNamespace": { + "description": "The reference to the message schema registry namespace.", + "type": "string" + }, + "schemaVersion": { + "description": "The reference to the message schema version.", + "type": "string" + } + } + }, + "name": { + "description": "The name of the dataset/event/stream. Must be unique within the status.datasets[i]/events[i]/streams[i] array. This name is used to correlate between the spec and status dataset/event/stream information.", + "type": "string" + } + } + } + }, + "name": { + "description": "The name of the event group. Must be unique within the status.eventGroups array. This name is used to correlate between the spec and status event group information.", + "type": "string" + } + } + } + }, + "managementGroups": { + "description": "Array of management group statuses that describe the status of each management group.", + "type": "array", + "items": { + "title": "AssetManagementGroupStatusSchemaElementSchema", + "type": "object", + "required": [ "name" ], + "properties": { + "actions": { + "description": "Array of action statuses that describe the status of each action.", + "type": "array", + "items": { + "title": "AssetManagementGroupActionStatusSchemaElementSchema", + "type": "object", + "required": [ "name" ], + "properties": { + "error": { + "description": "The last error that occurred while processing the action.", + "title": "ConfigError", + "type": "object", + "properties": { + "code": { + "description": "Error code for classification of errors (ex: '400', '404', '500', etc.).", + "type": "string" + }, + "details": { + "description": "Array of error details that describe the status of each error.", + "type": "array", + "items": { + "title": "DetailsSchemaElementSchema", + "type": "object", + "properties": { + "code": { + "description": "Multi-part error code for classification and root causing of errors (ex: 400.200.100.432).", + "type": "string" + }, + "correlationId": { + "description": "Unique identifier for the transaction to aid in debugging.", + "type": "string" + }, + "info": { + "description": "Human readable helpful detailed text context for debugging (ex: “The following mechanisms are supported...”).", + "type": "string" + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “Authentication method not supported”).", + "type": "string" + } + } + } + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “capability Id ''foo'' does not exist”).", + "type": "string" + } + } + }, + "name": { + "description": "The name of the action. Must be unique within the status.managementGroup[i].actions array. This name is used to correlate between the spec and status management group action information.", + "type": "string" + }, + "requestMessageSchemaReference": { + "description": "The request message schema reference object.", + "title": "MessageSchemaReference", + "type": "object", + "required": [ "schemaName", "schemaRegistryNamespace", "schemaVersion" ], + "properties": { + "schemaName": { + "description": "The reference to the message schema name.", + "type": "string" + }, + "schemaRegistryNamespace": { + "description": "The reference to the message schema registry namespace.", + "type": "string" + }, + "schemaVersion": { + "description": "The reference to the message schema version.", + "type": "string" + } + } + }, + "responseMessageSchemaReference": { + "description": "The response message schema reference object.", + "title": "MessageSchemaReference", + "type": "object", + "required": [ "schemaName", "schemaRegistryNamespace", "schemaVersion" ], + "properties": { + "schemaName": { + "description": "The reference to the message schema name.", + "type": "string" + }, + "schemaRegistryNamespace": { + "description": "The reference to the message schema registry namespace.", + "type": "string" + }, + "schemaVersion": { + "description": "The reference to the message schema version.", + "type": "string" + } + } + } + } + } + }, + "name": { + "description": "The name of the managementgroup. Must be unique within the status.managementGroup array. This name is used to correlate between the spec and status management group information.", + "type": "string" + } + } + } + }, + "streams": { + "description": "Array of stream statuses that describe the status of each stream.", + "type": "array", + "items": { + "title": "AssetDatasetEventStreamStatus", + "type": "object", + "required": [ "name" ], + "properties": { + "error": { + "description": "The last error that occurred while processing the dataset/event/stream.", + "title": "ConfigError", + "type": "object", + "properties": { + "code": { + "description": "Error code for classification of errors (ex: '400', '404', '500', etc.).", + "type": "string" + }, + "details": { + "description": "Array of error details that describe the status of each error.", + "type": "array", + "items": { + "title": "DetailsSchemaElementSchema", + "type": "object", + "properties": { + "code": { + "description": "Multi-part error code for classification and root causing of errors (ex: 400.200.100.432).", + "type": "string" + }, + "correlationId": { + "description": "Unique identifier for the transaction to aid in debugging.", + "type": "string" + }, + "info": { + "description": "Human readable helpful detailed text context for debugging (ex: “The following mechanisms are supported...”).", + "type": "string" + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “Authentication method not supported”).", + "type": "string" + } + } + } + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “capability Id ''foo'' does not exist”).", + "type": "string" + } + } + }, + "messageSchemaReference": { + "description": "The message schema reference object.", + "title": "MessageSchemaReference", + "type": "object", + "required": [ "schemaName", "schemaRegistryNamespace", "schemaVersion" ], + "properties": { + "schemaName": { + "description": "The reference to the message schema name.", + "type": "string" + }, + "schemaRegistryNamespace": { + "description": "The reference to the message schema registry namespace.", + "type": "string" + }, + "schemaVersion": { + "description": "The reference to the message schema version.", + "type": "string" + } + } + }, + "name": { + "description": "The name of the dataset/event/stream. Must be unique within the status.datasets[i]/events[i]/streams[i] array. This name is used to correlate between the spec and status dataset/event/stream information.", + "type": "string" + } + } + } + } + } + } + } + } + } + }, + "output": { + "description": "Response containing the updated asset status or error details if the update failed.", + "type": "object", + "required": [ "updatedAssetStatus" ], + "properties": { + "updatedAssetStatus": { + "description": "The updated asset status.", + "title": "AssetStatus", + "type": "object", + "properties": { + "config": { + "description": "The configuration status of the asset.", + "title": "ConfigStatus", + "type": "object", + "properties": { + "error": { + "description": "The last error that occurred while processing the configuration.", + "title": "ConfigError", + "type": "object", + "properties": { + "code": { + "description": "Error code for classification of errors (ex: '400', '404', '500', etc.).", + "type": "string" + }, + "details": { + "description": "Array of error details that describe the status of each error.", + "type": "array", + "items": { + "title": "DetailsSchemaElementSchema", + "type": "object", + "properties": { + "code": { + "description": "Multi-part error code for classification and root causing of errors (ex: 400.200.100.432).", + "type": "string" + }, + "correlationId": { + "description": "Unique identifier for the transaction to aid in debugging.", + "type": "string" + }, + "info": { + "description": "Human readable helpful detailed text context for debugging (ex: “The following mechanisms are supported...”).", + "type": "string" + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “Authentication method not supported”).", + "type": "string" + } + } + } + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “capability Id ''foo'' does not exist”).", + "type": "string" + } + } + }, + "lastTransitionTime": { + "description": "A read only timestamp indicating the last time the configuration has been modified from the perspective of the current actual (Edge) state of the CRD. Edge would be the only writer of this value and would sync back up to the cloud.", + "type": "string", + "format": "date-time" + }, + "version": { + "description": "A read only incremental counter indicating the number of times the configuration has been modified from the perspective of the current actual (Edge) state of the CRD. Edge would be the only writer of this value and would sync back up to the cloud. In steady state, this should equal version.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + }, + "datasets": { + "description": "Array of dataset statuses that describe the status of each dataset.", + "type": "array", + "items": { + "title": "AssetDatasetEventStreamStatus", + "type": "object", + "required": [ "name" ], + "properties": { + "error": { + "description": "The last error that occurred while processing the dataset/event/stream.", + "title": "ConfigError", + "type": "object", + "properties": { + "code": { + "description": "Error code for classification of errors (ex: '400', '404', '500', etc.).", + "type": "string" + }, + "details": { + "description": "Array of error details that describe the status of each error.", + "type": "array", + "items": { + "title": "DetailsSchemaElementSchema", + "type": "object", + "properties": { + "code": { + "description": "Multi-part error code for classification and root causing of errors (ex: 400.200.100.432).", + "type": "string" + }, + "correlationId": { + "description": "Unique identifier for the transaction to aid in debugging.", + "type": "string" + }, + "info": { + "description": "Human readable helpful detailed text context for debugging (ex: “The following mechanisms are supported...”).", + "type": "string" + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “Authentication method not supported”).", + "type": "string" + } + } + } + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “capability Id ''foo'' does not exist”).", + "type": "string" + } + } + }, + "messageSchemaReference": { + "description": "The message schema reference object.", + "title": "MessageSchemaReference", + "type": "object", + "required": [ "schemaName", "schemaRegistryNamespace", "schemaVersion" ], + "properties": { + "schemaName": { + "description": "The reference to the message schema name.", + "type": "string" + }, + "schemaRegistryNamespace": { + "description": "The reference to the message schema registry namespace.", + "type": "string" + }, + "schemaVersion": { + "description": "The reference to the message schema version.", + "type": "string" + } + } + }, + "name": { + "description": "The name of the dataset/event/stream. Must be unique within the status.datasets[i]/events[i]/streams[i] array. This name is used to correlate between the spec and status dataset/event/stream information.", + "type": "string" + } + } + } + }, + "eventGroups": { + "description": "Array of event group statuses that describe the status of each event group.", + "type": "array", + "items": { + "title": "AssetEventGroupStatusSchemaElementSchema", + "type": "object", + "required": [ "name" ], + "properties": { + "events": { + "description": "Array of event statuses that describe the status of each event in the event group.", + "type": "array", + "items": { + "title": "AssetDatasetEventStreamStatus", + "type": "object", + "required": [ "name" ], + "properties": { + "error": { + "description": "The last error that occurred while processing the dataset/event/stream.", + "title": "ConfigError", + "type": "object", + "properties": { + "code": { + "description": "Error code for classification of errors (ex: '400', '404', '500', etc.).", + "type": "string" + }, + "details": { + "description": "Array of error details that describe the status of each error.", + "type": "array", + "items": { + "title": "DetailsSchemaElementSchema", + "type": "object", + "properties": { + "code": { + "description": "Multi-part error code for classification and root causing of errors (ex: 400.200.100.432).", + "type": "string" + }, + "correlationId": { + "description": "Unique identifier for the transaction to aid in debugging.", + "type": "string" + }, + "info": { + "description": "Human readable helpful detailed text context for debugging (ex: “The following mechanisms are supported...”).", + "type": "string" + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “Authentication method not supported”).", + "type": "string" + } + } + } + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “capability Id ''foo'' does not exist”).", + "type": "string" + } + } + }, + "messageSchemaReference": { + "description": "The message schema reference object.", + "title": "MessageSchemaReference", + "type": "object", + "required": [ "schemaName", "schemaRegistryNamespace", "schemaVersion" ], + "properties": { + "schemaName": { + "description": "The reference to the message schema name.", + "type": "string" + }, + "schemaRegistryNamespace": { + "description": "The reference to the message schema registry namespace.", + "type": "string" + }, + "schemaVersion": { + "description": "The reference to the message schema version.", + "type": "string" + } + } + }, + "name": { + "description": "The name of the dataset/event/stream. Must be unique within the status.datasets[i]/events[i]/streams[i] array. This name is used to correlate between the spec and status dataset/event/stream information.", + "type": "string" + } + } + } + }, + "name": { + "description": "The name of the event group. Must be unique within the status.eventGroups array. This name is used to correlate between the spec and status event group information.", + "type": "string" + } + } + } + }, + "managementGroups": { + "description": "Array of management group statuses that describe the status of each management group.", + "type": "array", + "items": { + "title": "AssetManagementGroupStatusSchemaElementSchema", + "type": "object", + "required": [ "name" ], + "properties": { + "actions": { + "description": "Array of action statuses that describe the status of each action.", + "type": "array", + "items": { + "title": "AssetManagementGroupActionStatusSchemaElementSchema", + "type": "object", + "required": [ "name" ], + "properties": { + "error": { + "description": "The last error that occurred while processing the action.", + "title": "ConfigError", + "type": "object", + "properties": { + "code": { + "description": "Error code for classification of errors (ex: '400', '404', '500', etc.).", + "type": "string" + }, + "details": { + "description": "Array of error details that describe the status of each error.", + "type": "array", + "items": { + "title": "DetailsSchemaElementSchema", + "type": "object", + "properties": { + "code": { + "description": "Multi-part error code for classification and root causing of errors (ex: 400.200.100.432).", + "type": "string" + }, + "correlationId": { + "description": "Unique identifier for the transaction to aid in debugging.", + "type": "string" + }, + "info": { + "description": "Human readable helpful detailed text context for debugging (ex: “The following mechanisms are supported...”).", + "type": "string" + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “Authentication method not supported”).", + "type": "string" + } + } + } + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “capability Id ''foo'' does not exist”).", + "type": "string" + } + } + }, + "name": { + "description": "The name of the action. Must be unique within the status.managementGroup[i].actions array. This name is used to correlate between the spec and status management group action information.", + "type": "string" + }, + "requestMessageSchemaReference": { + "description": "The request message schema reference object.", + "title": "MessageSchemaReference", + "type": "object", + "required": [ "schemaName", "schemaRegistryNamespace", "schemaVersion" ], + "properties": { + "schemaName": { + "description": "The reference to the message schema name.", + "type": "string" + }, + "schemaRegistryNamespace": { + "description": "The reference to the message schema registry namespace.", + "type": "string" + }, + "schemaVersion": { + "description": "The reference to the message schema version.", + "type": "string" + } + } + }, + "responseMessageSchemaReference": { + "description": "The response message schema reference object.", + "title": "MessageSchemaReference", + "type": "object", + "required": [ "schemaName", "schemaRegistryNamespace", "schemaVersion" ], + "properties": { + "schemaName": { + "description": "The reference to the message schema name.", + "type": "string" + }, + "schemaRegistryNamespace": { + "description": "The reference to the message schema registry namespace.", + "type": "string" + }, + "schemaVersion": { + "description": "The reference to the message schema version.", + "type": "string" + } + } + } + } + } + }, + "name": { + "description": "The name of the managementgroup. Must be unique within the status.managementGroup array. This name is used to correlate between the spec and status management group information.", + "type": "string" + } + } + } + }, + "streams": { + "description": "Array of stream statuses that describe the status of each stream.", + "type": "array", + "items": { + "title": "AssetDatasetEventStreamStatus", + "type": "object", + "required": [ "name" ], + "properties": { + "error": { + "description": "The last error that occurred while processing the dataset/event/stream.", + "title": "ConfigError", + "type": "object", + "properties": { + "code": { + "description": "Error code for classification of errors (ex: '400', '404', '500', etc.).", + "type": "string" + }, + "details": { + "description": "Array of error details that describe the status of each error.", + "type": "array", + "items": { + "title": "DetailsSchemaElementSchema", + "type": "object", + "properties": { + "code": { + "description": "Multi-part error code for classification and root causing of errors (ex: 400.200.100.432).", + "type": "string" + }, + "correlationId": { + "description": "Unique identifier for the transaction to aid in debugging.", + "type": "string" + }, + "info": { + "description": "Human readable helpful detailed text context for debugging (ex: “The following mechanisms are supported...”).", + "type": "string" + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “Authentication method not supported”).", + "type": "string" + } + } + } + }, + "message": { + "description": "Human readable helpful error message to provide additional context for error (ex: “capability Id ''foo'' does not exist”).", + "type": "string" + } + } + }, + "messageSchemaReference": { + "description": "The message schema reference object.", + "title": "MessageSchemaReference", + "type": "object", + "required": [ "schemaName", "schemaRegistryNamespace", "schemaVersion" ], + "properties": { + "schemaName": { + "description": "The reference to the message schema name.", + "type": "string" + }, + "schemaRegistryNamespace": { + "description": "The reference to the message schema registry namespace.", + "type": "string" + }, + "schemaVersion": { + "description": "The reference to the message schema version.", + "type": "string" + } + } + }, + "name": { + "description": "The name of the dataset/event/stream. Must be unique within the status.datasets[i]/events[i]/streams[i] array. This name is used to correlate between the spec and status dataset/event/stream information.", + "type": "string" + } + } + } + } + } + } + } + }, + "forms": [ + { + "contentType": "application/json", + "additionalResponses": [ + { + "success": false, + "schema": "AkriServiceError" + } + ], + "dtv:topic": "akri/connector/resources/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/updateAssetStatus", + "op": "invokeaction" + } + ] + }, + "setNotificationPreferenceForDeviceUpdates": { + "description": "Set the notification preference for device updates. This command allows the connector application to subscribe to per-device inbound endpoint updates.", + "input": { + "description": "The request to set the notification preference for device updates.", + "type": "object", + "required": [ "notificationPreferenceRequest" ], + "properties": { + "notificationPreferenceRequest": { + "title": "NotificationPreference", + "type": "string", + "enum": [ + "Off", + "On" + ] + } + } + }, + "output": { + "description": "Response containing the result of setting the notification preference for device updates or error details if the operation failed.", + "type": "object", + "required": [ "responsePayload" ], + "properties": { + "responsePayload": { + "description": "The response payload indicating that the operation was successful.", + "type": "string" + } + } + }, + "forms": [ + { + "contentType": "application/json", + "additionalResponses": [ + { + "success": false, + "schema": "AkriServiceError" + } + ], + "dtv:topic": "akri/connector/resources/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/setNotificationPreferenceForDeviceUpdates", + "op": "invokeaction" + } + ] + }, + "setNotificationPreferenceForAssetUpdates": { + "description": "Set the notification preference for asset updates. This command allows the connector application to subscribe to per-asset updates.", + "input": { + "description": "The request to set the notification preference for asset updates.", + "type": "object", + "required": [ "notificationPreferenceRequest" ], + "properties": { + "notificationPreferenceRequest": { + "title": "SetNotificationPreferenceForAssetUpdatesRequestSchema", + "type": "object", + "required": [ "assetName", "notificationPreference" ], + "properties": { + "assetName": { + "description": "The name of the asset to set the notification preference for.", + "type": "string" + }, + "notificationPreference": { + "description": "The notification preference to set for the asset updates.", + "title": "NotificationPreference", + "type": "string", + "enum": [ + "Off", + "On" + ] + } + } + } + } + }, + "output": { + "description": "Response containing the result of setting the notification preference for asset updates or error details if the operation failed.", + "type": "object", + "required": [ "responsePayload" ], + "properties": { + "responsePayload": { + "description": "The response payload indicating that the operation was successful.", + "type": "string" + } + } + }, + "forms": [ + { + "contentType": "application/json", + "additionalResponses": [ + { + "success": false, + "schema": "AkriServiceError" + } + ], + "dtv:topic": "akri/connector/resources/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/setNotificationPreferenceForAssetUpdates", + "op": "invokeaction" + } + ] + }, + "createOrUpdateDiscoveredAsset": { + "description": "Create or update a discovered asset resource.", + "input": { + "description": "The request to create or update a discovered asset.", + "type": "object", + "required": [ "discoveredAssetRequest" ], + "properties": { + "discoveredAssetRequest": { + "title": "CreateOrUpdateDiscoveredAssetRequestSchema", + "type": "object", + "required": [ "discoveredAssetName", "discoveredAsset" ], + "properties": { + "discoveredAssetName": { + "description": "The name of the discovered asset to create or update. This field is used to perform deduplication of discovered assets.", + "type": "string" + }, + "discoveredAsset": { + "description": "The discovered asset resource to create or update. Fields omitted in the request will be removed.", + "title": "DiscoveredAsset", + "type": "object", + "required": [ "deviceRef" ], + "properties": { + "assetTypeRefs": { + "description": "URIs or type definition IDs for the asset type.", + "type": "array", + "items": { + "type": "string" + } + }, + "attributes": { + "description": "A set of key-value pairs that contain custom attributes.", + "type": "object", + "dtv:additionalProperties": { + "type": "string" + } + }, + "datasets": { + "description": "Array of datasets that are part of the asset. Each data set spec describes the data points that make up the set.", + "type": "array", + "items": { + "title": "DiscoveredAssetDataset", + "type": "object", + "required": [ "name" ], + "properties": { + "dataPoints": { + "description": "Array of data points that are part of the dataset. Each data point can have per-data-point configuration.", + "type": "array", + "items": { + "title": "DiscoveredAssetDatasetDataPoint", + "type": "object", + "required": [ "name" ], + "properties": { + "dataPointConfiguration": { + "description": "Stringified JSON that contains connector-specific configuration for the data point.", + "type": "string" + }, + "dataSource": { + "description": "The address of the source of the data in the discovered asset (e.g. URL) so that a client can access the data source on the asset.", + "type": "string" + }, + "lastUpdatedOn": { + "description": "UTC timestamp indicating when the data point was added or modified.", + "type": "string", + "format": "date-time" + }, + "name": { + "description": "The name of the data point.", + "type": "string" + }, + "typeRef": { + "description": "URI or type definition ID.", + "type": "string" + } + } + } + }, + "dataSource": { + "description": "Name of the data source within a dataset.", + "type": "string" + }, + "datasetConfiguration": { + "description": "Stringified JSON that contains connector-specific properties that describes configuration for the specific dataset.", + "type": "string" + }, + "destinations": { + "description": "Destinations for a dataset.", + "type": "array", + "items": { + "title": "DatasetDestination", + "type": "object", + "required": [ "configuration", "target" ], + "properties": { + "configuration": { + "description": "The destination configuration.", + "title": "DestinationConfiguration", + "type": "object", + "properties": { + "key": { + "description": "The BrokerStateStore destination configuration key.", + "type": "string" + }, + "path": { + "description": "The Storage destination configuration path.", + "type": "string" + }, + "qos": { + "description": "The MQTT QoS setting.", + "title": "Qos", + "type": "string", + "enum": [ + "Qos0", + "Qos1" + ] + }, + "retain": { + "description": "When set to 'Keep', messages published to an MQTT broker will have the retain flag set.", + "title": "Retain", + "type": "string", + "enum": [ + "Keep", + "Never" + ] + }, + "topic": { + "description": "The MQTT topic.", + "type": "string" + }, + "ttl": { + "description": "The MQTT TTL setting.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + }, + "target": { + "description": "The target destination.", + "title": "DatasetTarget", + "type": "string", + "enum": [ + "BrokerStateStore", + "Mqtt", + "Storage" + ] + } + } + } + }, + "lastUpdatedOn": { + "description": "Timestamp (in UTC) indicating when the dataset was added or modified.", + "type": "string", + "format": "date-time" + }, + "name": { + "description": "Name of the dataset.", + "type": "string" + }, + "typeRef": { + "description": "URI or type definition ID.", + "type": "string" + } + } + } + }, + "defaultDatasetsConfiguration": { + "description": "Stringified JSON that contains connector-specific default configuration for all datasets. Each dataset can have its own configuration that overrides the default settings here.", + "type": "string" + }, + "defaultDatasetsDestinations": { + "description": "Default destinations for a dataset.", + "type": "array", + "items": { + "title": "DatasetDestination", + "type": "object", + "required": [ "configuration", "target" ], + "properties": { + "configuration": { + "description": "The destination configuration.", + "title": "DestinationConfiguration", + "type": "object", + "properties": { + "key": { + "description": "The BrokerStateStore destination configuration key.", + "type": "string" + }, + "path": { + "description": "The Storage destination configuration path.", + "type": "string" + }, + "qos": { + "description": "The MQTT QoS setting.", + "title": "Qos", + "type": "string", + "enum": [ + "Qos0", + "Qos1" + ] + }, + "retain": { + "description": "When set to 'Keep', messages published to an MQTT broker will have the retain flag set.", + "title": "Retain", + "type": "string", + "enum": [ + "Keep", + "Never" + ] + }, + "topic": { + "description": "The MQTT topic.", + "type": "string" + }, + "ttl": { + "description": "The MQTT TTL setting.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + }, + "target": { + "description": "The target destination.", + "title": "DatasetTarget", + "type": "string", + "enum": [ + "BrokerStateStore", + "Mqtt", + "Storage" + ] + } + } + } + }, + "defaultEventsConfiguration": { + "description": "Stringified JSON that contains connector-specific default configuration for all events. Each event can have its own configuration that overrides the default settings here.", + "type": "string" + }, + "defaultEventsDestinations": { + "description": "Default destinations for an event.", + "type": "array", + "items": { + "title": "EventStreamDestination", + "type": "object", + "required": [ "configuration", "target" ], + "properties": { + "configuration": { + "description": "The destination configuration.", + "title": "DestinationConfiguration", + "type": "object", + "properties": { + "key": { + "description": "The BrokerStateStore destination configuration key.", + "type": "string" + }, + "path": { + "description": "The Storage destination configuration path.", + "type": "string" + }, + "qos": { + "description": "The MQTT QoS setting.", + "title": "Qos", + "type": "string", + "enum": [ + "Qos0", + "Qos1" + ] + }, + "retain": { + "description": "When set to 'Keep', messages published to an MQTT broker will have the retain flag set.", + "title": "Retain", + "type": "string", + "enum": [ + "Keep", + "Never" + ] + }, + "topic": { + "description": "The MQTT topic.", + "type": "string" + }, + "ttl": { + "description": "The MQTT TTL setting.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + }, + "target": { + "description": "The target destination.", + "title": "EventStreamTarget", + "type": "string", + "enum": [ + "Mqtt", + "Storage" + ] + } + } + } + }, + "defaultManagementGroupsConfiguration": { + "description": "Stringified JSON that contains connector-specific default configuration for all management groups. Each management group can have its own configuration that overrides the default settings here.", + "type": "string" + }, + "defaultStreamsConfiguration": { + "description": "Stringified JSON that contains connector-specific default configuration for all streams. Each stream can have its own configuration that overrides the default settings here.", + "type": "string" + }, + "defaultStreamsDestinations": { + "description": "Default destinations for a stream.", + "type": "array", + "items": { + "title": "EventStreamDestination", + "type": "object", + "required": [ "configuration", "target" ], + "properties": { + "configuration": { + "description": "The destination configuration.", + "title": "DestinationConfiguration", + "type": "object", + "properties": { + "key": { + "description": "The BrokerStateStore destination configuration key.", + "type": "string" + }, + "path": { + "description": "The Storage destination configuration path.", + "type": "string" + }, + "qos": { + "description": "The MQTT QoS setting.", + "title": "Qos", + "type": "string", + "enum": [ + "Qos0", + "Qos1" + ] + }, + "retain": { + "description": "When set to 'Keep', messages published to an MQTT broker will have the retain flag set.", + "title": "Retain", + "type": "string", + "enum": [ + "Keep", + "Never" + ] + }, + "topic": { + "description": "The MQTT topic.", + "type": "string" + }, + "ttl": { + "description": "The MQTT TTL setting.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + }, + "target": { + "description": "The target destination.", + "title": "EventStreamTarget", + "type": "string", + "enum": [ + "Mqtt", + "Storage" + ] + } + } + } + }, + "description": { + "description": "Human-readable description of the asset.", + "type": "string" + }, + "deviceRef": { + "description": "Reference to the device that provides data for this asset. Must provide device name & endpoint on the device to use.", + "title": "AssetDeviceRef", + "type": "object", + "required": [ "deviceName", "endpointName" ], + "properties": { + "deviceName": { + "description": "Name of the device resource.", + "type": "string" + }, + "endpointName": { + "description": "The name of endpoint to use.", + "type": "string" + } + } + }, + "displayName": { + "description": "Human-readable display name.", + "type": "string" + }, + "documentationUri": { + "description": "Asset documentation reference.", + "type": "string" + }, + "eventGroups": { + "description": "Array of events that are part of the asset. Each event can have per-event configuration.", + "type": "array", + "items": { + "title": "DiscoveredAssetEventGroup", + "type": "object", + "required": [ "name" ], + "properties": { + "dataSource": { + "description": "The address of the notifier of the event in the asset (e.g. URL) so that a client can access the event on the asset.", + "type": "string" + }, + "defaultEventsDestinations": { + "description": "Default destinations for an event.", + "type": "array", + "items": { + "title": "EventStreamDestination", + "type": "object", + "required": [ "configuration", "target" ], + "properties": { + "configuration": { + "description": "The destination configuration.", + "title": "DestinationConfiguration", + "type": "object", + "properties": { + "key": { + "description": "The BrokerStateStore destination configuration key.", + "type": "string" + }, + "path": { + "description": "The Storage destination configuration path.", + "type": "string" + }, + "qos": { + "description": "The MQTT QoS setting.", + "title": "Qos", + "type": "string", + "enum": [ + "Qos0", + "Qos1" + ] + }, + "retain": { + "description": "When set to 'Keep', messages published to an MQTT broker will have the retain flag set.", + "title": "Retain", + "type": "string", + "enum": [ + "Keep", + "Never" + ] + }, + "topic": { + "description": "The MQTT topic.", + "type": "string" + }, + "ttl": { + "description": "The MQTT TTL setting.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + }, + "target": { + "description": "The target destination.", + "title": "EventStreamTarget", + "type": "string", + "enum": [ + "Mqtt", + "Storage" + ] + } + } + } + }, + "eventGroupConfiguration": { + "description": "Stringified JSON that contains connector-specific configuration for the event. For OPC UA, this could include configuration like, publishingInterval, samplingInterval, and queueSize.", + "type": "string" + }, + "events": { + "description": "Array of events that are part of the asset. Each event can have per-event configuration.", + "type": "array", + "items": { + "title": "DiscoveredAssetEvent", + "type": "object", + "required": [ "name" ], + "properties": { + "dataSource": { + "description": "Reference to a data source for a given event.", + "type": "string" + }, + "destinations": { + "description": "Destinations for an event.", + "type": "array", + "items": { + "title": "EventStreamDestination", + "type": "object", + "required": [ "configuration", "target" ], + "properties": { + "configuration": { + "description": "The destination configuration.", + "title": "DestinationConfiguration", + "type": "object", + "properties": { + "key": { + "description": "The BrokerStateStore destination configuration key.", + "type": "string" + }, + "path": { + "description": "The Storage destination configuration path.", + "type": "string" + }, + "qos": { + "description": "The MQTT QoS setting.", + "title": "Qos", + "type": "string", + "enum": [ + "Qos0", + "Qos1" + ] + }, + "retain": { + "description": "When set to 'Keep', messages published to an MQTT broker will have the retain flag set.", + "title": "Retain", + "type": "string", + "enum": [ + "Keep", + "Never" + ] + }, + "topic": { + "description": "The MQTT topic.", + "type": "string" + }, + "ttl": { + "description": "The MQTT TTL setting.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + }, + "target": { + "description": "The target destination.", + "title": "EventStreamTarget", + "type": "string", + "enum": [ + "Mqtt", + "Storage" + ] + } + } + } + }, + "eventConfiguration": { + "description": "Stringified JSON that contains connector-specific configuration for the specific event.", + "type": "string" + }, + "lastUpdatedOn": { + "description": "UTC timestamp indicating when the event was added or modified.", + "type": "string", + "format": "date-time" + }, + "name": { + "description": "The name of the event.", + "type": "string" + }, + "typeRef": { + "description": "URI or type definition ID.", + "type": "string" + } + } + } + }, + "name": { + "description": "Name of the event group.", + "type": "string" + }, + "typeRef": { + "description": "URI or type definition ID.", + "type": "string" + } + } + } + }, + "externalAssetId": { + "description": "Asset ID provided by the customer.", + "type": "string" + }, + "hardwareRevision": { + "description": "Asset hardware revision number.", + "type": "string" + }, + "managementGroups": { + "description": "Array of management groups that are part of the asset. Each management group can have a per-group configuration.", + "type": "array", + "items": { + "title": "DiscoveredAssetManagementGroup", + "type": "object", + "required": [ "name" ], + "properties": { + "actions": { + "description": "Array of actions that are part of the management group. Each action can have an individual configuration.", + "type": "array", + "items": { + "title": "DiscoveredAssetManagementGroupAction", + "type": "object", + "required": [ "actionType", "name", "targetUri" ], + "properties": { + "actionConfiguration": { + "description": "Configuration for the action.", + "type": "string" + }, + "actionType": { + "description": "Type of the action.", + "title": "AssetManagementGroupActionType", + "type": "string", + "enum": [ + "Call", + "Read", + "Write" + ] + }, + "lastUpdatedOn": { + "description": "Timestamp (in UTC) indicating when the management action was added or modified.", + "type": "string", + "format": "date-time" + }, + "name": { + "description": "Name of the action.", + "type": "string" + }, + "targetUri": { + "description": "The target URI on which a client can invoke the specific action.", + "type": "string" + }, + "timeoutInSeconds": { + "description": "Response timeout for the action.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + }, + "topic": { + "description": "The MQTT topic path on which a client will receive the request for the action.", + "type": "string" + }, + "typeRef": { + "description": "URI or type definition ID.", + "type": "string" + } + } + } + }, + "dataSource": { + "description": "Reference to a data source for a given management group.", + "type": "string" + }, + "defaultTimeoutInSeconds": { + "description": "Default response timeout for all actions that are part of the management group.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + }, + "defaultTopic": { + "description": "Default MQTT topic path on which a client will receive the request for all actions that are part of the management group.", + "type": "string" + }, + "lastUpdatedOn": { + "description": "Timestamp (in UTC) indicating when the management group was added or modified.", + "type": "string", + "format": "date-time" + }, + "managementGroupConfiguration": { + "description": "Stringified JSON that contains connector-specific configuration for the management group.", + "type": "string" + }, + "name": { + "description": "Name of the management group.", + "type": "string" + }, + "typeRef": { + "description": "URI or type definition ID.", + "type": "string" + } + } + } + }, + "manufacturer": { + "description": "Asset manufacturer.", + "type": "string" + }, + "manufacturerUri": { + "description": "Asset manufacturer URI.", + "type": "string" + }, + "model": { + "description": "Asset model.", + "type": "string" + }, + "productCode": { + "description": "Asset product code.", + "type": "string" + }, + "serialNumber": { + "description": "Asset serial number.", + "type": "string" + }, + "softwareRevision": { + "description": "Asset software revision number.", + "type": "string" + }, + "streams": { + "description": "Array of streams that are part of the asset. Each stream can have per-stream configuration.", + "type": "array", + "items": { + "title": "DiscoveredAssetStream", + "type": "object", + "required": [ "name" ], + "properties": { + "destinations": { + "description": "Destinations for a stream.", + "type": "array", + "items": { + "title": "EventStreamDestination", + "type": "object", + "required": [ "configuration", "target" ], + "properties": { + "configuration": { + "description": "The destination configuration.", + "title": "DestinationConfiguration", + "type": "object", + "properties": { + "key": { + "description": "The BrokerStateStore destination configuration key.", + "type": "string" + }, + "path": { + "description": "The Storage destination configuration path.", + "type": "string" + }, + "qos": { + "description": "The MQTT QoS setting.", + "title": "Qos", + "type": "string", + "enum": [ + "Qos0", + "Qos1" + ] + }, + "retain": { + "description": "When set to 'Keep', messages published to an MQTT broker will have the retain flag set.", + "title": "Retain", + "type": "string", + "enum": [ + "Keep", + "Never" + ] + }, + "topic": { + "description": "The MQTT topic.", + "type": "string" + }, + "ttl": { + "description": "The MQTT TTL setting.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + }, + "target": { + "description": "The target destination.", + "title": "EventStreamTarget", + "type": "string", + "enum": [ + "Mqtt", + "Storage" + ] + } + } + } + }, + "lastUpdatedOn": { + "description": "Timestamp (in UTC) indicating when the stream was added or modified.", + "type": "string", + "format": "date-time" + }, + "name": { + "description": "Name of the stream definition.", + "type": "string" + }, + "streamConfiguration": { + "description": "Stringified JSON that contains connector-specific configuration that describes configuration for the specific stream.", + "type": "string" + }, + "typeRef": { + "description": "URI or type definition ID.", + "type": "string" + } + } + } + } + } + } + } + } + } + }, + "output": { + "description": "Response containing the discovered asset response or error details if the operation failed.", + "type": "object", + "required": [ "discoveredAssetResponse" ], + "properties": { + "discoveredAssetResponse": { + "description": "The discovered asset response.", + "title": "DiscoveredAssetResponseSchema", + "type": "object", + "required": [ "discoveryId", "version" ], + "properties": { + "discoveryId": { + "description": "The unique identifier for the discovered asset.", + "type": "string" + }, + "version": { + "description": "The version of the discovered asset resource.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + } + } + }, + "forms": [ + { + "contentType": "application/json", + "additionalResponses": [ + { + "success": false, + "schema": "AkriServiceError" + } + ], + "dtv:topic": "akri/connector/resources/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/createOrUpdateDiscoveredAsset", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + "deviceUpdateEvent": { + "description": "Telemetry event emitted when a device is updated, containing the relevant inbound endpoint details as specified in the topic.", + "data": { + "title": "DeviceUpdateEventSchema", + "type": "object", + "required": [ "deviceName", "device" ], + "properties": { + "deviceName": { + "description": "The name of the device that was updated.", + "type": "string" + }, + "device": { + "description": "The updated device resource, containing the specific inbound endpoint details as specified in the topic.", + "title": "Device", + "type": "object", + "properties": { + "attributes": { + "description": "A set of key-value pairs that contain custom attributes set by the customer.", + "type": "object", + "dtv:additionalProperties": { + "type": "string" + } + }, + "discoveredDeviceRef": { + "description": "Reference to a device. Populated only if the device had been created from discovery flow. Discovered device name must be provided.", + "type": "string" + }, + "enabled": { + "description": "Indicates if the resource and identity are enabled or not. A disabled device cannot authenticate with Microsoft Entra ID.", + "type": "boolean" + }, + "endpoints": { + "description": "Connection endpoint url a device can use to connect to a service.", + "title": "DeviceEndpointsSchema", + "type": "object", + "properties": { + "inbound": { + "type": "object", + "dtv:additionalProperties": { + "title": "InboundSchemaMapValueSchema", + "type": "object", + "required": [ "address", "endpointType" ], + "properties": { + "additionalConfiguration": { + "description": "Stringified JSON that contains connectivity type specific further configuration (e.g. OPC UA, ONVIF).", + "type": "string" + }, + "address": { + "description": "The endpoint address & port. This can be either an IP address (e.g., 192.168.1.1) or a fully qualified domain name (FQDN, e.g., server.example.com).", + "type": "string" + }, + "authentication": { + "description": "Defines the client authentication mechanism to the server.", + "title": "AuthenticationSchema", + "type": "object", + "required": [ "method" ], + "properties": { + "method": { + "description": "Defines the method to authenticate the user of the client at the server.", + "title": "MethodSchema", + "type": "string", + "enum": [ + "Anonymous", + "Certificate", + "UsernamePassword" + ] + }, + "usernamePasswordCredentials": { + "description": "The credentials for authentication mode UsernamePassword.", + "title": "UsernamePasswordCredentialsSchema", + "type": "object", + "required": [ "usernameSecretName", "passwordSecretName" ], + "properties": { + "usernameSecretName": { + "description": "The name of the secret containing the username.", + "type": "string" + }, + "passwordSecretName": { + "description": "The name of the secret containing the password.", + "type": "string" + } + } + }, + "x509Credentials": { + "description": "The x509 certificate for authentication mode Certificate.", + "title": "X509CredentialsSchema", + "type": "object", + "required": [ "certificateSecretName" ], + "properties": { + "certificateSecretName": { + "description": "The name of the secret containing the certificate and private key (e.g. stored as .der/.pem or .der/.pfx).", + "type": "string" + }, + "intermediateCertificatesSecretName": { + "description": "A reference to the secret containing the combined intermediate certificates in PEM format.", + "type": "string" + }, + "keySecretName": { + "description": "A reference to the secret containing the certificate private key in PEM or DER format.", + "type": "string" + } + } + } + } + }, + "endpointType": { + "description": "Type of connection endpoint.", + "type": "string" + }, + "trustSettings": { + "description": "Defines server trust settings for the endpoint.", + "title": "TrustSettingsSchema", + "type": "object", + "properties": { + "trustList": { + "description": "Secret reference to certificates list to trust.", + "type": "string" + } + } + }, + "version": { + "description": "Version associated with device endpoint.", + "type": "string" + } + } + } + }, + "outbound": { + "description": "Set of endpoints for device to connect to.", + "title": "OutboundSchema", + "type": "object", + "required": [ "assigned" ], + "properties": { + "assigned": { + "description": "Device messaging endpoint model.", + "type": "object", + "dtv:additionalProperties": { + "title": "DeviceOutboundEndpoint", + "type": "object", + "required": [ "address" ], + "properties": { + "address": { + "description": "The endpoint address to connect to.", + "type": "string" + }, + "endpointType": { + "description": "Type of connection used for the messaging endpoint.", + "type": "string" + } + } + } + }, + "unassigned": { + "description": "Device messaging endpoint model.", + "type": "object", + "dtv:additionalProperties": { + "title": "DeviceOutboundEndpoint", + "type": "object", + "required": [ "address" ], + "properties": { + "address": { + "description": "The endpoint address to connect to.", + "type": "string" + }, + "endpointType": { + "description": "Type of connection used for the messaging endpoint.", + "type": "string" + } + } + } + } + } + } + } + }, + "externalDeviceId": { + "description": "The Device ID provided by the customer.", + "type": "string" + }, + "lastTransitionTime": { + "description": "A timestamp (in UTC) that is updated each time the resource is modified.", + "type": "string", + "format": "date-time" + }, + "manufacturer": { + "description": "Device manufacturer.", + "type": "string" + }, + "model": { + "description": "Device model.", + "type": "string" + }, + "operatingSystem": { + "description": "Device operating system.", + "type": "string" + }, + "operatingSystemVersion": { + "description": "Device operating system version.", + "type": "string" + }, + "uuid": { + "description": "Gets a unique identifier for this resource.", + "type": "string" + }, + "version": { + "description": "An integer that is incremented each time the resource is modified.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + } + } + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "akri/connector/resources/telemetry/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/deviceUpdateEvent", + "op": "subscribeevent" + } + ] + }, + "assetUpdateEvent": { + "description": "Telemetry event emitted when an asset is updated.", + "data": { + "title": "AssetUpdateEventSchema", + "type": "object", + "required": [ "assetName", "asset" ], + "properties": { + "assetName": { + "description": "The name of the asset that was updated.", + "type": "string" + }, + "asset": { + "description": "The updated asset resource.", + "title": "Asset", + "type": "object", + "required": [ "deviceRef" ], + "properties": { + "assetTypeRefs": { + "description": "URIs or type definition IDs.", + "type": "array", + "items": { + "type": "string" + } + }, + "attributes": { + "description": "A set of key-value pairs that contain custom attributes set by the customer.", + "type": "object", + "dtv:additionalProperties": { + "type": "string" + } + }, + "datasets": { + "description": "Array of data sets that are part of the asset. Each data set describes the data points that make up the set.", + "type": "array", + "items": { + "title": "AssetDatasetSchemaElementSchema", + "type": "object", + "required": [ "name" ], + "properties": { + "dataPoints": { + "type": "array", + "items": { + "title": "AssetDatasetDataPointSchemaElementSchema", + "type": "object", + "required": [ "name" ], + "properties": { + "dataPointConfiguration": { + "description": "Stringified JSON that contains connector-specific configuration for the data point.", + "type": "string" + }, + "dataSource": { + "description": "The address of the source of the data in the asset (e.g. URL) so that a client can access the data source on the asset.", + "type": "string" + }, + "name": { + "description": "The name of the data point.", + "type": "string" + }, + "typeRef": { + "description": "URI or type definition ID.", + "type": "string" + } + } + } + }, + "dataSource": { + "description": "Reference to a data source for a given dataset.", + "type": "string" + }, + "datasetConfiguration": { + "description": "Stringified JSON that contains connector-specific JSON string that describes configuration for the specific dataset.", + "type": "string" + }, + "destinations": { + "description": "Destinations for a dataset.", + "type": "array", + "items": { + "title": "DatasetDestination", + "type": "object", + "required": [ "configuration", "target" ], + "properties": { + "configuration": { + "description": "The destination configuration.", + "title": "DestinationConfiguration", + "type": "object", + "properties": { + "key": { + "description": "The BrokerStateStore destination configuration key.", + "type": "string" + }, + "path": { + "description": "The Storage destination configuration path.", + "type": "string" + }, + "qos": { + "description": "The MQTT QoS setting.", + "title": "Qos", + "type": "string", + "enum": [ + "Qos0", + "Qos1" + ] + }, + "retain": { + "description": "When set to 'Keep', messages published to an MQTT broker will have the retain flag set.", + "title": "Retain", + "type": "string", + "enum": [ + "Keep", + "Never" + ] + }, + "topic": { + "description": "The MQTT topic.", + "type": "string" + }, + "ttl": { + "description": "The MQTT TTL setting.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + }, + "target": { + "description": "The target destination.", + "title": "DatasetTarget", + "type": "string", + "enum": [ + "BrokerStateStore", + "Mqtt", + "Storage" + ] + } + } + } + }, + "name": { + "description": "Name of the dataset.", + "type": "string" + }, + "typeRef": { + "description": "URI or type definition ID.", + "type": "string" + } + } + } + }, + "defaultDatasetsConfiguration": { + "description": "Stringified JSON that contains connector-specific default configuration for all datasets. Each dataset can have its own configuration that overrides the default settings here.", + "type": "string" + }, + "defaultDatasetsDestinations": { + "description": "Default destinations for a dataset.", + "type": "array", + "items": { + "title": "DatasetDestination", + "type": "object", + "required": [ "configuration", "target" ], + "properties": { + "configuration": { + "description": "The destination configuration.", + "title": "DestinationConfiguration", + "type": "object", + "properties": { + "key": { + "description": "The BrokerStateStore destination configuration key.", + "type": "string" + }, + "path": { + "description": "The Storage destination configuration path.", + "type": "string" + }, + "qos": { + "description": "The MQTT QoS setting.", + "title": "Qos", + "type": "string", + "enum": [ + "Qos0", + "Qos1" + ] + }, + "retain": { + "description": "When set to 'Keep', messages published to an MQTT broker will have the retain flag set.", + "title": "Retain", + "type": "string", + "enum": [ + "Keep", + "Never" + ] + }, + "topic": { + "description": "The MQTT topic.", + "type": "string" + }, + "ttl": { + "description": "The MQTT TTL setting.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + }, + "target": { + "description": "The target destination.", + "title": "DatasetTarget", + "type": "string", + "enum": [ + "BrokerStateStore", + "Mqtt", + "Storage" + ] + } + } + } + }, + "defaultEventsConfiguration": { + "description": "Stringified JSON that contains connector-specific default configuration for all events. Each event can have its own configuration that overrides the default settings here.", + "type": "string" + }, + "defaultEventsDestinations": { + "description": "Default destinations for an event.", + "type": "array", + "items": { + "title": "EventStreamDestination", + "type": "object", + "required": [ "configuration", "target" ], + "properties": { + "configuration": { + "description": "The destination configuration.", + "title": "DestinationConfiguration", + "type": "object", + "properties": { + "key": { + "description": "The BrokerStateStore destination configuration key.", + "type": "string" + }, + "path": { + "description": "The Storage destination configuration path.", + "type": "string" + }, + "qos": { + "description": "The MQTT QoS setting.", + "title": "Qos", + "type": "string", + "enum": [ + "Qos0", + "Qos1" + ] + }, + "retain": { + "description": "When set to 'Keep', messages published to an MQTT broker will have the retain flag set.", + "title": "Retain", + "type": "string", + "enum": [ + "Keep", + "Never" + ] + }, + "topic": { + "description": "The MQTT topic.", + "type": "string" + }, + "ttl": { + "description": "The MQTT TTL setting.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + }, + "target": { + "description": "The target destination.", + "title": "EventStreamTarget", + "type": "string", + "enum": [ + "Mqtt", + "Storage" + ] + } + } + } + }, + "defaultManagementGroupsConfiguration": { + "description": "Stringified JSON that contains connector-specific default configuration for all management groups. Each management group can have its own configuration that overrides the default settings here.", + "type": "string" + }, + "defaultStreamsConfiguration": { + "description": "Stringified JSON that contains connector-specific default configuration for all streams. Each stream can have its own configuration that overrides the default settings here.", + "type": "string" + }, + "defaultStreamsDestinations": { + "description": "Default destinations for a stream.", + "type": "array", + "items": { + "title": "EventStreamDestination", + "type": "object", + "required": [ "configuration", "target" ], + "properties": { + "configuration": { + "description": "The destination configuration.", + "title": "DestinationConfiguration", + "type": "object", + "properties": { + "key": { + "description": "The BrokerStateStore destination configuration key.", + "type": "string" + }, + "path": { + "description": "The Storage destination configuration path.", + "type": "string" + }, + "qos": { + "description": "The MQTT QoS setting.", + "title": "Qos", + "type": "string", + "enum": [ + "Qos0", + "Qos1" + ] + }, + "retain": { + "description": "When set to 'Keep', messages published to an MQTT broker will have the retain flag set.", + "title": "Retain", + "type": "string", + "enum": [ + "Keep", + "Never" + ] + }, + "topic": { + "description": "The MQTT topic.", + "type": "string" + }, + "ttl": { + "description": "The MQTT TTL setting.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + }, + "target": { + "description": "The target destination.", + "title": "EventStreamTarget", + "type": "string", + "enum": [ + "Mqtt", + "Storage" + ] + } + } + } + }, + "description": { + "description": "Human-readable description of the asset.", + "type": "string" + }, + "deviceRef": { + "description": "Reference to the device that provides data for this asset. Must provide device name & endpoint on the device to use.", + "title": "AssetDeviceRef", + "type": "object", + "required": [ "deviceName", "endpointName" ], + "properties": { + "deviceName": { + "description": "Name of the device resource.", + "type": "string" + }, + "endpointName": { + "description": "The name of endpoint to use.", + "type": "string" + } + } + }, + "discoveredAssetRefs": { + "description": "Reference to a list of discovered assets. Populated only if the asset has been created from discovery flow. Discovered asset names must be provided.", + "type": "array", + "items": { + "type": "string" + } + }, + "displayName": { + "description": "Human-readable display name.", + "type": "string" + }, + "documentationUri": { + "description": "Asset documentation reference.", + "type": "string" + }, + "enabled": { + "description": "Enabled/Disabled status of the asset.", + "type": "boolean" + }, + "eventGroups": { + "description": "Array of events that are part of the asset. Each event can have per-event configuration.", + "type": "array", + "items": { + "title": "AssetEventGroupSchemaElementSchema", + "type": "object", + "required": [ "name" ], + "properties": { + "dataSource": { + "description": "The address of the notifier of the event in the asset (e.g. URL) so that a client can access the event on the asset.", + "type": "string" + }, + "defaultEventsDestinations": { + "description": "Default destinations for an event.", + "type": "array", + "items": { + "title": "EventStreamDestination", + "type": "object", + "required": [ "configuration", "target" ], + "properties": { + "configuration": { + "description": "The destination configuration.", + "title": "DestinationConfiguration", + "type": "object", + "properties": { + "key": { + "description": "The BrokerStateStore destination configuration key.", + "type": "string" + }, + "path": { + "description": "The Storage destination configuration path.", + "type": "string" + }, + "qos": { + "description": "The MQTT QoS setting.", + "title": "Qos", + "type": "string", + "enum": [ + "Qos0", + "Qos1" + ] + }, + "retain": { + "description": "When set to 'Keep', messages published to an MQTT broker will have the retain flag set.", + "title": "Retain", + "type": "string", + "enum": [ + "Keep", + "Never" + ] + }, + "topic": { + "description": "The MQTT topic.", + "type": "string" + }, + "ttl": { + "description": "The MQTT TTL setting.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + }, + "target": { + "description": "The target destination.", + "title": "EventStreamTarget", + "type": "string", + "enum": [ + "Mqtt", + "Storage" + ] + } + } + } + }, + "eventGroupConfiguration": { + "description": "Stringified JSON that contains connector-specific configuration for the event. For OPC UA, this could include configuration like, publishingInterval, samplingInterval, and queueSize.", + "type": "string" + }, + "events": { + "description": "Array of events that are part of the asset. Each event can have per-event configuration.", + "type": "array", + "items": { + "title": "AssetEventSchemaElementSchema", + "type": "object", + "required": [ "name" ], + "properties": { + "dataSource": { + "description": "Reference to a data source for a given event.", + "type": "string" + }, + "destinations": { + "description": "Destinations for an event.", + "type": "array", + "items": { + "title": "EventStreamDestination", + "type": "object", + "required": [ "configuration", "target" ], + "properties": { + "configuration": { + "description": "The destination configuration.", + "title": "DestinationConfiguration", + "type": "object", + "properties": { + "key": { + "description": "The BrokerStateStore destination configuration key.", + "type": "string" + }, + "path": { + "description": "The Storage destination configuration path.", + "type": "string" + }, + "qos": { + "description": "The MQTT QoS setting.", + "title": "Qos", + "type": "string", + "enum": [ + "Qos0", + "Qos1" + ] + }, + "retain": { + "description": "When set to 'Keep', messages published to an MQTT broker will have the retain flag set.", + "title": "Retain", + "type": "string", + "enum": [ + "Keep", + "Never" + ] + }, + "topic": { + "description": "The MQTT topic.", + "type": "string" + }, + "ttl": { + "description": "The MQTT TTL setting.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + }, + "target": { + "description": "The target destination.", + "title": "EventStreamTarget", + "type": "string", + "enum": [ + "Mqtt", + "Storage" + ] + } + } + } + }, + "eventConfiguration": { + "description": "Stringified JSON that contains connector-specific configuration for the specific event.", + "type": "string" + }, + "name": { + "description": "The name of the event.", + "type": "string" + }, + "typeRef": { + "description": "URI or type definition ID.", + "type": "string" + } + } + } + }, + "name": { + "description": "Name of the event group.", + "type": "string" + }, + "typeRef": { + "description": "URI or type definition ID.", + "type": "string" + } + } + } + }, + "externalAssetId": { + "description": "Asset ID provided by the customer.", + "type": "string" + }, + "hardwareRevision": { + "description": "Asset hardware revision number.", + "type": "string" + }, + "lastTransitionTime": { + "description": "A timestamp (in UTC) that is updated each time the resource is modified.", + "type": "string", + "format": "date-time" + }, + "managementGroups": { + "description": "Array of management groups that are part of the asset.", + "type": "array", + "items": { + "title": "AssetManagementGroupSchemaElementSchema", + "type": "object", + "required": [ "name" ], + "properties": { + "actions": { + "description": "Array of actions that are part of the management group. Each action can have an individual configuration.", + "type": "array", + "items": { + "title": "AssetManagementGroupActionSchemaElementSchema", + "type": "object", + "required": [ "actionType", "name", "targetUri" ], + "properties": { + "actionConfiguration": { + "description": "Configuration for the action.", + "type": "string" + }, + "actionType": { + "description": "Type of the action.", + "title": "AssetManagementGroupActionType", + "type": "string", + "enum": [ + "Call", + "Read", + "Write" + ] + }, + "name": { + "description": "Name of the action.", + "type": "string" + }, + "targetUri": { + "description": "The target URI on which a client can invoke the specific action.", + "type": "string" + }, + "timeoutInSeconds": { + "description": "Response timeout for the action.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + }, + "topic": { + "description": "The MQTT topic path on which a client will receive the request for the action.", + "type": "string" + }, + "typeRef": { + "description": "URI or type definition ID.", + "type": "string" + } + } + } + }, + "dataSource": { + "description": "Reference to a data source for a given management group.", + "type": "string" + }, + "defaultTimeoutInSeconds": { + "description": "Default response timeout for all actions that are part of the management group.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + }, + "defaultTopic": { + "description": "Default MQTT topic path on which a client will receive the request for all actions that are part of the management group.", + "type": "string" + }, + "managementGroupConfiguration": { + "description": "Stringified JSON that contains connector-specific configuration for the management group.", + "type": "string" + }, + "name": { + "description": "Name of the management group.", + "type": "string" + }, + "typeRef": { + "description": "URI or type definition ID.", + "type": "string" + } + } + } + }, + "manufacturer": { + "description": "Asset manufacturer.", + "type": "string" + }, + "manufacturerUri": { + "description": "Asset manufacturer URI.", + "type": "string" + }, + "model": { + "description": "Asset model.", + "type": "string" + }, + "productCode": { + "description": "Asset product code.", + "type": "string" + }, + "serialNumber": { + "description": "Asset serial number.", + "type": "string" + }, + "softwareRevision": { + "description": "Asset software revision number.", + "type": "string" + }, + "streams": { + "description": "Array of streams that are part of the asset. Each stream can have per-stream configuration.", + "type": "array", + "items": { + "title": "AssetStreamSchemaElementSchema", + "type": "object", + "required": [ "name" ], + "properties": { + "destinations": { + "description": "Destinations for a Stream.", + "type": "array", + "items": { + "title": "EventStreamDestination", + "type": "object", + "required": [ "configuration", "target" ], + "properties": { + "configuration": { + "description": "The destination configuration.", + "title": "DestinationConfiguration", + "type": "object", + "properties": { + "key": { + "description": "The BrokerStateStore destination configuration key.", + "type": "string" + }, + "path": { + "description": "The Storage destination configuration path.", + "type": "string" + }, + "qos": { + "description": "The MQTT QoS setting.", + "title": "Qos", + "type": "string", + "enum": [ + "Qos0", + "Qos1" + ] + }, + "retain": { + "description": "When set to 'Keep', messages published to an MQTT broker will have the retain flag set.", + "title": "Retain", + "type": "string", + "enum": [ + "Keep", + "Never" + ] + }, + "topic": { + "description": "The MQTT topic.", + "type": "string" + }, + "ttl": { + "description": "The MQTT TTL setting.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + }, + "target": { + "description": "The target destination.", + "title": "EventStreamTarget", + "type": "string", + "enum": [ + "Mqtt", + "Storage" + ] + } + } + } + }, + "name": { + "description": "Name of the stream definition.", + "type": "string" + }, + "streamConfiguration": { + "description": "Stringified JSON that contains connector-specific JSON string that describes configuration for the specific stream.", + "type": "string" + }, + "typeRef": { + "description": "URI or type definition ID.", + "type": "string" + } + } + } + }, + "uuid": { + "description": "Globally unique, immutable, non-reusable id.", + "type": "string" + }, + "version": { + "description": "A read-only integer that is incremented each time the resource is modified the cloud.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + } + } + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "akri/connector/resources/telemetry/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/assetUpdateEvent", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/eng/dtdl/DeviceDiscoveryService.TM.json b/eng/dtdl/DeviceDiscoveryService.TM.json new file mode 100644 index 0000000000..ecc549639b --- /dev/null +++ b/eng/dtdl/DeviceDiscoveryService.TM.json @@ -0,0 +1,218 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "DeviceDiscoveryService", + "links": [ + { + "rel": "dtv:naming", + "href": "SchemaNames.json", + "type": "application/json" + } + ], + "schemaDefinitions": { + "AkriServiceError": { + "title": "AkriServiceError", + "type": "object", + "required": [ "code", "message", "timestamp" ], + "dtv:errorMessage": "message", + "properties": { + "code": { + "description": "The error code that identifies the error.", + "title": "CodeSchema", + "type": "string", + "enum": [ + "BadRequest", + "InternalError", + "KubeError", + "SerializationError", + "Unauthorized" + ] + }, + "message": { + "description": "A human-readable description of the error.", + "type": "string" + }, + "timestamp": { + "description": "The timestamp (in UTC) when the error occurred.", + "type": "string", + "format": "date-time" + } + } + } + }, + "actions": { + "createOrUpdateDiscoveredDevice": { + "description": "Create or update a discovered device resource.", + "input": { + "description": "The request to create or update a discovered device.", + "type": "object", + "required": [ "discoveredDeviceRequest" ], + "properties": { + "discoveredDeviceRequest": { + "title": "CreateOrUpdateDiscoveredDeviceRequestSchema", + "type": "object", + "required": [ "discoveredDeviceName", "discoveredDevice" ], + "properties": { + "discoveredDeviceName": { + "description": "The name of the discovered device to create or update. This field is used to perform deduplication of discovered devices.", + "type": "string" + }, + "discoveredDevice": { + "description": "The discovered device resource to create or update. Fields omitted in the request will be removed. The specified inbound endpoint will be added or updated in the inbound endpoints map.", + "title": "DiscoveredDevice", + "type": "object", + "properties": { + "attributes": { + "description": "A set of key-value pairs that contain custom attributes set by the customer.", + "type": "object", + "dtv:additionalProperties": { + "type": "string" + } + }, + "endpoints": { + "description": "Connection endpoint URL a device can use to connect to a service.", + "title": "DiscoveredDeviceEndpoints", + "type": "object", + "properties": { + "inbound": { + "description": "Set of endpoints to connect to the device.", + "type": "object", + "dtv:additionalProperties": { + "title": "DiscoveredDeviceInboundEndpointSchema", + "type": "object", + "required": [ "address", "endpointType" ], + "properties": { + "additionalConfiguration": { + "description": "Stringified JSON that contains connectivity type specific further configuration (e.g. OPC UA, Modbus, ONVIF).", + "type": "string" + }, + "address": { + "description": "The endpoint address & port. This can be either an IP address (e.g., 192.168.1.1) or a fully qualified domain name (FQDN, e.g., server.example.com).", + "type": "string" + }, + "endpointType": { + "description": "Type of connection endpoint.", + "type": "string" + }, + "lastUpdatedOn": { + "description": "The timestamp (in UTC) when the endpoint was discovered.", + "type": "string", + "format": "date-time" + }, + "supportedAuthenticationMethods": { + "description": "List of supported authentication methods supported by device for Inbound connections.", + "type": "array", + "items": { + "type": "string" + } + }, + "version": { + "description": "Version associated with the device endpoint.", + "type": "string" + } + } + } + }, + "outbound": { + "description": "Property bag contains the device's outbound endpoints", + "title": "DiscoveredDeviceOutboundEndpointsSchema", + "type": "object", + "required": [ "assigned" ], + "properties": { + "assigned": { + "description": "Endpoints the device can connect to.", + "type": "object", + "dtv:additionalProperties": { + "title": "DeviceOutboundEndpoint", + "type": "object", + "required": [ "address" ], + "properties": { + "address": { + "description": "The endpoint address to connect to.", + "type": "string" + }, + "endpointType": { + "description": "Type of connection used for the messaging endpoint.", + "type": "string" + } + } + } + } + } + } + } + }, + "externalDeviceId": { + "description": "The unique identifier of the device.", + "type": "string" + }, + "manufacturer": { + "description": "Device manufacturer.", + "type": "string" + }, + "model": { + "description": "Device model.", + "type": "string" + }, + "operatingSystem": { + "description": "Device operating system name.", + "type": "string" + }, + "operatingSystemVersion": { + "description": "Device operating system version.", + "type": "string" + } + } + } + } + } + } + }, + "output": { + "description": "Response containing the discovered device response or error details if the operation failed.", + "type": "object", + "required": [ "discoveredDeviceResponse" ], + "properties": { + "discoveredDeviceResponse": { + "description": "The discovered device response.", + "title": "DiscoveredDeviceResponseSchema", + "type": "object", + "required": [ "discoveryId", "version" ], + "properties": { + "discoveryId": { + "description": "The unique identifier for the discovered device.", + "type": "string" + }, + "version": { + "description": "The version of the discovered device resource.", + "type": "integer", + "minimum": 0, + "maximum": 18446744073709551615 + } + } + } + } + }, + "forms": [ + { + "contentType": "application/json", + "additionalResponses": [ + { + "success": false, + "schema": "AkriServiceError" + } + ], + "dtv:topic": "akri/discovery/resources/{ex:discoveryClientId}/{ex:inboundEndpointType}/createOrUpdateDiscoveredDevice", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/eng/dtdl/SchemaNames.json b/eng/dtdl/SchemaNames.json new file mode 100644 index 0000000000..19c8363589 --- /dev/null +++ b/eng/dtdl/SchemaNames.json @@ -0,0 +1,52 @@ +{ + "aggregateEventName": "Telemetry", + "aggregateEventSchema": "TelemetryCollection", + "aggregatePropName": "Property", + "aggregateReadRespValueField": "Properties", + "aggregateRespErrorField": "Errors", + "eventSchema": { + "in": [ "eventName" ], + "out": "{eventName}Telemetry", + "capitalize": true + }, + "eventValueSchema": { + "in": [ "eventName" ], + "out": "{eventName}Schema", + "capitalize": true + }, + "eventSenderBinder": { + "in": [ "eventSchema" ], + "out": "{eventSchema}Sender", + "capitalize": true + }, + "eventReceiverBinder": { + "in": [ "eventSchema" ], + "out": "{eventSchema}Receiver", + "capitalize": true + }, + "actionInSchema": { + "in": [ "actionName" ], + "out": "{actionName}RequestPayload", + "capitalize": true + }, + "actionOutSchema": { + "in": [ "actionName" ], + "out": "{actionName}ResponsePayload", + "capitalize": true + }, + "actionExecutorBinder": { + "in": [ "actionName" ], + "out": "{actionName}CommandExecutor", + "capitalize": true + }, + "actionInvokerBinder": { + "in": [ "actionName" ], + "out": "{actionName}CommandInvoker", + "capitalize": true + }, + "actionRespErrorField": { + "in": [ "actionName", "errorSchemaName" ], + "out": "{actionName}Error", + "capitalize": false + } +} diff --git a/eng/dtdl/SchemaRegistry.TM.json b/eng/dtdl/SchemaRegistry.TM.json new file mode 100644 index 0000000000..b323fea47c --- /dev/null +++ b/eng/dtdl/SchemaRegistry.TM.json @@ -0,0 +1,408 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "SchemaRegistry", + "links": [ + { + "rel": "dtv:naming", + "href": "SchemaNames.json", + "type": "application/json" + } + ], + "schemaDefinitions": { + "SchemaRegistryError": { + "description": "Error object for schema operations", + "title": "SchemaRegistryError", + "type": "object", + "required": [ "code", "message" ], + "dtv:errorMessage": "message", + "properties": { + "code": { + "description": "Error code for classification of errors (ex: '400', '404', '500', etc.).", + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + }, + "message": { + "description": "Human-readable error message.", + "type": "string" + }, + "target": { + "description": "Target of the error, if applicable (e.g., 'schemaType').", + "type": "string" + }, + "details": { + "description": "Additional details about the error, if available.", + "title": "SchemaRegistryErrorDetails", + "type": "object", + "properties": { + "code": { + "description": "Multi-part error code for classification and root causing of errors (e.g., '400.200').", + "type": "string" + }, + "message": { + "description": "Human-readable helpful error message to provide additional context for the error", + "type": "string" + }, + "correlationId": { + "description": "Correlation ID for tracing the error across systems.", + "type": "string" + } + } + }, + "innerError": { + "description": "Inner error object for nested errors, if applicable.", + "title": "SchemaRegistryErrorDetails", + "type": "object", + "properties": { + "code": { + "description": "Multi-part error code for classification and root causing of errors (e.g., '400.200').", + "type": "string" + }, + "message": { + "description": "Human-readable helpful error message to provide additional context for the error", + "type": "string" + }, + "correlationId": { + "description": "Correlation ID for tracing the error across systems.", + "type": "string" + } + } + } + } + }, + "Format": { + "type": "object", + "const": { + "JsonSchemaDraft07": "JsonSchema/draft-07", + "Delta1": "Delta/1.0" + }, + "description": "Supported schema formats", + "properties": { + "JsonSchemaDraft07": { + "description": "JSON Schema Draft-07 format", + "type": "string" + }, + "Delta1": { + "description": "Delta-Parquet format", + "type": "string" + } + } + }, + "SchemaRegistryErrorCode": { + "type": "object", + "const": { + "BadRequest": 400, + "NotFound": 404, + "InternalError": 500 + }, + "properties": { + "BadRequest": { + "description": "The request is invalid or malformed.", + "type": "integer" + }, + "NotFound": { + "description": "The target resource was not found.", + "type": "integer" + }, + "InternalError": { + "description": "An internal server error occurred.", + "type": "integer" + } + } + }, + "SchemaRegistryErrorTarget": { + "type": "object", + "const": { + "schemaTypeProperty": "SchemaType", + "formatProperty": "Format", + "versionProperty": "Version", + "nameProperty": "Name", + "tagsProperty": "Tags", + "descriptionProperty": "Description", + "displayNameProperty": "DisplayName", + "schemaContentProperty": "SchemaContent", + "schemaArmResource": "SchemaArmResource", + "schemaVersionArmResource": "SchemaVersionArmResource", + "SchemaRegistryArmResource": "SchemaRegistryResource" + }, + "properties": { + "schemaTypeProperty": { + "description": "Indicates the error is related to the schema type.", + "type": "string" + }, + "formatProperty": { + "description": "Indicates the error is related to the schema format.", + "type": "string" + }, + "versionProperty": { + "description": "Indicates the error is related to the schema version.", + "type": "string" + }, + "nameProperty": { + "description": "Indicates the error is related to the schema name.", + "type": "string" + }, + "tagsProperty": { + "description": "Indicates the error is related to schema tags.", + "type": "string" + }, + "descriptionProperty": { + "description": "Indicates the error is related to the schema description.", + "type": "string" + }, + "displayNameProperty": { + "description": "Indicates the error is related to the schema display name.", + "type": "string" + }, + "schemaContentProperty": { + "description": "Indicates the error is related to the schema content.", + "type": "string" + }, + "schemaArmResource": { + "description": "Indicates the error is related to the schema ARM resource.", + "type": "string" + }, + "schemaVersionArmResource": { + "description": "Indicates the error is related to the schema version ARM resource.", + "type": "string" + }, + "SchemaRegistryArmResource": { + "description": "Indicates the error is related to the schema registry ARM resource.", + "type": "string" + } + } + } + }, + "actions": { + "put": { + "description": "PUT Schema Command", + "input": { + "description": "PUT Schema request object", + "title": "PutRequestSchema", + "type": "object", + "required": [ "format", "schemaType", "schemaContent", "version" ], + "properties": { + "format": { + "description": "Format of the schema.", + "type": "string" + }, + "schemaType": { + "description": "Type of the schema.", + "title": "SchemaType", + "type": "string", + "enum": [ + "MessageSchema" + ] + }, + "schemaContent": { + "description": "Content stored in the schema.", + "type": "string" + }, + "version": { + "description": "Version of the schema. Allowed between 0-9.", + "type": "string" + }, + "description": { + "description": "Human-readable description of the schema.", + "type": "string" + }, + "displayName": { + "description": "Human-readable display name.", + "type": "string" + }, + "tags": { + "description": "Schema tags.", + "type": "object", + "dtv:additionalProperties": { + "description": "User-defined schema tags", + "type": "string" + } + } + } + }, + "output": { + "description": "PUT Schema response object", + "type": "object", + "required": [ "schema" ], + "properties": { + "schema": { + "description": "Schema object that was created.", + "title": "Schema", + "type": "object", + "required": [ "name", "format", "schemaType", "version", "schemaContent", "namespace" ], + "properties": { + "name": { + "description": "Schema name.", + "type": "string" + }, + "format": { + "description": "Format of the schema.", + "type": "string" + }, + "schemaType": { + "description": "Type of the schema.", + "title": "SchemaType", + "type": "string", + "enum": [ + "MessageSchema" + ] + }, + "version": { + "description": "Version of the schema. Allowed between 0-9.", + "type": "string" + }, + "schemaContent": { + "description": "Content stored in the schema.", + "type": "string" + }, + "description": { + "description": "Human-readable description of the schema.", + "type": "string" + }, + "displayName": { + "description": "Human-readable display name.", + "type": "string" + }, + "tags": { + "description": "Schema tags.", + "type": "object", + "dtv:additionalProperties": { + "description": "User-defined schema tags", + "type": "string" + } + }, + "hash": { + "description": "Hash of the schema content.", + "type": "string" + }, + "namespace": { + "description": "Schema registry namespace. Uniquely identifies a schema registry within a tenant.", + "type": "string" + } + } + } + } + }, + "forms": [ + { + "contentType": "application/json", + "additionalResponses": [ + { + "success": false, + "schema": "SchemaRegistryError" + } + ], + "dtv:serviceGroupId": "schema-registry-edge", + "dtv:topic": "adr/dtmi:ms:adr:SchemaRegistry;2/put", + "op": "invokeaction" + } + ] + }, + "get": { + "description": "GET Schema Command", + "input": { + "description": "GET Schema request object", + "title": "GetRequestSchema", + "type": "object", + "required": [ "name", "version" ], + "properties": { + "name": { + "description": "Schema name.", + "type": "string" + }, + "version": { + "description": "Version of the schema. Allowed between 0-9.", + "type": "string" + } + } + }, + "output": { + "description": "GET Schema response object", + "type": "object", + "required": [ "schema" ], + "properties": { + "schema": { + "description": "The requested schema object.", + "title": "Schema", + "type": "object", + "required": [ "name", "format", "schemaType", "version", "schemaContent", "namespace" ], + "properties": { + "name": { + "description": "Schema name.", + "type": "string" + }, + "format": { + "description": "Format of the schema.", + "type": "string" + }, + "schemaType": { + "description": "Type of the schema.", + "title": "SchemaType", + "type": "string", + "enum": [ + "MessageSchema" + ] + }, + "version": { + "description": "Version of the schema. Allowed between 0-9.", + "type": "string" + }, + "schemaContent": { + "description": "Content stored in the schema.", + "type": "string" + }, + "description": { + "description": "Human-readable description of the schema.", + "type": "string" + }, + "displayName": { + "description": "Human-readable display name.", + "type": "string" + }, + "tags": { + "description": "Schema tags.", + "type": "object", + "dtv:additionalProperties": { + "description": "User-defined schema tags", + "type": "string" + } + }, + "hash": { + "description": "Hash of the schema content.", + "type": "string" + }, + "namespace": { + "description": "Schema registry namespace. Uniquely identifies a schema registry within a tenant.", + "type": "string" + } + } + } + } + }, + "idempotent": true, + "safe": true, + "forms": [ + { + "contentType": "application/json", + "additionalResponses": [ + { + "success": false, + "schema": "SchemaRegistryError" + } + ], + "dtv:serviceGroupId": "schema-registry-edge", + "dtv:topic": "adr/dtmi:ms:adr:SchemaRegistry;2/get", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/eng/dtdl/StateStore.TM.json b/eng/dtdl/StateStore.TM.json new file mode 100644 index 0000000000..7f32b61b3b --- /dev/null +++ b/eng/dtdl/StateStore.TM.json @@ -0,0 +1,36 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "StateStore", + "links": [ + { + "rel": "dtv:naming", + "href": "SchemaNames.json", + "type": "application/json" + } + ], + "actions": { + "invoke": { + "input": { + "type": "null" + }, + "output": { + "type": "null" + }, + "forms": [ + { + "contentType": "application/octet-stream", + "dtv:topic": "statestore/v1/FA9AE35F-2F64-47CD-9BFF-08E2B32A0FE8/command/invoke", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + } +} diff --git a/rust/azure_iot_operations_services/gen.sh b/rust/azure_iot_operations_services/gen.sh index 53a1e235e2..24cbc7152a 100755 --- a/rust/azure_iot_operations_services/gen.sh +++ b/rust/azure_iot_operations_services/gen.sh @@ -1,17 +1,17 @@ #!/bin/sh rm -r ./src/schema_registry/schemaregistry_gen -../../codegen/src/Azure.Iot.Operations.ProtocolCompiler/bin/Debug/net9.0/Azure.Iot.Operations.ProtocolCompiler \ - --clientOnly --modelFile ../../eng/dtdl/SchemaRegistry-1.json --sdkPath ../ --lang=rust --noProj \ - --outDir src/schema_registry/schemaregistry_gen +../../codegen2/src/Azure.Iot.Operations.ProtocolCompiler/bin/Debug/net9.0/Azure.Iot.Operations.ProtocolCompiler \ + --thingFiles ../../eng/dtdl/SchemaRegistry.TM.json --outDir src/schema_registry/schemaregistry_gen --lang rust \ + --namespace SchemaRegistry --workingDir target/akri/SchemaRegistry --sdkPath ../ --noProj --clientOnly rm -r ./src/azure_device_registry/adr_base_gen -../../codegen/src/Azure.Iot.Operations.ProtocolCompiler/bin/Debug/net9.0/Azure.Iot.Operations.ProtocolCompiler \ - --clientOnly --modelFile ../../eng/dtdl/adr-base-service.json --sdkPath ../ --lang=rust --noProj \ - --outDir src/azure_device_registry/adr_base_gen +../../codegen2/src/Azure.Iot.Operations.ProtocolCompiler/bin/Debug/net9.0/Azure.Iot.Operations.ProtocolCompiler \ + --thingFiles ../../eng/dtdl/AdrBaseService.TM.json --outDir src/azure_device_registry/adr_base_gen --lang rust \ + --namespace AdrBaseService --workingDir target/akri/AdrBaseService --sdkPath ../ --noProj rm -r ./src/azure_device_registry/device_discovery_gen -../../codegen/src/Azure.Iot.Operations.ProtocolCompiler/bin/Debug/net9.0/Azure.Iot.Operations.ProtocolCompiler \ - --clientOnly --modelFile ../../eng/dtdl/device-discovery-service.json --sdkPath ../ --lang=rust --noProj \ - --outDir src/azure_device_registry/device_discovery_gen +../../codegen2/src/Azure.Iot.Operations.ProtocolCompiler/bin/Debug/net9.0/Azure.Iot.Operations.ProtocolCompiler \ + --thingFiles ../../eng/dtdl/DeviceDiscoveryService.TM.json --outDir src/azure_device_registry/device_discovery_gen --lang rust \ + --namespace DeviceDiscoveryService --workingDir target/akri/DeviceDiscoveryService --sdkPath ../ --noProj --clientOnly cargo fmt diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service.rs index f53df22f86..217162aa84 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service.rs @@ -21,11 +21,13 @@ mod asset_stream_schema_element_schema; mod asset_update_event_schema; mod asset_update_event_telemetry; mod asset_update_event_telemetry_receiver; +mod asset_update_event_telemetry_sender; mod asset_update_event_telemetry_serialization; mod authentication_schema; mod code_schema; mod config_error; mod config_status; +mod create_or_update_discovered_asset_command_executor; mod create_or_update_discovered_asset_command_invoker; mod create_or_update_discovered_asset_request_payload; mod create_or_update_discovered_asset_request_payload_serialization; @@ -47,6 +49,7 @@ mod device_status_inbound_endpoint_schema_map_value_schema; mod device_update_event_schema; mod device_update_event_telemetry; mod device_update_event_telemetry_receiver; +mod device_update_event_telemetry_sender; mod device_update_event_telemetry_serialization; mod discovered_asset; mod discovered_asset_dataset; @@ -59,6 +62,7 @@ mod discovered_asset_response_schema; mod discovered_asset_stream; mod event_stream_destination; mod event_stream_target; +mod get_asset_command_executor; mod get_asset_command_invoker; mod get_asset_request_payload; mod get_asset_request_payload_serialization; @@ -66,6 +70,7 @@ mod get_asset_response_payload; mod get_asset_response_payload_serialization; mod get_asset_response_schema; mod get_asset_response_schema_serialization; +mod get_asset_status_command_executor; mod get_asset_status_command_invoker; mod get_asset_status_request_payload; mod get_asset_status_request_payload_serialization; @@ -73,11 +78,13 @@ mod get_asset_status_response_payload; mod get_asset_status_response_payload_serialization; mod get_asset_status_response_schema; mod get_asset_status_response_schema_serialization; +mod get_device_command_executor; mod get_device_command_invoker; mod get_device_response_payload; mod get_device_response_payload_serialization; mod get_device_response_schema; mod get_device_response_schema_serialization; +mod get_device_status_command_executor; mod get_device_status_command_invoker; mod get_device_status_response_payload; mod get_device_status_response_payload_serialization; @@ -90,6 +97,7 @@ mod notification_preference; mod outbound_schema; mod qos; mod retain; +mod set_notification_preference_for_asset_updates_command_executor; mod set_notification_preference_for_asset_updates_command_invoker; mod set_notification_preference_for_asset_updates_request_payload; mod set_notification_preference_for_asset_updates_request_payload_serialization; @@ -98,6 +106,7 @@ mod set_notification_preference_for_asset_updates_response_payload; mod set_notification_preference_for_asset_updates_response_payload_serialization; mod set_notification_preference_for_asset_updates_response_schema; mod set_notification_preference_for_asset_updates_response_schema_serialization; +mod set_notification_preference_for_device_updates_command_executor; mod set_notification_preference_for_device_updates_command_invoker; mod set_notification_preference_for_device_updates_request_payload; mod set_notification_preference_for_device_updates_request_payload_serialization; @@ -106,6 +115,7 @@ mod set_notification_preference_for_device_updates_response_payload_serializatio mod set_notification_preference_for_device_updates_response_schema; mod set_notification_preference_for_device_updates_response_schema_serialization; mod trust_settings_schema; +mod update_asset_status_command_executor; mod update_asset_status_command_invoker; mod update_asset_status_request_payload; mod update_asset_status_request_payload_serialization; @@ -114,6 +124,7 @@ mod update_asset_status_response_payload; mod update_asset_status_response_payload_serialization; mod update_asset_status_response_schema; mod update_asset_status_response_schema_serialization; +mod update_device_status_command_executor; mod update_device_status_command_invoker; mod update_device_status_request_payload; mod update_device_status_request_payload_serialization; @@ -126,12 +137,9 @@ mod x509credentials_schema; pub use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; +pub use super::common_types::options::{CommandExecutorOptions, TelemetrySenderOptions}; pub use super::common_types::options::{CommandInvokerOptions, TelemetryReceiverOptions}; -pub const MODEL_ID: &str = "dtmi:com:microsoft:akri:AdrBaseService;1"; -pub const REQUEST_TOPIC_PATTERN: &str = "akri/connector/resources/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/{commandName}"; -pub const TELEMETRY_TOPIC_PATTERN: &str = "akri/connector/resources/telemetry/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/{telemetryName}"; - pub mod client { pub use super::akri_service_error::*; pub use super::akri_service_error_error::*; @@ -229,3 +237,101 @@ pub mod client { pub use super::username_password_credentials_schema::*; pub use super::x509credentials_schema::*; } + +pub mod service { + pub use super::akri_service_error::*; + pub use super::akri_service_error_error::*; + pub use super::asset::*; + pub use super::asset_dataset_data_point_schema_element_schema::*; + pub use super::asset_dataset_event_stream_status::*; + pub use super::asset_dataset_schema_element_schema::*; + pub use super::asset_device_ref::*; + pub use super::asset_event_group_schema_element_schema::*; + pub use super::asset_event_group_status_schema_element_schema::*; + pub use super::asset_event_schema_element_schema::*; + pub use super::asset_management_group_action_schema_element_schema::*; + pub use super::asset_management_group_action_status_schema_element_schema::*; + pub use super::asset_management_group_action_type::*; + pub use super::asset_management_group_schema_element_schema::*; + pub use super::asset_management_group_status_schema_element_schema::*; + pub use super::asset_status::*; + pub use super::asset_stream_schema_element_schema::*; + pub use super::asset_update_event_schema::*; + pub use super::asset_update_event_telemetry::*; + pub use super::asset_update_event_telemetry_sender::*; + pub use super::authentication_schema::*; + pub use super::code_schema::*; + pub use super::config_error::*; + pub use super::config_status::*; + pub use super::create_or_update_discovered_asset_command_executor::*; + pub use super::create_or_update_discovered_asset_request_payload::*; + pub use super::create_or_update_discovered_asset_request_schema::*; + pub use super::create_or_update_discovered_asset_response_payload::*; + pub use super::create_or_update_discovered_asset_response_schema::*; + pub use super::dataset_destination::*; + pub use super::dataset_target::*; + pub use super::destination_configuration::*; + pub use super::details_schema_element_schema::*; + pub use super::device::*; + pub use super::device_endpoints_schema::*; + pub use super::device_outbound_endpoint::*; + pub use super::device_status::*; + pub use super::device_status_endpoint_schema::*; + pub use super::device_status_inbound_endpoint_schema_map_value_schema::*; + pub use super::device_update_event_schema::*; + pub use super::device_update_event_telemetry::*; + pub use super::device_update_event_telemetry_sender::*; + pub use super::discovered_asset::*; + pub use super::discovered_asset_dataset::*; + pub use super::discovered_asset_dataset_data_point::*; + pub use super::discovered_asset_event::*; + pub use super::discovered_asset_event_group::*; + pub use super::discovered_asset_management_group::*; + pub use super::discovered_asset_management_group_action::*; + pub use super::discovered_asset_response_schema::*; + pub use super::discovered_asset_stream::*; + pub use super::event_stream_destination::*; + pub use super::event_stream_target::*; + pub use super::get_asset_command_executor::*; + pub use super::get_asset_request_payload::*; + pub use super::get_asset_response_payload::*; + pub use super::get_asset_response_schema::*; + pub use super::get_asset_status_command_executor::*; + pub use super::get_asset_status_request_payload::*; + pub use super::get_asset_status_response_payload::*; + pub use super::get_asset_status_response_schema::*; + pub use super::get_device_command_executor::*; + pub use super::get_device_response_payload::*; + pub use super::get_device_response_schema::*; + pub use super::get_device_status_command_executor::*; + pub use super::get_device_status_response_payload::*; + pub use super::get_device_status_response_schema::*; + pub use super::inbound_schema_map_value_schema::*; + pub use super::message_schema_reference::*; + pub use super::method_schema::*; + pub use super::notification_preference::*; + pub use super::outbound_schema::*; + pub use super::qos::*; + pub use super::retain::*; + pub use super::set_notification_preference_for_asset_updates_command_executor::*; + pub use super::set_notification_preference_for_asset_updates_request_payload::*; + pub use super::set_notification_preference_for_asset_updates_request_schema::*; + pub use super::set_notification_preference_for_asset_updates_response_payload::*; + pub use super::set_notification_preference_for_asset_updates_response_schema::*; + pub use super::set_notification_preference_for_device_updates_command_executor::*; + pub use super::set_notification_preference_for_device_updates_request_payload::*; + pub use super::set_notification_preference_for_device_updates_response_payload::*; + pub use super::set_notification_preference_for_device_updates_response_schema::*; + pub use super::trust_settings_schema::*; + pub use super::update_asset_status_command_executor::*; + pub use super::update_asset_status_request_payload::*; + pub use super::update_asset_status_request_schema::*; + pub use super::update_asset_status_response_payload::*; + pub use super::update_asset_status_response_schema::*; + pub use super::update_device_status_command_executor::*; + pub use super::update_device_status_request_payload::*; + pub use super::update_device_status_response_payload::*; + pub use super::update_device_status_response_schema::*; + pub use super::username_password_credentials_schema::*; + pub use super::x509credentials_schema::*; +} diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/asset.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/asset.rs index 2b6fa2f9a8..e0ad57317f 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/asset.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/asset.rs @@ -18,6 +18,7 @@ use super::asset_stream_schema_element_schema::AssetStreamSchemaElementSchema; use super::dataset_destination::DatasetDestination; use super::event_stream_destination::EventStreamDestination; +/// The asset resource #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct Asset { /// URIs or type definition IDs. diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/asset_device_ref.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/asset_device_ref.rs index 36893bb3ea..d63c35b644 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/asset_device_ref.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/asset_device_ref.rs @@ -11,7 +11,7 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; -/// A reference to the Device and Endpoint within the device (connection information) used by brokers to connect that provides data points for this asset. +/// Reference to the device that provides data for this asset. Must provide device name & endpoint on the device to use. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct AssetDeviceRef { /// Name of the device resource. diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/asset_management_group_action_type.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/asset_management_group_action_type.rs index ee09b12a0d..1b39df5812 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/asset_management_group_action_type.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/asset_management_group_action_type.rs @@ -2,12 +2,10 @@ use serde::{Deserialize, Serialize}; +/// Type of the action. #[derive(Serialize, Deserialize, Debug, Clone)] pub enum AssetManagementGroupActionType { - #[serde(rename = "Call")] Call, - #[serde(rename = "Read")] Read, - #[serde(rename = "Write")] Write, } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/asset_status.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/asset_status.rs index 19a60fe19b..4fe4947abb 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/asset_status.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/asset_status.rs @@ -15,6 +15,7 @@ use super::asset_event_group_status_schema_element_schema::AssetEventGroupStatus use super::asset_management_group_status_schema_element_schema::AssetManagementGroupStatusSchemaElementSchema; use super::config_status::ConfigStatus; +/// The asset status #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct AssetStatus { /// The configuration status of the asset. diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/asset_update_event_telemetry.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/asset_update_event_telemetry.rs index 0665bb372c..1019670d6a 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/asset_update_event_telemetry.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/asset_update_event_telemetry.rs @@ -12,6 +12,7 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; use super::asset_update_event_schema::AssetUpdateEventSchema; +/// Telemetry event emitted when an asset is updated. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct AssetUpdateEventTelemetry { /// Telemetry event emitted when an asset is updated. diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/asset_update_event_telemetry_receiver.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/asset_update_event_telemetry_receiver.rs index 225848af3e..e3c6cccfbf 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/asset_update_event_telemetry_receiver.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/asset_update_event_telemetry_receiver.rs @@ -8,8 +8,6 @@ use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; use azure_iot_operations_protocol::telemetry; use super::super::common_types::options::TelemetryReceiverOptions; -use super::MODEL_ID; -use super::TELEMETRY_TOPIC_PATTERN; use super::asset_update_event_telemetry::AssetUpdateEventTelemetry; pub type AssetUpdateEventTelemetryMessage = telemetry::receiver::Message; @@ -32,18 +30,15 @@ impl AssetUpdateEventTelemetryReceiver { receiver_options_builder.topic_namespace(topic_namespace.clone()); } - let mut topic_token_map: HashMap = options + let topic_token_map: HashMap = options .topic_token_map .clone() .into_iter() .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("modelId".to_string(), MODEL_ID.to_string()); - topic_token_map.insert("telemetryName".to_string(), "assetUpdateEvent".to_string()); - let receiver_options = receiver_options_builder - .topic_pattern(TELEMETRY_TOPIC_PATTERN) + .topic_pattern("akri/connector/resources/telemetry/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/assetUpdateEvent") .topic_token_map(topic_token_map) .auto_ack(options.auto_ack) .build() diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/asset_update_event_telemetry_sender.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/asset_update_event_telemetry_sender.rs new file mode 100644 index 0000000000..11a414a1df --- /dev/null +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/asset_update_event_telemetry_sender.rs @@ -0,0 +1,136 @@ +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v0.10.0.0; DO NOT EDIT. */ + +use std::collections::HashMap; +use std::time::Duration; + +use azure_iot_operations_mqtt::control_packet::QoS; +use azure_iot_operations_mqtt::session::SessionManagedClient; +use azure_iot_operations_protocol::application::ApplicationContext; +use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; +use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; +use azure_iot_operations_protocol::telemetry; + +use super::super::common_types::options::TelemetrySenderOptions; +use super::asset_update_event_telemetry::AssetUpdateEventTelemetry; + +pub type AssetUpdateEventTelemetryMessage = telemetry::sender::Message; +pub type AssetUpdateEventTelemetryMessageBuilderError = telemetry::sender::MessageBuilderError; + +/// Builder for [`AssetUpdateEventTelemetryMessage`] +#[derive(Default)] +pub struct AssetUpdateEventTelemetryMessageBuilder { + inner_builder: telemetry::sender::MessageBuilder, + topic_tokens: HashMap, +} + +impl AssetUpdateEventTelemetryMessageBuilder { + /// Quality of Service of the telemetry message. Can only be `AtMostOnce` or `AtLeastOnce`. + pub fn qos(&mut self, qos: QoS) -> &mut Self { + self.inner_builder.qos(qos); + self + } + + /// Custom user data to set on the message + pub fn custom_user_data(&mut self, custom_user_data: Vec<(String, String)>) -> &mut Self { + self.inner_builder.custom_user_data(custom_user_data); + self + } + + /// Topic token keys/values to be replaced into the publish topic of the telemetry message. + /// A prefix of "ex:" will be prepended to each key before scanning the topic pattern. + /// Thus, only tokens of the form `{ex:SOMEKEY}` will be replaced. + pub fn topic_tokens(&mut self, topic_tokens: HashMap) -> &mut Self { + for (k, v) in topic_tokens { + self.topic_tokens.insert(format!("ex:{k}"), v); + } + self + } + + /// Time before message expires + pub fn message_expiry(&mut self, message_expiry: Duration) -> &mut Self { + self.inner_builder.message_expiry(message_expiry); + self + } + + /// Cloud event for the message + pub fn cloud_event(&mut self, cloud_event: Option) -> &mut Self { + self.inner_builder.cloud_event(cloud_event); + self + } + + /// Payload of the message + /// + /// # Errors + /// If the payload cannot be serialized + pub fn payload( + &mut self, + payload: AssetUpdateEventTelemetry, + ) -> Result<&mut Self, AIOProtocolError> { + self.inner_builder.payload(payload)?; + Ok(self) + } + + /// Builds a new `AssetUpdateEventTelemetryMessage` + /// + /// # Errors + /// If a required field has not been initialized + pub fn build( + &mut self, + ) -> Result + { + self.inner_builder.topic_tokens(self.topic_tokens.clone()); + + self.inner_builder.build() + } +} + +/// Telemetry Sender for `AssetUpdateEventTelemetry` +pub struct AssetUpdateEventTelemetrySender(telemetry::Sender); + +impl AssetUpdateEventTelemetrySender { + /// Creates a new [`AssetUpdateEventTelemetrySender`] + /// + /// # Panics + /// If the DTDL that generated this code was invalid + pub fn new( + application_context: ApplicationContext, + client: SessionManagedClient, + options: &TelemetrySenderOptions, + ) -> Self { + let mut sender_options_builder = telemetry::sender::OptionsBuilder::default(); + if let Some(topic_namespace) = &options.topic_namespace { + sender_options_builder.topic_namespace(topic_namespace.clone()); + } + + let mut topic_token_map: HashMap = options + .topic_token_map + .clone() + .into_iter() + .map(|(k, v)| (format!("ex:{k}"), v)) + .collect(); + + topic_token_map.insert("senderId".to_string(), client.client_id().to_string()); + + let sender_options = sender_options_builder + .topic_pattern("akri/connector/resources/telemetry/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/assetUpdateEvent") + .topic_token_map(topic_token_map) + .build() + .expect("DTDL schema generated invalid arguments"); + + Self( + telemetry::Sender::new(application_context, client, sender_options) + .expect("DTDL schema generated invalid arguments"), + ) + } + + /// Sends a [`AssetUpdateEventTelemetryMessage`] + /// + /// # Error + /// [`AIOProtocolError`] if there is a failure sending the message + pub async fn send( + &self, + message: AssetUpdateEventTelemetryMessage, + ) -> Result<(), AIOProtocolError> { + self.0.send(message).await + } +} diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/authentication_schema.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/authentication_schema.rs index cd3ba91e04..c158222279 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/authentication_schema.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/authentication_schema.rs @@ -14,6 +14,7 @@ use super::method_schema::MethodSchema; use super::username_password_credentials_schema::UsernamePasswordCredentialsSchema; use super::x509credentials_schema::X509credentialsSchema; +/// Defines the client authentication mechanism to the server. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct AuthenticationSchema { /// Defines the method to authenticate the user of the client at the server. diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/code_schema.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/code_schema.rs index 36143884f6..26ce660204 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/code_schema.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/code_schema.rs @@ -2,16 +2,12 @@ use serde::{Deserialize, Serialize}; +/// The error code that identifies the error. #[derive(Serialize, Deserialize, Debug, Clone)] pub enum CodeSchema { - #[serde(rename = "BadRequest")] BadRequest, - #[serde(rename = "InternalError")] InternalError, - #[serde(rename = "KubeError")] KubeError, - #[serde(rename = "SerializationError")] SerializationError, - #[serde(rename = "Unauthorized")] Unauthorized, } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/config_error.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/config_error.rs index d0fdf4beb8..23055eedab 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/config_error.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/config_error.rs @@ -12,6 +12,7 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; use super::details_schema_element_schema::DetailsSchemaElementSchema; +/// The last error that occurred while processing the configuration. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct ConfigError { /// Error code for classification of errors (ex: '400', '404', '500', etc.). diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/config_status.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/config_status.rs index 3e587be930..35bcdc3a39 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/config_status.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/config_status.rs @@ -12,6 +12,7 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; use super::config_error::ConfigError; +/// The configuration status of the device. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct ConfigStatus { /// The last error that occurred while processing the configuration. diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/create_or_update_discovered_asset_command_executor.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/create_or_update_discovered_asset_command_executor.rs new file mode 100644 index 0000000000..7666ffc875 --- /dev/null +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/create_or_update_discovered_asset_command_executor.rs @@ -0,0 +1,153 @@ +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v0.10.0.0; DO NOT EDIT. */ + +use std::collections::HashMap; + +use azure_iot_operations_mqtt::session::SessionManagedClient; +use azure_iot_operations_protocol::application::ApplicationContext; +use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; +use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; +use azure_iot_operations_protocol::rpc_command; + +use super::super::common_types::options::CommandExecutorOptions; +use super::akri_service_error::AkriServiceError; +use super::create_or_update_discovered_asset_request_payload::CreateOrUpdateDiscoveredAssetRequestPayload; +use super::create_or_update_discovered_asset_response_payload::CreateOrUpdateDiscoveredAssetResponsePayload; +use super::create_or_update_discovered_asset_response_schema::CreateOrUpdateDiscoveredAssetResponseSchema; + +pub type CreateOrUpdateDiscoveredAssetRequest = rpc_command::executor::Request< + CreateOrUpdateDiscoveredAssetRequestPayload, + CreateOrUpdateDiscoveredAssetResponseSchema, +>; +pub type CreateOrUpdateDiscoveredAssetResponse = + rpc_command::executor::Response; +pub type CreateOrUpdateDiscoveredAssetResponseBuilderError = + rpc_command::executor::ResponseBuilderError; + +/// Builder for [`CreateOrUpdateDiscoveredAssetResponse`] +#[derive(Default)] +pub struct CreateOrUpdateDiscoveredAssetResponseBuilder { + inner_builder: + rpc_command::executor::ResponseBuilder, +} + +impl CreateOrUpdateDiscoveredAssetResponseBuilder { + /// Custom user data to set on the response + pub fn custom_user_data(&mut self, custom_user_data: Vec<(String, String)>) -> &mut Self { + self.inner_builder.custom_user_data(custom_user_data); + self + } + + /// Cloud event for the response + pub fn cloud_event( + &mut self, + cloud_event: Option, + ) -> &mut Self { + self.inner_builder.cloud_event(cloud_event); + self + } + + /// Payload of the response + /// + /// # Errors + /// If the payload cannot be serialized + pub fn payload( + &mut self, + payload: CreateOrUpdateDiscoveredAssetResponsePayload, + ) -> Result<&mut Self, AIOProtocolError> { + self.inner_builder + .payload(CreateOrUpdateDiscoveredAssetResponseSchema { + discovered_asset_response: Some(payload.discovered_asset_response), + create_or_update_discovered_asset_error: None, + })?; + Ok(self) + } + + pub fn error(&mut self, error: AkriServiceError) -> Result<&mut Self, AIOProtocolError> { + self.inner_builder + .payload(CreateOrUpdateDiscoveredAssetResponseSchema { + discovered_asset_response: None, + create_or_update_discovered_asset_error: Some(error), + })?; + Ok(self) + } + + /// Builds a new `CreateOrUpdateDiscoveredAssetResponse` + /// + /// # Errors + /// If a required field has not been initialized + #[allow(clippy::missing_panics_doc)] // The panic is not possible + pub fn build( + &mut self, + ) -> Result< + CreateOrUpdateDiscoveredAssetResponse, + CreateOrUpdateDiscoveredAssetResponseBuilderError, + > { + self.inner_builder.build() + } +} + +/// Command Executor for `createOrUpdateDiscoveredAsset` +pub struct CreateOrUpdateDiscoveredAssetCommandExecutor( + rpc_command::Executor< + CreateOrUpdateDiscoveredAssetRequestPayload, + CreateOrUpdateDiscoveredAssetResponseSchema, + >, +); + +impl CreateOrUpdateDiscoveredAssetCommandExecutor { + /// Creates a new [`CreateOrUpdateDiscoveredAssetCommandExecutor`] + /// + /// # Panics + /// If the DTDL that generated this code was invalid + pub fn new( + application_context: ApplicationContext, + client: SessionManagedClient, + options: &CommandExecutorOptions, + ) -> Self { + let mut executor_options_builder = rpc_command::executor::OptionsBuilder::default(); + if let Some(topic_namespace) = &options.topic_namespace { + executor_options_builder.topic_namespace(topic_namespace.clone()); + } + + let mut topic_token_map: HashMap = options + .topic_token_map + .clone() + .into_iter() + .map(|(k, v)| (format!("ex:{k}"), v)) + .collect(); + + topic_token_map.insert("executorId".to_string(), client.client_id().to_string()); + + let executor_options = executor_options_builder + .request_topic_pattern("akri/connector/resources/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/createOrUpdateDiscoveredAsset") + .command_name("createOrUpdateDiscoveredAsset") + .is_idempotent(false) + .topic_token_map(topic_token_map) + .build() + .expect("DTDL schema generated invalid arguments"); + + Self( + rpc_command::Executor::new(application_context, client, executor_options) + .expect("DTDL schema generated invalid arguments"), + ) + } + + /// Receive the next [`CreateOrUpdateDiscoveredAssetRequest`] or [`None`] if there will be no more requests + /// + /// # Errors + /// [`AIOProtocolError`] if there is a failure receiving a request + pub async fn recv( + &mut self, + ) -> Option> { + self.0.recv().await + } + + /// Shutdown the [`CreateOrUpdateDiscoveredAssetCommandExecutor`]. Unsubscribes from the request topic. + /// + /// Returns Ok(()) on success, otherwise returns [`AIOProtocolError`]. + /// # Errors + /// [`AIOProtocolError`] of kind [`ClientError`](azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolErrorKind::ClientError) if the unsubscribe fails or if the unsuback reason code doesn't indicate success. + pub async fn shutdown(&mut self) -> Result<(), AIOProtocolError> { + self.0.shutdown().await + } +} diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/create_or_update_discovered_asset_command_invoker.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/create_or_update_discovered_asset_command_invoker.rs index 121c3d5354..ec6d3451f8 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/create_or_update_discovered_asset_command_invoker.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/create_or_update_discovered_asset_command_invoker.rs @@ -13,8 +13,6 @@ use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; use azure_iot_operations_protocol::rpc_command; use super::super::common_types::options::CommandInvokerOptions; -use super::MODEL_ID; -use super::REQUEST_TOPIC_PATTERN; use super::akri_service_error::AkriServiceError; use super::create_or_update_discovered_asset_request_payload::CreateOrUpdateDiscoveredAssetRequestPayload; use super::create_or_update_discovered_asset_response_payload::CreateOrUpdateDiscoveredAssetResponsePayload; @@ -128,18 +126,13 @@ impl CreateOrUpdateDiscoveredAssetCommandInvoker { .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("modelId".to_string(), MODEL_ID.to_string()); topic_token_map.insert( "invokerClientId".to_string(), client.client_id().to_string(), ); - topic_token_map.insert( - "commandName".to_string(), - "createOrUpdateDiscoveredAsset".to_string(), - ); let invoker_options = invoker_options_builder - .request_topic_pattern(REQUEST_TOPIC_PATTERN) + .request_topic_pattern("akri/connector/resources/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/createOrUpdateDiscoveredAsset") .command_name("createOrUpdateDiscoveredAsset") .topic_token_map(topic_token_map) .response_topic_prefix(options.response_topic_prefix.clone()) @@ -178,12 +171,17 @@ impl CreateOrUpdateDiscoveredAssetCommandInvoker { timestamp: response.timestamp, executor_id: response.executor_id, })) - } else if let Some(discovered_asset_response) = - response.payload.discovered_asset_response - { + } else { Ok(Ok(CreateOrUpdateDiscoveredAssetResponse { payload: CreateOrUpdateDiscoveredAssetResponsePayload { - discovered_asset_response, + discovered_asset_response: response + .payload + .discovered_asset_response + .ok_or( + CreateOrUpdateDiscoveredAssetCommandInvoker::get_err( + "discoveredAssetResponse", + ), + )?, }, content_type: response.content_type, format_indicator: response.format_indicator, @@ -191,26 +189,6 @@ impl CreateOrUpdateDiscoveredAssetCommandInvoker { timestamp: response.timestamp, executor_id: response.executor_id, })) - } else { - Err(AIOProtocolError { - message: Some( - "Command response has neither normal nor error payload content" - .to_string(), - ), - kind: AIOProtocolErrorKind::PayloadInvalid, - is_shallow: false, - is_remote: true, - nested_error: None, - header_name: None, - header_value: None, - timeout_name: None, - timeout_value: None, - property_name: None, - property_value: None, - command_name: Some("createOrUpdateDiscoveredAsset".to_string()), - protocol_version: None, - supported_protocol_major_versions: None, - }) } } Err(err) => Err(err), @@ -225,4 +203,23 @@ impl CreateOrUpdateDiscoveredAssetCommandInvoker { pub async fn shutdown(&self) -> Result<(), AIOProtocolError> { self.0.shutdown().await } + + fn get_err(field_name: &str) -> AIOProtocolError { + AIOProtocolError { + message: Some(format!("Command response missing field {field_name}")), + kind: AIOProtocolErrorKind::PayloadInvalid, + is_shallow: false, + is_remote: false, + nested_error: None, + header_name: None, + header_value: None, + timeout_name: None, + timeout_value: None, + property_name: None, + property_value: None, + command_name: Some("createOrUpdateDiscoveredAsset".to_string()), + protocol_version: None, + supported_protocol_major_versions: None, + } + } } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/create_or_update_discovered_asset_request_payload.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/create_or_update_discovered_asset_request_payload.rs index dc8617368c..1b652a3821 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/create_or_update_discovered_asset_request_payload.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/create_or_update_discovered_asset_request_payload.rs @@ -12,9 +12,10 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; use super::create_or_update_discovered_asset_request_schema::CreateOrUpdateDiscoveredAssetRequestSchema; +/// The request to create or update a discovered asset. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct CreateOrUpdateDiscoveredAssetRequestPayload { - /// The Command request argument. + /// The 'discoveredAssetRequest' Field. #[serde(rename = "discoveredAssetRequest")] pub discovered_asset_request: CreateOrUpdateDiscoveredAssetRequestSchema, } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/create_or_update_discovered_asset_response_payload.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/create_or_update_discovered_asset_response_payload.rs index 49b203c949..1e698caed3 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/create_or_update_discovered_asset_response_payload.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/create_or_update_discovered_asset_response_payload.rs @@ -12,9 +12,10 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; use super::discovered_asset_response_schema::DiscoveredAssetResponseSchema; +/// Response containing the discovered asset response or error details if the operation failed. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct CreateOrUpdateDiscoveredAssetResponsePayload { - /// The Command response argument. + /// The discovered asset response. #[serde(rename = "discoveredAssetResponse")] pub discovered_asset_response: DiscoveredAssetResponseSchema, } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/create_or_update_discovered_asset_response_schema.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/create_or_update_discovered_asset_response_schema.rs index a877c66167..8f0ff2216e 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/create_or_update_discovered_asset_response_schema.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/create_or_update_discovered_asset_response_schema.rs @@ -13,9 +13,10 @@ use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, use super::akri_service_error::AkriServiceError; use super::discovered_asset_response_schema::DiscoveredAssetResponseSchema; +/// Response containing the discovered asset response or error details if the operation failed. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct CreateOrUpdateDiscoveredAssetResponseSchema { - /// Error details, if the discovered asset creation or update failed. + /// Read error for the 'createOrUpdateDiscoveredAsset' Action. #[serde(rename = "createOrUpdateDiscoveredAssetError")] #[serde(skip_serializing_if = "Option::is_none")] #[builder(default = "None")] diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/dataset_target.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/dataset_target.rs index 273001e34c..253c176ae9 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/dataset_target.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/dataset_target.rs @@ -2,12 +2,10 @@ use serde::{Deserialize, Serialize}; +/// The target destination. #[derive(Serialize, Deserialize, Debug, Clone)] pub enum DatasetTarget { - #[serde(rename = "BrokerStateStore")] BrokerStateStore, - #[serde(rename = "Mqtt")] Mqtt, - #[serde(rename = "Storage")] Storage, } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/destination_configuration.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/destination_configuration.rs index f0a72fa564..4c98597015 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/destination_configuration.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/destination_configuration.rs @@ -13,6 +13,7 @@ use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, use super::qos::Qos; use super::retain::Retain; +/// The destination configuration. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct DestinationConfiguration { /// The BrokerStateStore destination configuration key. diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/device.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/device.rs index 66cfae3272..e71e451291 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/device.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/device.rs @@ -12,7 +12,7 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; use super::device_endpoints_schema::DeviceEndpointsSchema; -/// Represents a Device resource, modeled after the devices.namespaces.deviceregistry.microsoft.com CRD in Kubernetes. +/// The device resource, containing the specific inbound endpoint details as specified by the request. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct Device { /// A set of key-value pairs that contain custom attributes set by the customer. diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/device_endpoints_schema.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/device_endpoints_schema.rs index 4c70efd052..9536a4a6ca 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/device_endpoints_schema.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/device_endpoints_schema.rs @@ -13,6 +13,7 @@ use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, use super::inbound_schema_map_value_schema::InboundSchemaMapValueSchema; use super::outbound_schema::OutboundSchema; +/// Connection endpoint url a device can use to connect to a service. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct DeviceEndpointsSchema { /// The 'inbound' Field. diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/device_status.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/device_status.rs index d067aad8f1..d75e270edd 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/device_status.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/device_status.rs @@ -13,6 +13,7 @@ use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, use super::config_status::ConfigStatus; use super::device_status_endpoint_schema::DeviceStatusEndpointSchema; +/// The device status, containing the specific inbound endpoint status as specified by the request. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct DeviceStatus { /// The configuration status of the device. diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/device_status_endpoint_schema.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/device_status_endpoint_schema.rs index fd66aeced6..0eaedf1158 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/device_status_endpoint_schema.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/device_status_endpoint_schema.rs @@ -12,6 +12,7 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; use super::device_status_inbound_endpoint_schema_map_value_schema::DeviceStatusInboundEndpointSchemaMapValueSchema; +/// Defines the device status for inbound/outbound endpoints. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct DeviceStatusEndpointSchema { /// The 'inbound' Field. diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/device_update_event_telemetry.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/device_update_event_telemetry.rs index 0cf854079e..64d63ac1b7 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/device_update_event_telemetry.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/device_update_event_telemetry.rs @@ -12,6 +12,7 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; use super::device_update_event_schema::DeviceUpdateEventSchema; +/// Telemetry event emitted when a device is updated, containing the relevant inbound endpoint details as specified in the topic. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct DeviceUpdateEventTelemetry { /// Telemetry event emitted when a device is updated, containing the relevant inbound endpoint details as specified in the topic. diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/device_update_event_telemetry_receiver.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/device_update_event_telemetry_receiver.rs index 6c226dcec5..2798f14a7f 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/device_update_event_telemetry_receiver.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/device_update_event_telemetry_receiver.rs @@ -8,8 +8,6 @@ use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; use azure_iot_operations_protocol::telemetry; use super::super::common_types::options::TelemetryReceiverOptions; -use super::MODEL_ID; -use super::TELEMETRY_TOPIC_PATTERN; use super::device_update_event_telemetry::DeviceUpdateEventTelemetry; pub type DeviceUpdateEventTelemetryMessage = @@ -33,18 +31,15 @@ impl DeviceUpdateEventTelemetryReceiver { receiver_options_builder.topic_namespace(topic_namespace.clone()); } - let mut topic_token_map: HashMap = options + let topic_token_map: HashMap = options .topic_token_map .clone() .into_iter() .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("modelId".to_string(), MODEL_ID.to_string()); - topic_token_map.insert("telemetryName".to_string(), "deviceUpdateEvent".to_string()); - let receiver_options = receiver_options_builder - .topic_pattern(TELEMETRY_TOPIC_PATTERN) + .topic_pattern("akri/connector/resources/telemetry/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/deviceUpdateEvent") .topic_token_map(topic_token_map) .auto_ack(options.auto_ack) .build() diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/device_update_event_telemetry_sender.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/device_update_event_telemetry_sender.rs new file mode 100644 index 0000000000..8937291bdc --- /dev/null +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/device_update_event_telemetry_sender.rs @@ -0,0 +1,136 @@ +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v0.10.0.0; DO NOT EDIT. */ + +use std::collections::HashMap; +use std::time::Duration; + +use azure_iot_operations_mqtt::control_packet::QoS; +use azure_iot_operations_mqtt::session::SessionManagedClient; +use azure_iot_operations_protocol::application::ApplicationContext; +use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; +use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; +use azure_iot_operations_protocol::telemetry; + +use super::super::common_types::options::TelemetrySenderOptions; +use super::device_update_event_telemetry::DeviceUpdateEventTelemetry; + +pub type DeviceUpdateEventTelemetryMessage = telemetry::sender::Message; +pub type DeviceUpdateEventTelemetryMessageBuilderError = telemetry::sender::MessageBuilderError; + +/// Builder for [`DeviceUpdateEventTelemetryMessage`] +#[derive(Default)] +pub struct DeviceUpdateEventTelemetryMessageBuilder { + inner_builder: telemetry::sender::MessageBuilder, + topic_tokens: HashMap, +} + +impl DeviceUpdateEventTelemetryMessageBuilder { + /// Quality of Service of the telemetry message. Can only be `AtMostOnce` or `AtLeastOnce`. + pub fn qos(&mut self, qos: QoS) -> &mut Self { + self.inner_builder.qos(qos); + self + } + + /// Custom user data to set on the message + pub fn custom_user_data(&mut self, custom_user_data: Vec<(String, String)>) -> &mut Self { + self.inner_builder.custom_user_data(custom_user_data); + self + } + + /// Topic token keys/values to be replaced into the publish topic of the telemetry message. + /// A prefix of "ex:" will be prepended to each key before scanning the topic pattern. + /// Thus, only tokens of the form `{ex:SOMEKEY}` will be replaced. + pub fn topic_tokens(&mut self, topic_tokens: HashMap) -> &mut Self { + for (k, v) in topic_tokens { + self.topic_tokens.insert(format!("ex:{k}"), v); + } + self + } + + /// Time before message expires + pub fn message_expiry(&mut self, message_expiry: Duration) -> &mut Self { + self.inner_builder.message_expiry(message_expiry); + self + } + + /// Cloud event for the message + pub fn cloud_event(&mut self, cloud_event: Option) -> &mut Self { + self.inner_builder.cloud_event(cloud_event); + self + } + + /// Payload of the message + /// + /// # Errors + /// If the payload cannot be serialized + pub fn payload( + &mut self, + payload: DeviceUpdateEventTelemetry, + ) -> Result<&mut Self, AIOProtocolError> { + self.inner_builder.payload(payload)?; + Ok(self) + } + + /// Builds a new `DeviceUpdateEventTelemetryMessage` + /// + /// # Errors + /// If a required field has not been initialized + pub fn build( + &mut self, + ) -> Result + { + self.inner_builder.topic_tokens(self.topic_tokens.clone()); + + self.inner_builder.build() + } +} + +/// Telemetry Sender for `DeviceUpdateEventTelemetry` +pub struct DeviceUpdateEventTelemetrySender(telemetry::Sender); + +impl DeviceUpdateEventTelemetrySender { + /// Creates a new [`DeviceUpdateEventTelemetrySender`] + /// + /// # Panics + /// If the DTDL that generated this code was invalid + pub fn new( + application_context: ApplicationContext, + client: SessionManagedClient, + options: &TelemetrySenderOptions, + ) -> Self { + let mut sender_options_builder = telemetry::sender::OptionsBuilder::default(); + if let Some(topic_namespace) = &options.topic_namespace { + sender_options_builder.topic_namespace(topic_namespace.clone()); + } + + let mut topic_token_map: HashMap = options + .topic_token_map + .clone() + .into_iter() + .map(|(k, v)| (format!("ex:{k}"), v)) + .collect(); + + topic_token_map.insert("senderId".to_string(), client.client_id().to_string()); + + let sender_options = sender_options_builder + .topic_pattern("akri/connector/resources/telemetry/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/deviceUpdateEvent") + .topic_token_map(topic_token_map) + .build() + .expect("DTDL schema generated invalid arguments"); + + Self( + telemetry::Sender::new(application_context, client, sender_options) + .expect("DTDL schema generated invalid arguments"), + ) + } + + /// Sends a [`DeviceUpdateEventTelemetryMessage`] + /// + /// # Error + /// [`AIOProtocolError`] if there is a failure sending the message + pub async fn send( + &self, + message: DeviceUpdateEventTelemetryMessage, + ) -> Result<(), AIOProtocolError> { + self.0.send(message).await + } +} diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/discovered_asset.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/discovered_asset.rs index 2f616ed38a..5cb33fb3c1 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/discovered_asset.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/discovered_asset.rs @@ -18,6 +18,7 @@ use super::discovered_asset_management_group::DiscoveredAssetManagementGroup; use super::discovered_asset_stream::DiscoveredAssetStream; use super::event_stream_destination::EventStreamDestination; +/// The discovered asset resource to create or update. Fields omitted in the request will be removed. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct DiscoveredAsset { /// URIs or type definition IDs for the asset type. diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/discovered_asset_response_schema.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/discovered_asset_response_schema.rs index 88338e519d..68d1c1ab50 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/discovered_asset_response_schema.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/discovered_asset_response_schema.rs @@ -11,6 +11,7 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; +/// The discovered asset response. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct DiscoveredAssetResponseSchema { /// The unique identifier for the discovered asset. diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/event_stream_target.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/event_stream_target.rs index 79a042e1c4..1c80aea43e 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/event_stream_target.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/event_stream_target.rs @@ -2,10 +2,9 @@ use serde::{Deserialize, Serialize}; +/// The target destination. #[derive(Serialize, Deserialize, Debug, Clone)] pub enum EventStreamTarget { - #[serde(rename = "Mqtt")] Mqtt, - #[serde(rename = "Storage")] Storage, } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_command_executor.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_command_executor.rs new file mode 100644 index 0000000000..f203a652be --- /dev/null +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_command_executor.rs @@ -0,0 +1,136 @@ +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v0.10.0.0; DO NOT EDIT. */ + +use std::collections::HashMap; + +use azure_iot_operations_mqtt::session::SessionManagedClient; +use azure_iot_operations_protocol::application::ApplicationContext; +use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; +use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; +use azure_iot_operations_protocol::rpc_command; + +use super::super::common_types::options::CommandExecutorOptions; +use super::akri_service_error::AkriServiceError; +use super::get_asset_request_payload::GetAssetRequestPayload; +use super::get_asset_response_payload::GetAssetResponsePayload; +use super::get_asset_response_schema::GetAssetResponseSchema; + +pub type GetAssetRequest = + rpc_command::executor::Request; +pub type GetAssetResponse = rpc_command::executor::Response; +pub type GetAssetResponseBuilderError = rpc_command::executor::ResponseBuilderError; + +/// Builder for [`GetAssetResponse`] +#[derive(Default)] +pub struct GetAssetResponseBuilder { + inner_builder: rpc_command::executor::ResponseBuilder, +} + +impl GetAssetResponseBuilder { + /// Custom user data to set on the response + pub fn custom_user_data(&mut self, custom_user_data: Vec<(String, String)>) -> &mut Self { + self.inner_builder.custom_user_data(custom_user_data); + self + } + + /// Cloud event for the response + pub fn cloud_event( + &mut self, + cloud_event: Option, + ) -> &mut Self { + self.inner_builder.cloud_event(cloud_event); + self + } + + /// Payload of the response + /// + /// # Errors + /// If the payload cannot be serialized + pub fn payload( + &mut self, + payload: GetAssetResponsePayload, + ) -> Result<&mut Self, AIOProtocolError> { + self.inner_builder.payload(GetAssetResponseSchema { + asset: Some(payload.asset), + get_asset_error: None, + })?; + Ok(self) + } + + pub fn error(&mut self, error: AkriServiceError) -> Result<&mut Self, AIOProtocolError> { + self.inner_builder.payload(GetAssetResponseSchema { + asset: None, + get_asset_error: Some(error), + })?; + Ok(self) + } + + /// Builds a new `GetAssetResponse` + /// + /// # Errors + /// If a required field has not been initialized + #[allow(clippy::missing_panics_doc)] // The panic is not possible + pub fn build(&mut self) -> Result { + self.inner_builder.build() + } +} + +/// Command Executor for `getAsset` +pub struct GetAssetCommandExecutor( + rpc_command::Executor, +); + +impl GetAssetCommandExecutor { + /// Creates a new [`GetAssetCommandExecutor`] + /// + /// # Panics + /// If the DTDL that generated this code was invalid + pub fn new( + application_context: ApplicationContext, + client: SessionManagedClient, + options: &CommandExecutorOptions, + ) -> Self { + let mut executor_options_builder = rpc_command::executor::OptionsBuilder::default(); + if let Some(topic_namespace) = &options.topic_namespace { + executor_options_builder.topic_namespace(topic_namespace.clone()); + } + + let mut topic_token_map: HashMap = options + .topic_token_map + .clone() + .into_iter() + .map(|(k, v)| (format!("ex:{k}"), v)) + .collect(); + + topic_token_map.insert("executorId".to_string(), client.client_id().to_string()); + + let executor_options = executor_options_builder + .request_topic_pattern("akri/connector/resources/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/getAsset") + .command_name("getAsset") + .is_idempotent(false) + .topic_token_map(topic_token_map) + .build() + .expect("DTDL schema generated invalid arguments"); + + Self( + rpc_command::Executor::new(application_context, client, executor_options) + .expect("DTDL schema generated invalid arguments"), + ) + } + + /// Receive the next [`GetAssetRequest`] or [`None`] if there will be no more requests + /// + /// # Errors + /// [`AIOProtocolError`] if there is a failure receiving a request + pub async fn recv(&mut self) -> Option> { + self.0.recv().await + } + + /// Shutdown the [`GetAssetCommandExecutor`]. Unsubscribes from the request topic. + /// + /// Returns Ok(()) on success, otherwise returns [`AIOProtocolError`]. + /// # Errors + /// [`AIOProtocolError`] of kind [`ClientError`](azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolErrorKind::ClientError) if the unsubscribe fails or if the unsuback reason code doesn't indicate success. + pub async fn shutdown(&mut self) -> Result<(), AIOProtocolError> { + self.0.shutdown().await + } +} diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_command_invoker.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_command_invoker.rs index 6c943fac93..92565bff76 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_command_invoker.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_command_invoker.rs @@ -13,8 +13,6 @@ use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; use azure_iot_operations_protocol::rpc_command; use super::super::common_types::options::CommandInvokerOptions; -use super::MODEL_ID; -use super::REQUEST_TOPIC_PATTERN; use super::akri_service_error::AkriServiceError; use super::get_asset_request_payload::GetAssetRequestPayload; use super::get_asset_response_payload::GetAssetResponsePayload; @@ -115,15 +113,13 @@ impl GetAssetCommandInvoker { .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("modelId".to_string(), MODEL_ID.to_string()); topic_token_map.insert( "invokerClientId".to_string(), client.client_id().to_string(), ); - topic_token_map.insert("commandName".to_string(), "getAsset".to_string()); let invoker_options = invoker_options_builder - .request_topic_pattern(REQUEST_TOPIC_PATTERN) + .request_topic_pattern("akri/connector/resources/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/getAsset") .command_name("getAsset") .topic_token_map(topic_token_map) .response_topic_prefix(options.response_topic_prefix.clone()) @@ -157,35 +153,20 @@ impl GetAssetCommandInvoker { timestamp: response.timestamp, executor_id: response.executor_id, })) - } else if let Some(asset) = response.payload.asset { + } else { Ok(Ok(GetAssetResponse { - payload: GetAssetResponsePayload { asset }, + payload: GetAssetResponsePayload { + asset: response + .payload + .asset + .ok_or(GetAssetCommandInvoker::get_err("asset"))?, + }, content_type: response.content_type, format_indicator: response.format_indicator, custom_user_data: response.custom_user_data, timestamp: response.timestamp, executor_id: response.executor_id, })) - } else { - Err(AIOProtocolError { - message: Some( - "Command response has neither normal nor error payload content" - .to_string(), - ), - kind: AIOProtocolErrorKind::PayloadInvalid, - is_shallow: false, - is_remote: true, - nested_error: None, - header_name: None, - header_value: None, - timeout_name: None, - timeout_value: None, - property_name: None, - property_value: None, - command_name: Some("getAsset".to_string()), - protocol_version: None, - supported_protocol_major_versions: None, - }) } } Err(err) => Err(err), @@ -200,4 +181,23 @@ impl GetAssetCommandInvoker { pub async fn shutdown(&self) -> Result<(), AIOProtocolError> { self.0.shutdown().await } + + fn get_err(field_name: &str) -> AIOProtocolError { + AIOProtocolError { + message: Some(format!("Command response missing field {field_name}")), + kind: AIOProtocolErrorKind::PayloadInvalid, + is_shallow: false, + is_remote: false, + nested_error: None, + header_name: None, + header_value: None, + timeout_name: None, + timeout_value: None, + property_name: None, + property_value: None, + command_name: Some("getAsset".to_string()), + protocol_version: None, + supported_protocol_major_versions: None, + } + } } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_request_payload.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_request_payload.rs index b7fc8fde8b..c9b6001977 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_request_payload.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_request_payload.rs @@ -11,9 +11,10 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; +/// The name of the asset to retrieve. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct GetAssetRequestPayload { - /// The Command request argument. + /// The 'assetName' Field. #[serde(rename = "assetName")] pub asset_name: String, } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_response_payload.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_response_payload.rs index 442d347f7e..ed6c34d1e1 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_response_payload.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_response_payload.rs @@ -12,8 +12,9 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; use super::asset::Asset; +/// Response containing the asset resource or error details if the asset could not be retrieved. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct GetAssetResponsePayload { - /// The Command response argument. + /// The asset resource pub asset: Asset, } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_response_schema.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_response_schema.rs index 963d7d81b8..b5cfe6b67a 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_response_schema.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_response_schema.rs @@ -13,6 +13,7 @@ use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, use super::akri_service_error::AkriServiceError; use super::asset::Asset; +/// Response containing the asset resource or error details if the asset could not be retrieved. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct GetAssetResponseSchema { /// The asset resource @@ -20,7 +21,7 @@ pub struct GetAssetResponseSchema { #[builder(default = "None")] pub asset: Option, - /// Error details, if the asset could not be retrieved. + /// Read error for the 'getAsset' Action. #[serde(rename = "getAssetError")] #[serde(skip_serializing_if = "Option::is_none")] #[builder(default = "None")] diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_status_command_executor.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_status_command_executor.rs new file mode 100644 index 0000000000..4a864d6fe1 --- /dev/null +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_status_command_executor.rs @@ -0,0 +1,136 @@ +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v0.10.0.0; DO NOT EDIT. */ + +use std::collections::HashMap; + +use azure_iot_operations_mqtt::session::SessionManagedClient; +use azure_iot_operations_protocol::application::ApplicationContext; +use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; +use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; +use azure_iot_operations_protocol::rpc_command; + +use super::super::common_types::options::CommandExecutorOptions; +use super::akri_service_error::AkriServiceError; +use super::get_asset_status_request_payload::GetAssetStatusRequestPayload; +use super::get_asset_status_response_payload::GetAssetStatusResponsePayload; +use super::get_asset_status_response_schema::GetAssetStatusResponseSchema; + +pub type GetAssetStatusRequest = + rpc_command::executor::Request; +pub type GetAssetStatusResponse = rpc_command::executor::Response; +pub type GetAssetStatusResponseBuilderError = rpc_command::executor::ResponseBuilderError; + +/// Builder for [`GetAssetStatusResponse`] +#[derive(Default)] +pub struct GetAssetStatusResponseBuilder { + inner_builder: rpc_command::executor::ResponseBuilder, +} + +impl GetAssetStatusResponseBuilder { + /// Custom user data to set on the response + pub fn custom_user_data(&mut self, custom_user_data: Vec<(String, String)>) -> &mut Self { + self.inner_builder.custom_user_data(custom_user_data); + self + } + + /// Cloud event for the response + pub fn cloud_event( + &mut self, + cloud_event: Option, + ) -> &mut Self { + self.inner_builder.cloud_event(cloud_event); + self + } + + /// Payload of the response + /// + /// # Errors + /// If the payload cannot be serialized + pub fn payload( + &mut self, + payload: GetAssetStatusResponsePayload, + ) -> Result<&mut Self, AIOProtocolError> { + self.inner_builder.payload(GetAssetStatusResponseSchema { + asset_status: Some(payload.asset_status), + get_asset_status_error: None, + })?; + Ok(self) + } + + pub fn error(&mut self, error: AkriServiceError) -> Result<&mut Self, AIOProtocolError> { + self.inner_builder.payload(GetAssetStatusResponseSchema { + asset_status: None, + get_asset_status_error: Some(error), + })?; + Ok(self) + } + + /// Builds a new `GetAssetStatusResponse` + /// + /// # Errors + /// If a required field has not been initialized + #[allow(clippy::missing_panics_doc)] // The panic is not possible + pub fn build(&mut self) -> Result { + self.inner_builder.build() + } +} + +/// Command Executor for `getAssetStatus` +pub struct GetAssetStatusCommandExecutor( + rpc_command::Executor, +); + +impl GetAssetStatusCommandExecutor { + /// Creates a new [`GetAssetStatusCommandExecutor`] + /// + /// # Panics + /// If the DTDL that generated this code was invalid + pub fn new( + application_context: ApplicationContext, + client: SessionManagedClient, + options: &CommandExecutorOptions, + ) -> Self { + let mut executor_options_builder = rpc_command::executor::OptionsBuilder::default(); + if let Some(topic_namespace) = &options.topic_namespace { + executor_options_builder.topic_namespace(topic_namespace.clone()); + } + + let mut topic_token_map: HashMap = options + .topic_token_map + .clone() + .into_iter() + .map(|(k, v)| (format!("ex:{k}"), v)) + .collect(); + + topic_token_map.insert("executorId".to_string(), client.client_id().to_string()); + + let executor_options = executor_options_builder + .request_topic_pattern("akri/connector/resources/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/getAssetStatus") + .command_name("getAssetStatus") + .is_idempotent(false) + .topic_token_map(topic_token_map) + .build() + .expect("DTDL schema generated invalid arguments"); + + Self( + rpc_command::Executor::new(application_context, client, executor_options) + .expect("DTDL schema generated invalid arguments"), + ) + } + + /// Receive the next [`GetAssetStatusRequest`] or [`None`] if there will be no more requests + /// + /// # Errors + /// [`AIOProtocolError`] if there is a failure receiving a request + pub async fn recv(&mut self) -> Option> { + self.0.recv().await + } + + /// Shutdown the [`GetAssetStatusCommandExecutor`]. Unsubscribes from the request topic. + /// + /// Returns Ok(()) on success, otherwise returns [`AIOProtocolError`]. + /// # Errors + /// [`AIOProtocolError`] of kind [`ClientError`](azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolErrorKind::ClientError) if the unsubscribe fails or if the unsuback reason code doesn't indicate success. + pub async fn shutdown(&mut self) -> Result<(), AIOProtocolError> { + self.0.shutdown().await + } +} diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_status_command_invoker.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_status_command_invoker.rs index 6419a004d8..7b894b2bec 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_status_command_invoker.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_status_command_invoker.rs @@ -13,8 +13,6 @@ use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; use azure_iot_operations_protocol::rpc_command; use super::super::common_types::options::CommandInvokerOptions; -use super::MODEL_ID; -use super::REQUEST_TOPIC_PATTERN; use super::akri_service_error::AkriServiceError; use super::get_asset_status_request_payload::GetAssetStatusRequestPayload; use super::get_asset_status_response_payload::GetAssetStatusResponsePayload; @@ -115,15 +113,13 @@ impl GetAssetStatusCommandInvoker { .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("modelId".to_string(), MODEL_ID.to_string()); topic_token_map.insert( "invokerClientId".to_string(), client.client_id().to_string(), ); - topic_token_map.insert("commandName".to_string(), "getAssetStatus".to_string()); let invoker_options = invoker_options_builder - .request_topic_pattern(REQUEST_TOPIC_PATTERN) + .request_topic_pattern("akri/connector/resources/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/getAssetStatus") .command_name("getAssetStatus") .topic_token_map(topic_token_map) .response_topic_prefix(options.response_topic_prefix.clone()) @@ -157,35 +153,20 @@ impl GetAssetStatusCommandInvoker { timestamp: response.timestamp, executor_id: response.executor_id, })) - } else if let Some(asset_status) = response.payload.asset_status { + } else { Ok(Ok(GetAssetStatusResponse { - payload: GetAssetStatusResponsePayload { asset_status }, + payload: GetAssetStatusResponsePayload { + asset_status: response + .payload + .asset_status + .ok_or(GetAssetStatusCommandInvoker::get_err("assetStatus"))?, + }, content_type: response.content_type, format_indicator: response.format_indicator, custom_user_data: response.custom_user_data, timestamp: response.timestamp, executor_id: response.executor_id, })) - } else { - Err(AIOProtocolError { - message: Some( - "Command response has neither normal nor error payload content" - .to_string(), - ), - kind: AIOProtocolErrorKind::PayloadInvalid, - is_shallow: false, - is_remote: true, - nested_error: None, - header_name: None, - header_value: None, - timeout_name: None, - timeout_value: None, - property_name: None, - property_value: None, - command_name: Some("getAssetStatus".to_string()), - protocol_version: None, - supported_protocol_major_versions: None, - }) } } Err(err) => Err(err), @@ -200,4 +181,23 @@ impl GetAssetStatusCommandInvoker { pub async fn shutdown(&self) -> Result<(), AIOProtocolError> { self.0.shutdown().await } + + fn get_err(field_name: &str) -> AIOProtocolError { + AIOProtocolError { + message: Some(format!("Command response missing field {field_name}")), + kind: AIOProtocolErrorKind::PayloadInvalid, + is_shallow: false, + is_remote: false, + nested_error: None, + header_name: None, + header_value: None, + timeout_name: None, + timeout_value: None, + property_name: None, + property_value: None, + command_name: Some("getAssetStatus".to_string()), + protocol_version: None, + supported_protocol_major_versions: None, + } + } } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_status_request_payload.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_status_request_payload.rs index 8a6bc4fdea..c1e2990343 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_status_request_payload.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_status_request_payload.rs @@ -11,9 +11,10 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; +/// The name of the asset to retrieve the status for. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct GetAssetStatusRequestPayload { - /// The Command request argument. + /// The 'assetName' Field. #[serde(rename = "assetName")] pub asset_name: String, } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_status_response_payload.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_status_response_payload.rs index fe9cc66119..082f70eac6 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_status_response_payload.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_status_response_payload.rs @@ -12,9 +12,10 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; use super::asset_status::AssetStatus; +/// Response containing the asset status or error details if the status could not be retrieved. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct GetAssetStatusResponsePayload { - /// The Command response argument. + /// The asset status #[serde(rename = "assetStatus")] pub asset_status: AssetStatus, } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_status_response_schema.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_status_response_schema.rs index de8dcb7734..d09448be2b 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_status_response_schema.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_asset_status_response_schema.rs @@ -13,6 +13,7 @@ use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, use super::akri_service_error::AkriServiceError; use super::asset_status::AssetStatus; +/// Response containing the asset status or error details if the status could not be retrieved. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct GetAssetStatusResponseSchema { /// The asset status @@ -21,7 +22,7 @@ pub struct GetAssetStatusResponseSchema { #[builder(default = "None")] pub asset_status: Option, - /// Error details, if the asset status could not be retrieved. + /// Read error for the 'getAssetStatus' Action. #[serde(rename = "getAssetStatusError")] #[serde(skip_serializing_if = "Option::is_none")] #[builder(default = "None")] diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_command_executor.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_command_executor.rs new file mode 100644 index 0000000000..d7401f9814 --- /dev/null +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_command_executor.rs @@ -0,0 +1,133 @@ +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v0.10.0.0; DO NOT EDIT. */ + +use std::collections::HashMap; + +use azure_iot_operations_mqtt::session::SessionManagedClient; +use azure_iot_operations_protocol::application::ApplicationContext; +use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; +use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; +use azure_iot_operations_protocol::rpc_command; + +use super::super::common_types::empty_json::EmptyJson; +use super::super::common_types::options::CommandExecutorOptions; +use super::akri_service_error::AkriServiceError; +use super::get_device_response_payload::GetDeviceResponsePayload; +use super::get_device_response_schema::GetDeviceResponseSchema; + +pub type GetDeviceRequest = rpc_command::executor::Request; +pub type GetDeviceResponse = rpc_command::executor::Response; +pub type GetDeviceResponseBuilderError = rpc_command::executor::ResponseBuilderError; + +/// Builder for [`GetDeviceResponse`] +#[derive(Default)] +pub struct GetDeviceResponseBuilder { + inner_builder: rpc_command::executor::ResponseBuilder, +} + +impl GetDeviceResponseBuilder { + /// Custom user data to set on the response + pub fn custom_user_data(&mut self, custom_user_data: Vec<(String, String)>) -> &mut Self { + self.inner_builder.custom_user_data(custom_user_data); + self + } + + /// Cloud event for the response + pub fn cloud_event( + &mut self, + cloud_event: Option, + ) -> &mut Self { + self.inner_builder.cloud_event(cloud_event); + self + } + + /// Payload of the response + /// + /// # Errors + /// If the payload cannot be serialized + pub fn payload( + &mut self, + payload: GetDeviceResponsePayload, + ) -> Result<&mut Self, AIOProtocolError> { + self.inner_builder.payload(GetDeviceResponseSchema { + device: Some(payload.device), + get_device_error: None, + })?; + Ok(self) + } + + pub fn error(&mut self, error: AkriServiceError) -> Result<&mut Self, AIOProtocolError> { + self.inner_builder.payload(GetDeviceResponseSchema { + device: None, + get_device_error: Some(error), + })?; + Ok(self) + } + + /// Builds a new `GetDeviceResponse` + /// + /// # Errors + /// If a required field has not been initialized + #[allow(clippy::missing_panics_doc)] // The panic is not possible + pub fn build(&mut self) -> Result { + self.inner_builder.build() + } +} + +/// Command Executor for `getDevice` +pub struct GetDeviceCommandExecutor(rpc_command::Executor); + +impl GetDeviceCommandExecutor { + /// Creates a new [`GetDeviceCommandExecutor`] + /// + /// # Panics + /// If the DTDL that generated this code was invalid + pub fn new( + application_context: ApplicationContext, + client: SessionManagedClient, + options: &CommandExecutorOptions, + ) -> Self { + let mut executor_options_builder = rpc_command::executor::OptionsBuilder::default(); + if let Some(topic_namespace) = &options.topic_namespace { + executor_options_builder.topic_namespace(topic_namespace.clone()); + } + + let mut topic_token_map: HashMap = options + .topic_token_map + .clone() + .into_iter() + .map(|(k, v)| (format!("ex:{k}"), v)) + .collect(); + + topic_token_map.insert("executorId".to_string(), client.client_id().to_string()); + + let executor_options = executor_options_builder + .request_topic_pattern("akri/connector/resources/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/getDevice") + .command_name("getDevice") + .is_idempotent(false) + .topic_token_map(topic_token_map) + .build() + .expect("DTDL schema generated invalid arguments"); + + Self( + rpc_command::Executor::new(application_context, client, executor_options) + .expect("DTDL schema generated invalid arguments"), + ) + } + + /// Receive the next [`GetDeviceRequest`] or [`None`] if there will be no more requests + /// + /// # Errors + /// [`AIOProtocolError`] if there is a failure receiving a request + pub async fn recv(&mut self) -> Option> { + self.0.recv().await + } + + /// Shutdown the [`GetDeviceCommandExecutor`]. Unsubscribes from the request topic. + /// + /// Returns Ok(()) on success, otherwise returns [`AIOProtocolError`]. + /// # Errors + /// [`AIOProtocolError`] of kind [`ClientError`](azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolErrorKind::ClientError) if the unsubscribe fails or if the unsuback reason code doesn't indicate success. + pub async fn shutdown(&mut self) -> Result<(), AIOProtocolError> { + self.0.shutdown().await + } +} diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_command_invoker.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_command_invoker.rs index d78edeec2d..aad722819b 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_command_invoker.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_command_invoker.rs @@ -13,8 +13,6 @@ use azure_iot_operations_protocol::rpc_command; use super::super::common_types::empty_json::EmptyJson; use super::super::common_types::options::CommandInvokerOptions; -use super::MODEL_ID; -use super::REQUEST_TOPIC_PATTERN; use super::akri_service_error::AkriServiceError; use super::get_device_response_payload::GetDeviceResponsePayload; use super::get_device_response_schema::GetDeviceResponseSchema; @@ -102,15 +100,13 @@ impl GetDeviceCommandInvoker { .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("modelId".to_string(), MODEL_ID.to_string()); topic_token_map.insert( "invokerClientId".to_string(), client.client_id().to_string(), ); - topic_token_map.insert("commandName".to_string(), "getDevice".to_string()); let invoker_options = invoker_options_builder - .request_topic_pattern(REQUEST_TOPIC_PATTERN) + .request_topic_pattern("akri/connector/resources/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/getDevice") .command_name("getDevice") .topic_token_map(topic_token_map) .response_topic_prefix(options.response_topic_prefix.clone()) @@ -144,35 +140,20 @@ impl GetDeviceCommandInvoker { timestamp: response.timestamp, executor_id: response.executor_id, })) - } else if let Some(device) = response.payload.device { + } else { Ok(Ok(GetDeviceResponse { - payload: GetDeviceResponsePayload { device }, + payload: GetDeviceResponsePayload { + device: response + .payload + .device + .ok_or(GetDeviceCommandInvoker::get_err("device"))?, + }, content_type: response.content_type, format_indicator: response.format_indicator, custom_user_data: response.custom_user_data, timestamp: response.timestamp, executor_id: response.executor_id, })) - } else { - Err(AIOProtocolError { - message: Some( - "Command response has neither normal nor error payload content" - .to_string(), - ), - kind: AIOProtocolErrorKind::PayloadInvalid, - is_shallow: false, - is_remote: true, - nested_error: None, - header_name: None, - header_value: None, - timeout_name: None, - timeout_value: None, - property_name: None, - property_value: None, - command_name: Some("getDevice".to_string()), - protocol_version: None, - supported_protocol_major_versions: None, - }) } } Err(err) => Err(err), @@ -187,4 +168,23 @@ impl GetDeviceCommandInvoker { pub async fn shutdown(&self) -> Result<(), AIOProtocolError> { self.0.shutdown().await } + + fn get_err(field_name: &str) -> AIOProtocolError { + AIOProtocolError { + message: Some(format!("Command response missing field {field_name}")), + kind: AIOProtocolErrorKind::PayloadInvalid, + is_shallow: false, + is_remote: false, + nested_error: None, + header_name: None, + header_value: None, + timeout_name: None, + timeout_value: None, + property_name: None, + property_value: None, + command_name: Some("getDevice".to_string()), + protocol_version: None, + supported_protocol_major_versions: None, + } + } } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_response_payload.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_response_payload.rs index 776120dc0b..107d312bb8 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_response_payload.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_response_payload.rs @@ -12,8 +12,9 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; use super::device::Device; +/// Response containing the device resource or error details if the device could not be retrieved. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct GetDeviceResponsePayload { - /// The Command response argument. + /// The device resource, containing the specific inbound endpoint details as specified by the request. pub device: Device, } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_response_schema.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_response_schema.rs index 856336225d..3da8a00584 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_response_schema.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_response_schema.rs @@ -13,6 +13,7 @@ use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, use super::akri_service_error::AkriServiceError; use super::device::Device; +/// Response containing the device resource or error details if the device could not be retrieved. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct GetDeviceResponseSchema { /// The device resource, containing the specific inbound endpoint details as specified by the request. @@ -20,7 +21,7 @@ pub struct GetDeviceResponseSchema { #[builder(default = "None")] pub device: Option, - /// Error details, if the device could not be retrieved. + /// Read error for the 'getDevice' Action. #[serde(rename = "getDeviceError")] #[serde(skip_serializing_if = "Option::is_none")] #[builder(default = "None")] diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_status_command_executor.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_status_command_executor.rs new file mode 100644 index 0000000000..0103b43121 --- /dev/null +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_status_command_executor.rs @@ -0,0 +1,138 @@ +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v0.10.0.0; DO NOT EDIT. */ + +use std::collections::HashMap; + +use azure_iot_operations_mqtt::session::SessionManagedClient; +use azure_iot_operations_protocol::application::ApplicationContext; +use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; +use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; +use azure_iot_operations_protocol::rpc_command; + +use super::super::common_types::empty_json::EmptyJson; +use super::super::common_types::options::CommandExecutorOptions; +use super::akri_service_error::AkriServiceError; +use super::get_device_status_response_payload::GetDeviceStatusResponsePayload; +use super::get_device_status_response_schema::GetDeviceStatusResponseSchema; + +pub type GetDeviceStatusRequest = + rpc_command::executor::Request; +pub type GetDeviceStatusResponse = rpc_command::executor::Response; +pub type GetDeviceStatusResponseBuilderError = rpc_command::executor::ResponseBuilderError; + +/// Builder for [`GetDeviceStatusResponse`] +#[derive(Default)] +pub struct GetDeviceStatusResponseBuilder { + inner_builder: rpc_command::executor::ResponseBuilder, +} + +impl GetDeviceStatusResponseBuilder { + /// Custom user data to set on the response + pub fn custom_user_data(&mut self, custom_user_data: Vec<(String, String)>) -> &mut Self { + self.inner_builder.custom_user_data(custom_user_data); + self + } + + /// Cloud event for the response + pub fn cloud_event( + &mut self, + cloud_event: Option, + ) -> &mut Self { + self.inner_builder.cloud_event(cloud_event); + self + } + + /// Payload of the response + /// + /// # Errors + /// If the payload cannot be serialized + pub fn payload( + &mut self, + payload: GetDeviceStatusResponsePayload, + ) -> Result<&mut Self, AIOProtocolError> { + self.inner_builder.payload(GetDeviceStatusResponseSchema { + device_status: Some(payload.device_status), + get_device_status_error: None, + })?; + Ok(self) + } + + pub fn error(&mut self, error: AkriServiceError) -> Result<&mut Self, AIOProtocolError> { + self.inner_builder.payload(GetDeviceStatusResponseSchema { + device_status: None, + get_device_status_error: Some(error), + })?; + Ok(self) + } + + /// Builds a new `GetDeviceStatusResponse` + /// + /// # Errors + /// If a required field has not been initialized + #[allow(clippy::missing_panics_doc)] // The panic is not possible + pub fn build( + &mut self, + ) -> Result { + self.inner_builder.build() + } +} + +/// Command Executor for `getDeviceStatus` +pub struct GetDeviceStatusCommandExecutor( + rpc_command::Executor, +); + +impl GetDeviceStatusCommandExecutor { + /// Creates a new [`GetDeviceStatusCommandExecutor`] + /// + /// # Panics + /// If the DTDL that generated this code was invalid + pub fn new( + application_context: ApplicationContext, + client: SessionManagedClient, + options: &CommandExecutorOptions, + ) -> Self { + let mut executor_options_builder = rpc_command::executor::OptionsBuilder::default(); + if let Some(topic_namespace) = &options.topic_namespace { + executor_options_builder.topic_namespace(topic_namespace.clone()); + } + + let mut topic_token_map: HashMap = options + .topic_token_map + .clone() + .into_iter() + .map(|(k, v)| (format!("ex:{k}"), v)) + .collect(); + + topic_token_map.insert("executorId".to_string(), client.client_id().to_string()); + + let executor_options = executor_options_builder + .request_topic_pattern("akri/connector/resources/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/getDeviceStatus") + .command_name("getDeviceStatus") + .is_idempotent(false) + .topic_token_map(topic_token_map) + .build() + .expect("DTDL schema generated invalid arguments"); + + Self( + rpc_command::Executor::new(application_context, client, executor_options) + .expect("DTDL schema generated invalid arguments"), + ) + } + + /// Receive the next [`GetDeviceStatusRequest`] or [`None`] if there will be no more requests + /// + /// # Errors + /// [`AIOProtocolError`] if there is a failure receiving a request + pub async fn recv(&mut self) -> Option> { + self.0.recv().await + } + + /// Shutdown the [`GetDeviceStatusCommandExecutor`]. Unsubscribes from the request topic. + /// + /// Returns Ok(()) on success, otherwise returns [`AIOProtocolError`]. + /// # Errors + /// [`AIOProtocolError`] of kind [`ClientError`](azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolErrorKind::ClientError) if the unsubscribe fails or if the unsuback reason code doesn't indicate success. + pub async fn shutdown(&mut self) -> Result<(), AIOProtocolError> { + self.0.shutdown().await + } +} diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_status_command_invoker.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_status_command_invoker.rs index 2eb93c9e93..b3eff624e2 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_status_command_invoker.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_status_command_invoker.rs @@ -13,8 +13,6 @@ use azure_iot_operations_protocol::rpc_command; use super::super::common_types::empty_json::EmptyJson; use super::super::common_types::options::CommandInvokerOptions; -use super::MODEL_ID; -use super::REQUEST_TOPIC_PATTERN; use super::akri_service_error::AkriServiceError; use super::get_device_status_response_payload::GetDeviceStatusResponsePayload; use super::get_device_status_response_schema::GetDeviceStatusResponseSchema; @@ -104,15 +102,13 @@ impl GetDeviceStatusCommandInvoker { .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("modelId".to_string(), MODEL_ID.to_string()); topic_token_map.insert( "invokerClientId".to_string(), client.client_id().to_string(), ); - topic_token_map.insert("commandName".to_string(), "getDeviceStatus".to_string()); let invoker_options = invoker_options_builder - .request_topic_pattern(REQUEST_TOPIC_PATTERN) + .request_topic_pattern("akri/connector/resources/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/getDeviceStatus") .command_name("getDeviceStatus") .topic_token_map(topic_token_map) .response_topic_prefix(options.response_topic_prefix.clone()) @@ -147,35 +143,20 @@ impl GetDeviceStatusCommandInvoker { timestamp: response.timestamp, executor_id: response.executor_id, })) - } else if let Some(device_status) = response.payload.device_status { + } else { Ok(Ok(GetDeviceStatusResponse { - payload: GetDeviceStatusResponsePayload { device_status }, + payload: GetDeviceStatusResponsePayload { + device_status: response + .payload + .device_status + .ok_or(GetDeviceStatusCommandInvoker::get_err("deviceStatus"))?, + }, content_type: response.content_type, format_indicator: response.format_indicator, custom_user_data: response.custom_user_data, timestamp: response.timestamp, executor_id: response.executor_id, })) - } else { - Err(AIOProtocolError { - message: Some( - "Command response has neither normal nor error payload content" - .to_string(), - ), - kind: AIOProtocolErrorKind::PayloadInvalid, - is_shallow: false, - is_remote: true, - nested_error: None, - header_name: None, - header_value: None, - timeout_name: None, - timeout_value: None, - property_name: None, - property_value: None, - command_name: Some("getDeviceStatus".to_string()), - protocol_version: None, - supported_protocol_major_versions: None, - }) } } Err(err) => Err(err), @@ -190,4 +171,23 @@ impl GetDeviceStatusCommandInvoker { pub async fn shutdown(&self) -> Result<(), AIOProtocolError> { self.0.shutdown().await } + + fn get_err(field_name: &str) -> AIOProtocolError { + AIOProtocolError { + message: Some(format!("Command response missing field {field_name}")), + kind: AIOProtocolErrorKind::PayloadInvalid, + is_shallow: false, + is_remote: false, + nested_error: None, + header_name: None, + header_value: None, + timeout_name: None, + timeout_value: None, + property_name: None, + property_value: None, + command_name: Some("getDeviceStatus".to_string()), + protocol_version: None, + supported_protocol_major_versions: None, + } + } } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_status_response_payload.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_status_response_payload.rs index 6a0ba7a350..e22e99bc56 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_status_response_payload.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_status_response_payload.rs @@ -12,9 +12,10 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; use super::device_status::DeviceStatus; +/// Response containing the device status or error details if the status could not be retrieved. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct GetDeviceStatusResponsePayload { - /// The Command response argument. + /// The device status, containing the specific inbound endpoint status as specified by the request. #[serde(rename = "deviceStatus")] pub device_status: DeviceStatus, } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_status_response_schema.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_status_response_schema.rs index c8f297e7f0..5dbf0734a1 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_status_response_schema.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/get_device_status_response_schema.rs @@ -13,6 +13,7 @@ use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, use super::akri_service_error::AkriServiceError; use super::device_status::DeviceStatus; +/// Response containing the device status or error details if the status could not be retrieved. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct GetDeviceStatusResponseSchema { /// The device status, containing the specific inbound endpoint status as specified by the request. @@ -21,7 +22,7 @@ pub struct GetDeviceStatusResponseSchema { #[builder(default = "None")] pub device_status: Option, - /// Error details, if the device status could not be retrieved. + /// Read error for the 'getDeviceStatus' Action. #[serde(rename = "getDeviceStatusError")] #[serde(skip_serializing_if = "Option::is_none")] #[builder(default = "None")] diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/method_schema.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/method_schema.rs index 8e7baca356..8688e876d2 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/method_schema.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/method_schema.rs @@ -2,12 +2,10 @@ use serde::{Deserialize, Serialize}; +/// Defines the method to authenticate the user of the client at the server. #[derive(Serialize, Deserialize, Debug, Clone)] pub enum MethodSchema { - #[serde(rename = "Anonymous")] Anonymous, - #[serde(rename = "Certificate")] Certificate, - #[serde(rename = "UsernamePassword")] UsernamePassword, } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/notification_preference.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/notification_preference.rs index fac0a0c4e2..5f206459f7 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/notification_preference.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/notification_preference.rs @@ -4,8 +4,6 @@ use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Debug, Clone)] pub enum NotificationPreference { - #[serde(rename = "Off")] Off, - #[serde(rename = "On")] On, } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/outbound_schema.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/outbound_schema.rs index 44b3eecd3d..465263df3e 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/outbound_schema.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/outbound_schema.rs @@ -12,6 +12,7 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; use super::device_outbound_endpoint::DeviceOutboundEndpoint; +/// Set of endpoints for device to connect to. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct OutboundSchema { /// Device messaging endpoint model. diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/qos.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/qos.rs index b9ea630065..76f9c4b52f 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/qos.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/qos.rs @@ -2,10 +2,9 @@ use serde::{Deserialize, Serialize}; +/// The MQTT QoS setting. #[derive(Serialize, Deserialize, Debug, Clone)] pub enum Qos { - #[serde(rename = "Qos0")] Qos0, - #[serde(rename = "Qos1")] Qos1, } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/retain.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/retain.rs index 93cab78fe8..fbf63ceaf5 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/retain.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/retain.rs @@ -2,10 +2,9 @@ use serde::{Deserialize, Serialize}; +/// When set to 'Keep', messages published to an MQTT broker will have the retain flag set. #[derive(Serialize, Deserialize, Debug, Clone)] pub enum Retain { - #[serde(rename = "Keep")] Keep, - #[serde(rename = "Never")] Never, } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_asset_updates_command_executor.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_asset_updates_command_executor.rs new file mode 100644 index 0000000000..46d4abbc8a --- /dev/null +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_asset_updates_command_executor.rs @@ -0,0 +1,154 @@ +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v0.10.0.0; DO NOT EDIT. */ + +use std::collections::HashMap; + +use azure_iot_operations_mqtt::session::SessionManagedClient; +use azure_iot_operations_protocol::application::ApplicationContext; +use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; +use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; +use azure_iot_operations_protocol::rpc_command; + +use super::super::common_types::options::CommandExecutorOptions; +use super::akri_service_error::AkriServiceError; +use super::set_notification_preference_for_asset_updates_request_payload::SetNotificationPreferenceForAssetUpdatesRequestPayload; +use super::set_notification_preference_for_asset_updates_response_payload::SetNotificationPreferenceForAssetUpdatesResponsePayload; +use super::set_notification_preference_for_asset_updates_response_schema::SetNotificationPreferenceForAssetUpdatesResponseSchema; + +pub type SetNotificationPreferenceForAssetUpdatesRequest = rpc_command::executor::Request< + SetNotificationPreferenceForAssetUpdatesRequestPayload, + SetNotificationPreferenceForAssetUpdatesResponseSchema, +>; +pub type SetNotificationPreferenceForAssetUpdatesResponse = + rpc_command::executor::Response; +pub type SetNotificationPreferenceForAssetUpdatesResponseBuilderError = + rpc_command::executor::ResponseBuilderError; + +/// Builder for [`SetNotificationPreferenceForAssetUpdatesResponse`] +#[derive(Default)] +pub struct SetNotificationPreferenceForAssetUpdatesResponseBuilder { + inner_builder: rpc_command::executor::ResponseBuilder< + SetNotificationPreferenceForAssetUpdatesResponseSchema, + >, +} + +impl SetNotificationPreferenceForAssetUpdatesResponseBuilder { + /// Custom user data to set on the response + pub fn custom_user_data(&mut self, custom_user_data: Vec<(String, String)>) -> &mut Self { + self.inner_builder.custom_user_data(custom_user_data); + self + } + + /// Cloud event for the response + pub fn cloud_event( + &mut self, + cloud_event: Option, + ) -> &mut Self { + self.inner_builder.cloud_event(cloud_event); + self + } + + /// Payload of the response + /// + /// # Errors + /// If the payload cannot be serialized + pub fn payload( + &mut self, + payload: SetNotificationPreferenceForAssetUpdatesResponsePayload, + ) -> Result<&mut Self, AIOProtocolError> { + self.inner_builder + .payload(SetNotificationPreferenceForAssetUpdatesResponseSchema { + response_payload: Some(payload.response_payload), + set_notification_preference_for_asset_updates_error: None, + })?; + Ok(self) + } + + pub fn error(&mut self, error: AkriServiceError) -> Result<&mut Self, AIOProtocolError> { + self.inner_builder + .payload(SetNotificationPreferenceForAssetUpdatesResponseSchema { + response_payload: None, + set_notification_preference_for_asset_updates_error: Some(error), + })?; + Ok(self) + } + + /// Builds a new `SetNotificationPreferenceForAssetUpdatesResponse` + /// + /// # Errors + /// If a required field has not been initialized + #[allow(clippy::missing_panics_doc)] // The panic is not possible + pub fn build( + &mut self, + ) -> Result< + SetNotificationPreferenceForAssetUpdatesResponse, + SetNotificationPreferenceForAssetUpdatesResponseBuilderError, + > { + self.inner_builder.build() + } +} + +/// Command Executor for `setNotificationPreferenceForAssetUpdates` +pub struct SetNotificationPreferenceForAssetUpdatesCommandExecutor( + rpc_command::Executor< + SetNotificationPreferenceForAssetUpdatesRequestPayload, + SetNotificationPreferenceForAssetUpdatesResponseSchema, + >, +); + +impl SetNotificationPreferenceForAssetUpdatesCommandExecutor { + /// Creates a new [`SetNotificationPreferenceForAssetUpdatesCommandExecutor`] + /// + /// # Panics + /// If the DTDL that generated this code was invalid + pub fn new( + application_context: ApplicationContext, + client: SessionManagedClient, + options: &CommandExecutorOptions, + ) -> Self { + let mut executor_options_builder = rpc_command::executor::OptionsBuilder::default(); + if let Some(topic_namespace) = &options.topic_namespace { + executor_options_builder.topic_namespace(topic_namespace.clone()); + } + + let mut topic_token_map: HashMap = options + .topic_token_map + .clone() + .into_iter() + .map(|(k, v)| (format!("ex:{k}"), v)) + .collect(); + + topic_token_map.insert("executorId".to_string(), client.client_id().to_string()); + + let executor_options = executor_options_builder + .request_topic_pattern("akri/connector/resources/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/setNotificationPreferenceForAssetUpdates") + .command_name("setNotificationPreferenceForAssetUpdates") + .is_idempotent(false) + .topic_token_map(topic_token_map) + .build() + .expect("DTDL schema generated invalid arguments"); + + Self( + rpc_command::Executor::new(application_context, client, executor_options) + .expect("DTDL schema generated invalid arguments"), + ) + } + + /// Receive the next [`SetNotificationPreferenceForAssetUpdatesRequest`] or [`None`] if there will be no more requests + /// + /// # Errors + /// [`AIOProtocolError`] if there is a failure receiving a request + pub async fn recv( + &mut self, + ) -> Option> { + self.0.recv().await + } + + /// Shutdown the [`SetNotificationPreferenceForAssetUpdatesCommandExecutor`]. Unsubscribes from the request topic. + /// + /// Returns Ok(()) on success, otherwise returns [`AIOProtocolError`]. + /// # Errors + /// [`AIOProtocolError`] of kind [`ClientError`](azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolErrorKind::ClientError) if the unsubscribe fails or if the unsuback reason code doesn't indicate success. + pub async fn shutdown(&mut self) -> Result<(), AIOProtocolError> { + self.0.shutdown().await + } +} diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_asset_updates_command_invoker.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_asset_updates_command_invoker.rs index 3f06013cfb..46a643f516 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_asset_updates_command_invoker.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_asset_updates_command_invoker.rs @@ -13,8 +13,6 @@ use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; use azure_iot_operations_protocol::rpc_command; use super::super::common_types::options::CommandInvokerOptions; -use super::MODEL_ID; -use super::REQUEST_TOPIC_PATTERN; use super::akri_service_error::AkriServiceError; use super::set_notification_preference_for_asset_updates_request_payload::SetNotificationPreferenceForAssetUpdatesRequestPayload; use super::set_notification_preference_for_asset_updates_response_payload::SetNotificationPreferenceForAssetUpdatesResponsePayload; @@ -129,18 +127,13 @@ impl SetNotificationPreferenceForAssetUpdatesCommandInvoker { .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("modelId".to_string(), MODEL_ID.to_string()); topic_token_map.insert( "invokerClientId".to_string(), client.client_id().to_string(), ); - topic_token_map.insert( - "commandName".to_string(), - "setNotificationPreferenceForAssetUpdates".to_string(), - ); let invoker_options = invoker_options_builder - .request_topic_pattern(REQUEST_TOPIC_PATTERN) + .request_topic_pattern("akri/connector/resources/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/setNotificationPreferenceForAssetUpdates") .command_name("setNotificationPreferenceForAssetUpdates") .topic_token_map(topic_token_map) .response_topic_prefix(options.response_topic_prefix.clone()) @@ -183,10 +176,14 @@ impl SetNotificationPreferenceForAssetUpdatesCommandInvoker { timestamp: response.timestamp, executor_id: response.executor_id, })) - } else if let Some(response_payload) = response.payload.response_payload { + } else { Ok(Ok(SetNotificationPreferenceForAssetUpdatesResponse { payload: SetNotificationPreferenceForAssetUpdatesResponsePayload { - response_payload, + response_payload: response.payload.response_payload.ok_or( + SetNotificationPreferenceForAssetUpdatesCommandInvoker::get_err( + "responsePayload", + ), + )?, }, content_type: response.content_type, format_indicator: response.format_indicator, @@ -194,26 +191,6 @@ impl SetNotificationPreferenceForAssetUpdatesCommandInvoker { timestamp: response.timestamp, executor_id: response.executor_id, })) - } else { - Err(AIOProtocolError { - message: Some( - "Command response has neither normal nor error payload content" - .to_string(), - ), - kind: AIOProtocolErrorKind::PayloadInvalid, - is_shallow: false, - is_remote: true, - nested_error: None, - header_name: None, - header_value: None, - timeout_name: None, - timeout_value: None, - property_name: None, - property_value: None, - command_name: Some("setNotificationPreferenceForAssetUpdates".to_string()), - protocol_version: None, - supported_protocol_major_versions: None, - }) } } Err(err) => Err(err), @@ -228,4 +205,23 @@ impl SetNotificationPreferenceForAssetUpdatesCommandInvoker { pub async fn shutdown(&self) -> Result<(), AIOProtocolError> { self.0.shutdown().await } + + fn get_err(field_name: &str) -> AIOProtocolError { + AIOProtocolError { + message: Some(format!("Command response missing field {field_name}")), + kind: AIOProtocolErrorKind::PayloadInvalid, + is_shallow: false, + is_remote: false, + nested_error: None, + header_name: None, + header_value: None, + timeout_name: None, + timeout_value: None, + property_name: None, + property_value: None, + command_name: Some("setNotificationPreferenceForAssetUpdates".to_string()), + protocol_version: None, + supported_protocol_major_versions: None, + } + } } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_asset_updates_request_payload.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_asset_updates_request_payload.rs index 4dd379bb03..c074d083e1 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_asset_updates_request_payload.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_asset_updates_request_payload.rs @@ -12,9 +12,10 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; use super::set_notification_preference_for_asset_updates_request_schema::SetNotificationPreferenceForAssetUpdatesRequestSchema; +/// The request to set the notification preference for asset updates. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct SetNotificationPreferenceForAssetUpdatesRequestPayload { - /// The Command request argument. + /// The 'notificationPreferenceRequest' Field. #[serde(rename = "notificationPreferenceRequest")] pub notification_preference_request: SetNotificationPreferenceForAssetUpdatesRequestSchema, } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_asset_updates_response_payload.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_asset_updates_response_payload.rs index 8ce514e39f..49fe91b5f7 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_asset_updates_response_payload.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_asset_updates_response_payload.rs @@ -11,9 +11,10 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; +/// Response containing the result of setting the notification preference for asset updates or error details if the operation failed. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct SetNotificationPreferenceForAssetUpdatesResponsePayload { - /// The Command response argument. + /// The response payload indicating that the operation was successful. #[serde(rename = "responsePayload")] pub response_payload: String, } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_asset_updates_response_schema.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_asset_updates_response_schema.rs index 00a7c0eb59..61ebd7fb12 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_asset_updates_response_schema.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_asset_updates_response_schema.rs @@ -12,6 +12,7 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; use super::akri_service_error::AkriServiceError; +/// Response containing the result of setting the notification preference for asset updates or error details if the operation failed. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct SetNotificationPreferenceForAssetUpdatesResponseSchema { /// The response payload indicating that the operation was successful. @@ -20,7 +21,7 @@ pub struct SetNotificationPreferenceForAssetUpdatesResponseSchema { #[builder(default = "None")] pub response_payload: Option, - /// Error details, if setting the notification preference for asset updates failed. + /// Read error for the 'setNotificationPreferenceForAssetUpdates' Action. #[serde(rename = "setNotificationPreferenceForAssetUpdatesError")] #[serde(skip_serializing_if = "Option::is_none")] #[builder(default = "None")] diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_device_updates_command_executor.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_device_updates_command_executor.rs new file mode 100644 index 0000000000..1b3f5ab592 --- /dev/null +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_device_updates_command_executor.rs @@ -0,0 +1,154 @@ +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v0.10.0.0; DO NOT EDIT. */ + +use std::collections::HashMap; + +use azure_iot_operations_mqtt::session::SessionManagedClient; +use azure_iot_operations_protocol::application::ApplicationContext; +use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; +use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; +use azure_iot_operations_protocol::rpc_command; + +use super::super::common_types::options::CommandExecutorOptions; +use super::akri_service_error::AkriServiceError; +use super::set_notification_preference_for_device_updates_request_payload::SetNotificationPreferenceForDeviceUpdatesRequestPayload; +use super::set_notification_preference_for_device_updates_response_payload::SetNotificationPreferenceForDeviceUpdatesResponsePayload; +use super::set_notification_preference_for_device_updates_response_schema::SetNotificationPreferenceForDeviceUpdatesResponseSchema; + +pub type SetNotificationPreferenceForDeviceUpdatesRequest = rpc_command::executor::Request< + SetNotificationPreferenceForDeviceUpdatesRequestPayload, + SetNotificationPreferenceForDeviceUpdatesResponseSchema, +>; +pub type SetNotificationPreferenceForDeviceUpdatesResponse = + rpc_command::executor::Response; +pub type SetNotificationPreferenceForDeviceUpdatesResponseBuilderError = + rpc_command::executor::ResponseBuilderError; + +/// Builder for [`SetNotificationPreferenceForDeviceUpdatesResponse`] +#[derive(Default)] +pub struct SetNotificationPreferenceForDeviceUpdatesResponseBuilder { + inner_builder: rpc_command::executor::ResponseBuilder< + SetNotificationPreferenceForDeviceUpdatesResponseSchema, + >, +} + +impl SetNotificationPreferenceForDeviceUpdatesResponseBuilder { + /// Custom user data to set on the response + pub fn custom_user_data(&mut self, custom_user_data: Vec<(String, String)>) -> &mut Self { + self.inner_builder.custom_user_data(custom_user_data); + self + } + + /// Cloud event for the response + pub fn cloud_event( + &mut self, + cloud_event: Option, + ) -> &mut Self { + self.inner_builder.cloud_event(cloud_event); + self + } + + /// Payload of the response + /// + /// # Errors + /// If the payload cannot be serialized + pub fn payload( + &mut self, + payload: SetNotificationPreferenceForDeviceUpdatesResponsePayload, + ) -> Result<&mut Self, AIOProtocolError> { + self.inner_builder + .payload(SetNotificationPreferenceForDeviceUpdatesResponseSchema { + response_payload: Some(payload.response_payload), + set_notification_preference_for_device_updates_error: None, + })?; + Ok(self) + } + + pub fn error(&mut self, error: AkriServiceError) -> Result<&mut Self, AIOProtocolError> { + self.inner_builder + .payload(SetNotificationPreferenceForDeviceUpdatesResponseSchema { + response_payload: None, + set_notification_preference_for_device_updates_error: Some(error), + })?; + Ok(self) + } + + /// Builds a new `SetNotificationPreferenceForDeviceUpdatesResponse` + /// + /// # Errors + /// If a required field has not been initialized + #[allow(clippy::missing_panics_doc)] // The panic is not possible + pub fn build( + &mut self, + ) -> Result< + SetNotificationPreferenceForDeviceUpdatesResponse, + SetNotificationPreferenceForDeviceUpdatesResponseBuilderError, + > { + self.inner_builder.build() + } +} + +/// Command Executor for `setNotificationPreferenceForDeviceUpdates` +pub struct SetNotificationPreferenceForDeviceUpdatesCommandExecutor( + rpc_command::Executor< + SetNotificationPreferenceForDeviceUpdatesRequestPayload, + SetNotificationPreferenceForDeviceUpdatesResponseSchema, + >, +); + +impl SetNotificationPreferenceForDeviceUpdatesCommandExecutor { + /// Creates a new [`SetNotificationPreferenceForDeviceUpdatesCommandExecutor`] + /// + /// # Panics + /// If the DTDL that generated this code was invalid + pub fn new( + application_context: ApplicationContext, + client: SessionManagedClient, + options: &CommandExecutorOptions, + ) -> Self { + let mut executor_options_builder = rpc_command::executor::OptionsBuilder::default(); + if let Some(topic_namespace) = &options.topic_namespace { + executor_options_builder.topic_namespace(topic_namespace.clone()); + } + + let mut topic_token_map: HashMap = options + .topic_token_map + .clone() + .into_iter() + .map(|(k, v)| (format!("ex:{k}"), v)) + .collect(); + + topic_token_map.insert("executorId".to_string(), client.client_id().to_string()); + + let executor_options = executor_options_builder + .request_topic_pattern("akri/connector/resources/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/setNotificationPreferenceForDeviceUpdates") + .command_name("setNotificationPreferenceForDeviceUpdates") + .is_idempotent(false) + .topic_token_map(topic_token_map) + .build() + .expect("DTDL schema generated invalid arguments"); + + Self( + rpc_command::Executor::new(application_context, client, executor_options) + .expect("DTDL schema generated invalid arguments"), + ) + } + + /// Receive the next [`SetNotificationPreferenceForDeviceUpdatesRequest`] or [`None`] if there will be no more requests + /// + /// # Errors + /// [`AIOProtocolError`] if there is a failure receiving a request + pub async fn recv( + &mut self, + ) -> Option> { + self.0.recv().await + } + + /// Shutdown the [`SetNotificationPreferenceForDeviceUpdatesCommandExecutor`]. Unsubscribes from the request topic. + /// + /// Returns Ok(()) on success, otherwise returns [`AIOProtocolError`]. + /// # Errors + /// [`AIOProtocolError`] of kind [`ClientError`](azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolErrorKind::ClientError) if the unsubscribe fails or if the unsuback reason code doesn't indicate success. + pub async fn shutdown(&mut self) -> Result<(), AIOProtocolError> { + self.0.shutdown().await + } +} diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_device_updates_command_invoker.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_device_updates_command_invoker.rs index 455edf3327..f221ade39b 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_device_updates_command_invoker.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_device_updates_command_invoker.rs @@ -13,8 +13,6 @@ use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; use azure_iot_operations_protocol::rpc_command; use super::super::common_types::options::CommandInvokerOptions; -use super::MODEL_ID; -use super::REQUEST_TOPIC_PATTERN; use super::akri_service_error::AkriServiceError; use super::set_notification_preference_for_device_updates_request_payload::SetNotificationPreferenceForDeviceUpdatesRequestPayload; use super::set_notification_preference_for_device_updates_response_payload::SetNotificationPreferenceForDeviceUpdatesResponsePayload; @@ -129,18 +127,13 @@ impl SetNotificationPreferenceForDeviceUpdatesCommandInvoker { .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("modelId".to_string(), MODEL_ID.to_string()); topic_token_map.insert( "invokerClientId".to_string(), client.client_id().to_string(), ); - topic_token_map.insert( - "commandName".to_string(), - "setNotificationPreferenceForDeviceUpdates".to_string(), - ); let invoker_options = invoker_options_builder - .request_topic_pattern(REQUEST_TOPIC_PATTERN) + .request_topic_pattern("akri/connector/resources/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/setNotificationPreferenceForDeviceUpdates") .command_name("setNotificationPreferenceForDeviceUpdates") .topic_token_map(topic_token_map) .response_topic_prefix(options.response_topic_prefix.clone()) @@ -185,10 +178,14 @@ impl SetNotificationPreferenceForDeviceUpdatesCommandInvoker { executor_id: response.executor_id, }, )) - } else if let Some(response_payload) = response.payload.response_payload { + } else { Ok(Ok(SetNotificationPreferenceForDeviceUpdatesResponse { payload: SetNotificationPreferenceForDeviceUpdatesResponsePayload { - response_payload, + response_payload: response.payload.response_payload.ok_or( + SetNotificationPreferenceForDeviceUpdatesCommandInvoker::get_err( + "responsePayload", + ), + )?, }, content_type: response.content_type, format_indicator: response.format_indicator, @@ -196,26 +193,6 @@ impl SetNotificationPreferenceForDeviceUpdatesCommandInvoker { timestamp: response.timestamp, executor_id: response.executor_id, })) - } else { - Err(AIOProtocolError { - message: Some( - "Command response has neither normal nor error payload content" - .to_string(), - ), - kind: AIOProtocolErrorKind::PayloadInvalid, - is_shallow: false, - is_remote: true, - nested_error: None, - header_name: None, - header_value: None, - timeout_name: None, - timeout_value: None, - property_name: None, - property_value: None, - command_name: Some("setNotificationPreferenceForDeviceUpdates".to_string()), - protocol_version: None, - supported_protocol_major_versions: None, - }) } } Err(err) => Err(err), @@ -230,4 +207,23 @@ impl SetNotificationPreferenceForDeviceUpdatesCommandInvoker { pub async fn shutdown(&self) -> Result<(), AIOProtocolError> { self.0.shutdown().await } + + fn get_err(field_name: &str) -> AIOProtocolError { + AIOProtocolError { + message: Some(format!("Command response missing field {field_name}")), + kind: AIOProtocolErrorKind::PayloadInvalid, + is_shallow: false, + is_remote: false, + nested_error: None, + header_name: None, + header_value: None, + timeout_name: None, + timeout_value: None, + property_name: None, + property_value: None, + command_name: Some("setNotificationPreferenceForDeviceUpdates".to_string()), + protocol_version: None, + supported_protocol_major_versions: None, + } + } } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_device_updates_request_payload.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_device_updates_request_payload.rs index 5963241384..28f4087000 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_device_updates_request_payload.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_device_updates_request_payload.rs @@ -12,9 +12,10 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; use super::notification_preference::NotificationPreference; +/// The request to set the notification preference for device updates. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct SetNotificationPreferenceForDeviceUpdatesRequestPayload { - /// The Command request argument. + /// The 'notificationPreferenceRequest' Field. #[serde(rename = "notificationPreferenceRequest")] pub notification_preference_request: NotificationPreference, } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_device_updates_response_payload.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_device_updates_response_payload.rs index 2ce68801a7..3246127150 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_device_updates_response_payload.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_device_updates_response_payload.rs @@ -11,9 +11,10 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; +/// Response containing the result of setting the notification preference for device updates or error details if the operation failed. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct SetNotificationPreferenceForDeviceUpdatesResponsePayload { - /// The Command response argument. + /// The response payload indicating that the operation was successful. #[serde(rename = "responsePayload")] pub response_payload: String, } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_device_updates_response_schema.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_device_updates_response_schema.rs index 9594edeb3b..407e814b59 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_device_updates_response_schema.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/set_notification_preference_for_device_updates_response_schema.rs @@ -12,6 +12,7 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; use super::akri_service_error::AkriServiceError; +/// Response containing the result of setting the notification preference for device updates or error details if the operation failed. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct SetNotificationPreferenceForDeviceUpdatesResponseSchema { /// The response payload indicating that the operation was successful. @@ -20,7 +21,7 @@ pub struct SetNotificationPreferenceForDeviceUpdatesResponseSchema { #[builder(default = "None")] pub response_payload: Option, - /// Error details, if setting the notification preference for device updates failed. + /// Read error for the 'setNotificationPreferenceForDeviceUpdates' Action. #[serde(rename = "setNotificationPreferenceForDeviceUpdatesError")] #[serde(skip_serializing_if = "Option::is_none")] #[builder(default = "None")] diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/trust_settings_schema.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/trust_settings_schema.rs index e74f3289f9..21a8fb7ff0 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/trust_settings_schema.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/trust_settings_schema.rs @@ -11,6 +11,7 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; +/// Defines server trust settings for the endpoint. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct TrustSettingsSchema { /// Secret reference to certificates list to trust. diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_asset_status_command_executor.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_asset_status_command_executor.rs new file mode 100644 index 0000000000..8e11ac9a73 --- /dev/null +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_asset_status_command_executor.rs @@ -0,0 +1,143 @@ +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v0.10.0.0; DO NOT EDIT. */ + +use std::collections::HashMap; + +use azure_iot_operations_mqtt::session::SessionManagedClient; +use azure_iot_operations_protocol::application::ApplicationContext; +use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; +use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; +use azure_iot_operations_protocol::rpc_command; + +use super::super::common_types::options::CommandExecutorOptions; +use super::akri_service_error::AkriServiceError; +use super::update_asset_status_request_payload::UpdateAssetStatusRequestPayload; +use super::update_asset_status_response_payload::UpdateAssetStatusResponsePayload; +use super::update_asset_status_response_schema::UpdateAssetStatusResponseSchema; + +pub type UpdateAssetStatusRequest = rpc_command::executor::Request< + UpdateAssetStatusRequestPayload, + UpdateAssetStatusResponseSchema, +>; +pub type UpdateAssetStatusResponse = + rpc_command::executor::Response; +pub type UpdateAssetStatusResponseBuilderError = rpc_command::executor::ResponseBuilderError; + +/// Builder for [`UpdateAssetStatusResponse`] +#[derive(Default)] +pub struct UpdateAssetStatusResponseBuilder { + inner_builder: rpc_command::executor::ResponseBuilder, +} + +impl UpdateAssetStatusResponseBuilder { + /// Custom user data to set on the response + pub fn custom_user_data(&mut self, custom_user_data: Vec<(String, String)>) -> &mut Self { + self.inner_builder.custom_user_data(custom_user_data); + self + } + + /// Cloud event for the response + pub fn cloud_event( + &mut self, + cloud_event: Option, + ) -> &mut Self { + self.inner_builder.cloud_event(cloud_event); + self + } + + /// Payload of the response + /// + /// # Errors + /// If the payload cannot be serialized + pub fn payload( + &mut self, + payload: UpdateAssetStatusResponsePayload, + ) -> Result<&mut Self, AIOProtocolError> { + self.inner_builder + .payload(UpdateAssetStatusResponseSchema { + updated_asset_status: Some(payload.updated_asset_status), + update_asset_status_error: None, + })?; + Ok(self) + } + + pub fn error(&mut self, error: AkriServiceError) -> Result<&mut Self, AIOProtocolError> { + self.inner_builder + .payload(UpdateAssetStatusResponseSchema { + updated_asset_status: None, + update_asset_status_error: Some(error), + })?; + Ok(self) + } + + /// Builds a new `UpdateAssetStatusResponse` + /// + /// # Errors + /// If a required field has not been initialized + #[allow(clippy::missing_panics_doc)] // The panic is not possible + pub fn build( + &mut self, + ) -> Result { + self.inner_builder.build() + } +} + +/// Command Executor for `updateAssetStatus` +pub struct UpdateAssetStatusCommandExecutor( + rpc_command::Executor, +); + +impl UpdateAssetStatusCommandExecutor { + /// Creates a new [`UpdateAssetStatusCommandExecutor`] + /// + /// # Panics + /// If the DTDL that generated this code was invalid + pub fn new( + application_context: ApplicationContext, + client: SessionManagedClient, + options: &CommandExecutorOptions, + ) -> Self { + let mut executor_options_builder = rpc_command::executor::OptionsBuilder::default(); + if let Some(topic_namespace) = &options.topic_namespace { + executor_options_builder.topic_namespace(topic_namespace.clone()); + } + + let mut topic_token_map: HashMap = options + .topic_token_map + .clone() + .into_iter() + .map(|(k, v)| (format!("ex:{k}"), v)) + .collect(); + + topic_token_map.insert("executorId".to_string(), client.client_id().to_string()); + + let executor_options = executor_options_builder + .request_topic_pattern("akri/connector/resources/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/updateAssetStatus") + .command_name("updateAssetStatus") + .is_idempotent(false) + .topic_token_map(topic_token_map) + .build() + .expect("DTDL schema generated invalid arguments"); + + Self( + rpc_command::Executor::new(application_context, client, executor_options) + .expect("DTDL schema generated invalid arguments"), + ) + } + + /// Receive the next [`UpdateAssetStatusRequest`] or [`None`] if there will be no more requests + /// + /// # Errors + /// [`AIOProtocolError`] if there is a failure receiving a request + pub async fn recv(&mut self) -> Option> { + self.0.recv().await + } + + /// Shutdown the [`UpdateAssetStatusCommandExecutor`]. Unsubscribes from the request topic. + /// + /// Returns Ok(()) on success, otherwise returns [`AIOProtocolError`]. + /// # Errors + /// [`AIOProtocolError`] of kind [`ClientError`](azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolErrorKind::ClientError) if the unsubscribe fails or if the unsuback reason code doesn't indicate success. + pub async fn shutdown(&mut self) -> Result<(), AIOProtocolError> { + self.0.shutdown().await + } +} diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_asset_status_command_invoker.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_asset_status_command_invoker.rs index 59c562ee45..8a7a9e46dd 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_asset_status_command_invoker.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_asset_status_command_invoker.rs @@ -13,8 +13,6 @@ use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; use azure_iot_operations_protocol::rpc_command; use super::super::common_types::options::CommandInvokerOptions; -use super::MODEL_ID; -use super::REQUEST_TOPIC_PATTERN; use super::akri_service_error::AkriServiceError; use super::update_asset_status_request_payload::UpdateAssetStatusRequestPayload; use super::update_asset_status_response_payload::UpdateAssetStatusResponsePayload; @@ -118,15 +116,13 @@ impl UpdateAssetStatusCommandInvoker { .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("modelId".to_string(), MODEL_ID.to_string()); topic_token_map.insert( "invokerClientId".to_string(), client.client_id().to_string(), ); - topic_token_map.insert("commandName".to_string(), "updateAssetStatus".to_string()); let invoker_options = invoker_options_builder - .request_topic_pattern(REQUEST_TOPIC_PATTERN) + .request_topic_pattern("akri/connector/resources/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/updateAssetStatus") .command_name("updateAssetStatus") .topic_token_map(topic_token_map) .response_topic_prefix(options.response_topic_prefix.clone()) @@ -162,10 +158,12 @@ impl UpdateAssetStatusCommandInvoker { timestamp: response.timestamp, executor_id: response.executor_id, })) - } else if let Some(updated_asset_status) = response.payload.updated_asset_status { + } else { Ok(Ok(UpdateAssetStatusResponse { payload: UpdateAssetStatusResponsePayload { - updated_asset_status, + updated_asset_status: response.payload.updated_asset_status.ok_or( + UpdateAssetStatusCommandInvoker::get_err("updatedAssetStatus"), + )?, }, content_type: response.content_type, format_indicator: response.format_indicator, @@ -173,26 +171,6 @@ impl UpdateAssetStatusCommandInvoker { timestamp: response.timestamp, executor_id: response.executor_id, })) - } else { - Err(AIOProtocolError { - message: Some( - "Command response has neither normal nor error payload content" - .to_string(), - ), - kind: AIOProtocolErrorKind::PayloadInvalid, - is_shallow: false, - is_remote: true, - nested_error: None, - header_name: None, - header_value: None, - timeout_name: None, - timeout_value: None, - property_name: None, - property_value: None, - command_name: Some("updateAssetStatus".to_string()), - protocol_version: None, - supported_protocol_major_versions: None, - }) } } Err(err) => Err(err), @@ -207,4 +185,23 @@ impl UpdateAssetStatusCommandInvoker { pub async fn shutdown(&self) -> Result<(), AIOProtocolError> { self.0.shutdown().await } + + fn get_err(field_name: &str) -> AIOProtocolError { + AIOProtocolError { + message: Some(format!("Command response missing field {field_name}")), + kind: AIOProtocolErrorKind::PayloadInvalid, + is_shallow: false, + is_remote: false, + nested_error: None, + header_name: None, + header_value: None, + timeout_name: None, + timeout_value: None, + property_name: None, + property_value: None, + command_name: Some("updateAssetStatus".to_string()), + protocol_version: None, + supported_protocol_major_versions: None, + } + } } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_asset_status_request_payload.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_asset_status_request_payload.rs index 636c155372..3a6dcf7fba 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_asset_status_request_payload.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_asset_status_request_payload.rs @@ -12,9 +12,10 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; use super::update_asset_status_request_schema::UpdateAssetStatusRequestSchema; +/// The asset status update request. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct UpdateAssetStatusRequestPayload { - /// The Command request argument. + /// The 'assetStatusUpdate' Field. #[serde(rename = "assetStatusUpdate")] pub asset_status_update: UpdateAssetStatusRequestSchema, } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_asset_status_response_payload.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_asset_status_response_payload.rs index c5555a41e9..aa82db77f1 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_asset_status_response_payload.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_asset_status_response_payload.rs @@ -12,9 +12,10 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; use super::asset_status::AssetStatus; +/// Response containing the updated asset status or error details if the update failed. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct UpdateAssetStatusResponsePayload { - /// The Command response argument. + /// The updated asset status. #[serde(rename = "updatedAssetStatus")] pub updated_asset_status: AssetStatus, } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_asset_status_response_schema.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_asset_status_response_schema.rs index c741ce9065..cff149f2a8 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_asset_status_response_schema.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_asset_status_response_schema.rs @@ -13,9 +13,10 @@ use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, use super::akri_service_error::AkriServiceError; use super::asset_status::AssetStatus; +/// Response containing the updated asset status or error details if the update failed. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct UpdateAssetStatusResponseSchema { - /// Error details, if the asset status update failed. + /// Read error for the 'updateAssetStatus' Action. #[serde(rename = "updateAssetStatusError")] #[serde(skip_serializing_if = "Option::is_none")] #[builder(default = "None")] diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_device_status_command_executor.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_device_status_command_executor.rs new file mode 100644 index 0000000000..af5993b853 --- /dev/null +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_device_status_command_executor.rs @@ -0,0 +1,143 @@ +/* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v0.10.0.0; DO NOT EDIT. */ + +use std::collections::HashMap; + +use azure_iot_operations_mqtt::session::SessionManagedClient; +use azure_iot_operations_protocol::application::ApplicationContext; +use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; +use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; +use azure_iot_operations_protocol::rpc_command; + +use super::super::common_types::options::CommandExecutorOptions; +use super::akri_service_error::AkriServiceError; +use super::update_device_status_request_payload::UpdateDeviceStatusRequestPayload; +use super::update_device_status_response_payload::UpdateDeviceStatusResponsePayload; +use super::update_device_status_response_schema::UpdateDeviceStatusResponseSchema; + +pub type UpdateDeviceStatusRequest = rpc_command::executor::Request< + UpdateDeviceStatusRequestPayload, + UpdateDeviceStatusResponseSchema, +>; +pub type UpdateDeviceStatusResponse = + rpc_command::executor::Response; +pub type UpdateDeviceStatusResponseBuilderError = rpc_command::executor::ResponseBuilderError; + +/// Builder for [`UpdateDeviceStatusResponse`] +#[derive(Default)] +pub struct UpdateDeviceStatusResponseBuilder { + inner_builder: rpc_command::executor::ResponseBuilder, +} + +impl UpdateDeviceStatusResponseBuilder { + /// Custom user data to set on the response + pub fn custom_user_data(&mut self, custom_user_data: Vec<(String, String)>) -> &mut Self { + self.inner_builder.custom_user_data(custom_user_data); + self + } + + /// Cloud event for the response + pub fn cloud_event( + &mut self, + cloud_event: Option, + ) -> &mut Self { + self.inner_builder.cloud_event(cloud_event); + self + } + + /// Payload of the response + /// + /// # Errors + /// If the payload cannot be serialized + pub fn payload( + &mut self, + payload: UpdateDeviceStatusResponsePayload, + ) -> Result<&mut Self, AIOProtocolError> { + self.inner_builder + .payload(UpdateDeviceStatusResponseSchema { + updated_device_status: Some(payload.updated_device_status), + update_device_status_error: None, + })?; + Ok(self) + } + + pub fn error(&mut self, error: AkriServiceError) -> Result<&mut Self, AIOProtocolError> { + self.inner_builder + .payload(UpdateDeviceStatusResponseSchema { + updated_device_status: None, + update_device_status_error: Some(error), + })?; + Ok(self) + } + + /// Builds a new `UpdateDeviceStatusResponse` + /// + /// # Errors + /// If a required field has not been initialized + #[allow(clippy::missing_panics_doc)] // The panic is not possible + pub fn build( + &mut self, + ) -> Result { + self.inner_builder.build() + } +} + +/// Command Executor for `updateDeviceStatus` +pub struct UpdateDeviceStatusCommandExecutor( + rpc_command::Executor, +); + +impl UpdateDeviceStatusCommandExecutor { + /// Creates a new [`UpdateDeviceStatusCommandExecutor`] + /// + /// # Panics + /// If the DTDL that generated this code was invalid + pub fn new( + application_context: ApplicationContext, + client: SessionManagedClient, + options: &CommandExecutorOptions, + ) -> Self { + let mut executor_options_builder = rpc_command::executor::OptionsBuilder::default(); + if let Some(topic_namespace) = &options.topic_namespace { + executor_options_builder.topic_namespace(topic_namespace.clone()); + } + + let mut topic_token_map: HashMap = options + .topic_token_map + .clone() + .into_iter() + .map(|(k, v)| (format!("ex:{k}"), v)) + .collect(); + + topic_token_map.insert("executorId".to_string(), client.client_id().to_string()); + + let executor_options = executor_options_builder + .request_topic_pattern("akri/connector/resources/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/updateDeviceStatus") + .command_name("updateDeviceStatus") + .is_idempotent(false) + .topic_token_map(topic_token_map) + .build() + .expect("DTDL schema generated invalid arguments"); + + Self( + rpc_command::Executor::new(application_context, client, executor_options) + .expect("DTDL schema generated invalid arguments"), + ) + } + + /// Receive the next [`UpdateDeviceStatusRequest`] or [`None`] if there will be no more requests + /// + /// # Errors + /// [`AIOProtocolError`] if there is a failure receiving a request + pub async fn recv(&mut self) -> Option> { + self.0.recv().await + } + + /// Shutdown the [`UpdateDeviceStatusCommandExecutor`]. Unsubscribes from the request topic. + /// + /// Returns Ok(()) on success, otherwise returns [`AIOProtocolError`]. + /// # Errors + /// [`AIOProtocolError`] of kind [`ClientError`](azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolErrorKind::ClientError) if the unsubscribe fails or if the unsuback reason code doesn't indicate success. + pub async fn shutdown(&mut self) -> Result<(), AIOProtocolError> { + self.0.shutdown().await + } +} diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_device_status_command_invoker.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_device_status_command_invoker.rs index 45f973e8f8..af0e946f60 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_device_status_command_invoker.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_device_status_command_invoker.rs @@ -13,8 +13,6 @@ use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; use azure_iot_operations_protocol::rpc_command; use super::super::common_types::options::CommandInvokerOptions; -use super::MODEL_ID; -use super::REQUEST_TOPIC_PATTERN; use super::akri_service_error::AkriServiceError; use super::update_device_status_request_payload::UpdateDeviceStatusRequestPayload; use super::update_device_status_response_payload::UpdateDeviceStatusResponsePayload; @@ -119,15 +117,13 @@ impl UpdateDeviceStatusCommandInvoker { .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("modelId".to_string(), MODEL_ID.to_string()); topic_token_map.insert( "invokerClientId".to_string(), client.client_id().to_string(), ); - topic_token_map.insert("commandName".to_string(), "updateDeviceStatus".to_string()); let invoker_options = invoker_options_builder - .request_topic_pattern(REQUEST_TOPIC_PATTERN) + .request_topic_pattern("akri/connector/resources/{ex:connectorClientId}/{ex:deviceName}/{ex:inboundEndpointName}/updateDeviceStatus") .command_name("updateDeviceStatus") .topic_token_map(topic_token_map) .response_topic_prefix(options.response_topic_prefix.clone()) @@ -164,10 +160,12 @@ impl UpdateDeviceStatusCommandInvoker { timestamp: response.timestamp, executor_id: response.executor_id, })) - } else if let Some(updated_device_status) = response.payload.updated_device_status { + } else { Ok(Ok(UpdateDeviceStatusResponse { payload: UpdateDeviceStatusResponsePayload { - updated_device_status, + updated_device_status: response.payload.updated_device_status.ok_or( + UpdateDeviceStatusCommandInvoker::get_err("updatedDeviceStatus"), + )?, }, content_type: response.content_type, format_indicator: response.format_indicator, @@ -175,26 +173,6 @@ impl UpdateDeviceStatusCommandInvoker { timestamp: response.timestamp, executor_id: response.executor_id, })) - } else { - Err(AIOProtocolError { - message: Some( - "Command response has neither normal nor error payload content" - .to_string(), - ), - kind: AIOProtocolErrorKind::PayloadInvalid, - is_shallow: false, - is_remote: true, - nested_error: None, - header_name: None, - header_value: None, - timeout_name: None, - timeout_value: None, - property_name: None, - property_value: None, - command_name: Some("updateDeviceStatus".to_string()), - protocol_version: None, - supported_protocol_major_versions: None, - }) } } Err(err) => Err(err), @@ -209,4 +187,23 @@ impl UpdateDeviceStatusCommandInvoker { pub async fn shutdown(&self) -> Result<(), AIOProtocolError> { self.0.shutdown().await } + + fn get_err(field_name: &str) -> AIOProtocolError { + AIOProtocolError { + message: Some(format!("Command response missing field {field_name}")), + kind: AIOProtocolErrorKind::PayloadInvalid, + is_shallow: false, + is_remote: false, + nested_error: None, + header_name: None, + header_value: None, + timeout_name: None, + timeout_value: None, + property_name: None, + property_value: None, + command_name: Some("updateDeviceStatus".to_string()), + protocol_version: None, + supported_protocol_major_versions: None, + } + } } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_device_status_request_payload.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_device_status_request_payload.rs index 0c5d5c32fa..b9926c2587 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_device_status_request_payload.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_device_status_request_payload.rs @@ -12,9 +12,10 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; use super::device_status::DeviceStatus; +/// The device status to update. Fields omitted in the request will be removed. The specified inbound endpoint status will be added or updated in the inbound endpoints map. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct UpdateDeviceStatusRequestPayload { - /// The Command request argument. + /// The 'deviceStatusUpdate' Field. #[serde(rename = "deviceStatusUpdate")] pub device_status_update: DeviceStatus, } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_device_status_response_payload.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_device_status_response_payload.rs index 08e623d83d..06c97ec704 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_device_status_response_payload.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_device_status_response_payload.rs @@ -12,9 +12,10 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; use super::device_status::DeviceStatus; +/// Response containing the updated device status or error details if the update failed. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct UpdateDeviceStatusResponsePayload { - /// The Command response argument. + /// The updated device status containing the specific inbound endpoint status as specified by the request. #[serde(rename = "updatedDeviceStatus")] pub updated_device_status: DeviceStatus, } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_device_status_response_schema.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_device_status_response_schema.rs index ade637e55c..01e827c7e8 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_device_status_response_schema.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/update_device_status_response_schema.rs @@ -13,6 +13,7 @@ use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, use super::akri_service_error::AkriServiceError; use super::device_status::DeviceStatus; +/// Response containing the updated device status or error details if the update failed. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct UpdateDeviceStatusResponseSchema { /// The updated device status containing the specific inbound endpoint status as specified by the request. @@ -21,7 +22,7 @@ pub struct UpdateDeviceStatusResponseSchema { #[builder(default = "None")] pub updated_device_status: Option, - /// Error details, if the device status update failed. + /// Read error for the 'updateDeviceStatus' Action. #[serde(rename = "updateDeviceStatusError")] #[serde(skip_serializing_if = "Option::is_none")] #[builder(default = "None")] diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/username_password_credentials_schema.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/username_password_credentials_schema.rs index efc7d0da6f..138bcefb1e 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/username_password_credentials_schema.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/username_password_credentials_schema.rs @@ -11,6 +11,7 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; +/// The credentials for authentication mode UsernamePassword. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct UsernamePasswordCredentialsSchema { /// The name of the secret containing the password. diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/x509credentials_schema.rs b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/x509credentials_schema.rs index 5d287fde69..9c0a288588 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/x509credentials_schema.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/adr_base_gen/adr_base_service/x509credentials_schema.rs @@ -11,6 +11,7 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; +/// The x509 certificate for authentication mode Certificate. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct X509credentialsSchema { /// The name of the secret containing the certificate and private key (e.g. stored as .der/.pem or .der/.pfx). diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service.rs b/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service.rs index 6979b72e07..c2ba7b63ea 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service.rs @@ -23,10 +23,6 @@ pub use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolEr pub use super::common_types::options::{CommandInvokerOptions, TelemetryReceiverOptions}; -pub const MODEL_ID: &str = "dtmi:com:microsoft:akri:DeviceDiscoveryService;1"; -pub const REQUEST_TOPIC_PATTERN: &str = - "akri/discovery/resources/{ex:discoveryClientId}/{ex:inboundEndpointType}/{commandName}"; - pub mod client { pub use super::akri_service_error::*; pub use super::akri_service_error_error::*; diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/code_schema.rs b/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/code_schema.rs index 36143884f6..26ce660204 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/code_schema.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/code_schema.rs @@ -2,16 +2,12 @@ use serde::{Deserialize, Serialize}; +/// The error code that identifies the error. #[derive(Serialize, Deserialize, Debug, Clone)] pub enum CodeSchema { - #[serde(rename = "BadRequest")] BadRequest, - #[serde(rename = "InternalError")] InternalError, - #[serde(rename = "KubeError")] KubeError, - #[serde(rename = "SerializationError")] SerializationError, - #[serde(rename = "Unauthorized")] Unauthorized, } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/create_or_update_discovered_device_command_invoker.rs b/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/create_or_update_discovered_device_command_invoker.rs index 23b72265a5..56ffe6e2d9 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/create_or_update_discovered_device_command_invoker.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/create_or_update_discovered_device_command_invoker.rs @@ -13,8 +13,6 @@ use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; use azure_iot_operations_protocol::rpc_command; use super::super::common_types::options::CommandInvokerOptions; -use super::MODEL_ID; -use super::REQUEST_TOPIC_PATTERN; use super::akri_service_error::AkriServiceError; use super::create_or_update_discovered_device_request_payload::CreateOrUpdateDiscoveredDeviceRequestPayload; use super::create_or_update_discovered_device_response_payload::CreateOrUpdateDiscoveredDeviceResponsePayload; @@ -128,18 +126,13 @@ impl CreateOrUpdateDiscoveredDeviceCommandInvoker { .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("modelId".to_string(), MODEL_ID.to_string()); topic_token_map.insert( "invokerClientId".to_string(), client.client_id().to_string(), ); - topic_token_map.insert( - "commandName".to_string(), - "createOrUpdateDiscoveredDevice".to_string(), - ); let invoker_options = invoker_options_builder - .request_topic_pattern(REQUEST_TOPIC_PATTERN) + .request_topic_pattern("akri/discovery/resources/{ex:discoveryClientId}/{ex:inboundEndpointType}/createOrUpdateDiscoveredDevice") .command_name("createOrUpdateDiscoveredDevice") .topic_token_map(topic_token_map) .response_topic_prefix(options.response_topic_prefix.clone()) @@ -178,12 +171,15 @@ impl CreateOrUpdateDiscoveredDeviceCommandInvoker { timestamp: response.timestamp, executor_id: response.executor_id, })) - } else if let Some(discovered_device_response) = - response.payload.discovered_device_response - { + } else { Ok(Ok(CreateOrUpdateDiscoveredDeviceResponse { payload: CreateOrUpdateDiscoveredDeviceResponsePayload { - discovered_device_response, + discovered_device_response: response + .payload + .discovered_device_response + .ok_or(CreateOrUpdateDiscoveredDeviceCommandInvoker::get_err( + "discoveredDeviceResponse", + ))?, }, content_type: response.content_type, format_indicator: response.format_indicator, @@ -191,26 +187,6 @@ impl CreateOrUpdateDiscoveredDeviceCommandInvoker { timestamp: response.timestamp, executor_id: response.executor_id, })) - } else { - Err(AIOProtocolError { - message: Some( - "Command response has neither normal nor error payload content" - .to_string(), - ), - kind: AIOProtocolErrorKind::PayloadInvalid, - is_shallow: false, - is_remote: true, - nested_error: None, - header_name: None, - header_value: None, - timeout_name: None, - timeout_value: None, - property_name: None, - property_value: None, - command_name: Some("createOrUpdateDiscoveredDevice".to_string()), - protocol_version: None, - supported_protocol_major_versions: None, - }) } } Err(err) => Err(err), @@ -225,4 +201,23 @@ impl CreateOrUpdateDiscoveredDeviceCommandInvoker { pub async fn shutdown(&self) -> Result<(), AIOProtocolError> { self.0.shutdown().await } + + fn get_err(field_name: &str) -> AIOProtocolError { + AIOProtocolError { + message: Some(format!("Command response missing field {field_name}")), + kind: AIOProtocolErrorKind::PayloadInvalid, + is_shallow: false, + is_remote: false, + nested_error: None, + header_name: None, + header_value: None, + timeout_name: None, + timeout_value: None, + property_name: None, + property_value: None, + command_name: Some("createOrUpdateDiscoveredDevice".to_string()), + protocol_version: None, + supported_protocol_major_versions: None, + } + } } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/create_or_update_discovered_device_request_payload.rs b/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/create_or_update_discovered_device_request_payload.rs index 2dda6e69d0..095cea4639 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/create_or_update_discovered_device_request_payload.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/create_or_update_discovered_device_request_payload.rs @@ -12,9 +12,10 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; use super::create_or_update_discovered_device_request_schema::CreateOrUpdateDiscoveredDeviceRequestSchema; +/// The request to create or update a discovered device. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct CreateOrUpdateDiscoveredDeviceRequestPayload { - /// The Command request argument. + /// The 'discoveredDeviceRequest' Field. #[serde(rename = "discoveredDeviceRequest")] pub discovered_device_request: CreateOrUpdateDiscoveredDeviceRequestSchema, } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/create_or_update_discovered_device_response_payload.rs b/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/create_or_update_discovered_device_response_payload.rs index f67b7843d7..e8751a880a 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/create_or_update_discovered_device_response_payload.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/create_or_update_discovered_device_response_payload.rs @@ -12,9 +12,10 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; use super::discovered_device_response_schema::DiscoveredDeviceResponseSchema; +/// Response containing the discovered device response or error details if the operation failed. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct CreateOrUpdateDiscoveredDeviceResponsePayload { - /// The Command response argument. + /// The discovered device response. #[serde(rename = "discoveredDeviceResponse")] pub discovered_device_response: DiscoveredDeviceResponseSchema, } diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/create_or_update_discovered_device_response_schema.rs b/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/create_or_update_discovered_device_response_schema.rs index 704a514448..87eee2e430 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/create_or_update_discovered_device_response_schema.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/create_or_update_discovered_device_response_schema.rs @@ -13,9 +13,10 @@ use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, use super::akri_service_error::AkriServiceError; use super::discovered_device_response_schema::DiscoveredDeviceResponseSchema; +/// Response containing the discovered device response or error details if the operation failed. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct CreateOrUpdateDiscoveredDeviceResponseSchema { - /// Error details, if the discovered device creation or update failed. + /// Read error for the 'createOrUpdateDiscoveredDevice' Action. #[serde(rename = "createOrUpdateDiscoveredDeviceError")] #[serde(skip_serializing_if = "Option::is_none")] #[builder(default = "None")] diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/discovered_device.rs b/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/discovered_device.rs index 2bdea2665d..d2fdf5d393 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/discovered_device.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/discovered_device.rs @@ -12,6 +12,7 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; use super::discovered_device_endpoints::DiscoveredDeviceEndpoints; +/// The discovered device resource to create or update. Fields omitted in the request will be removed. The specified inbound endpoint will be added or updated in the inbound endpoints map. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct DiscoveredDevice { /// A set of key-value pairs that contain custom attributes set by the customer. diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/discovered_device_endpoints.rs b/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/discovered_device_endpoints.rs index 2f0b831817..3fd0c5e3cd 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/discovered_device_endpoints.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/discovered_device_endpoints.rs @@ -13,6 +13,7 @@ use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, use super::discovered_device_inbound_endpoint_schema::DiscoveredDeviceInboundEndpointSchema; use super::discovered_device_outbound_endpoints_schema::DiscoveredDeviceOutboundEndpointsSchema; +/// Connection endpoint URL a device can use to connect to a service. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct DiscoveredDeviceEndpoints { /// Set of endpoints to connect to the device. diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/discovered_device_outbound_endpoints_schema.rs b/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/discovered_device_outbound_endpoints_schema.rs index 4209066a8a..7cc7f4b338 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/discovered_device_outbound_endpoints_schema.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/discovered_device_outbound_endpoints_schema.rs @@ -12,6 +12,7 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; use super::device_outbound_endpoint::DeviceOutboundEndpoint; +/// Property bag contains the device's outbound endpoints #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct DiscoveredDeviceOutboundEndpointsSchema { /// Endpoints the device can connect to. diff --git a/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/discovered_device_response_schema.rs b/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/discovered_device_response_schema.rs index 31d70dd8db..ab60151d2a 100644 --- a/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/discovered_device_response_schema.rs +++ b/rust/azure_iot_operations_services/src/azure_device_registry/device_discovery_gen/device_discovery_service/discovered_device_response_schema.rs @@ -11,6 +11,7 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; +/// The discovered device response. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct DiscoveredDeviceResponseSchema { /// The unique identifier for the discovered device. diff --git a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry.rs b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry.rs index 62a4a8673c..78a1eb4a54 100644 --- a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry.rs +++ b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry.rs @@ -28,10 +28,6 @@ pub use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolEr pub use super::common_types::options::{CommandInvokerOptions, TelemetryReceiverOptions}; -pub const MODEL_ID: &str = "dtmi:ms:adr:SchemaRegistry;2"; -pub const REQUEST_TOPIC_PATTERN: &str = "adr/{modelId}/{commandName}"; -pub const COMMAND_SERVICE_GROUP_ID: &str = "schema-registry-edge"; - pub mod client { pub use super::format::*; pub use super::get_command_invoker::*; diff --git a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/format.rs b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/format.rs index ce3a098c9d..2b183454a4 100644 --- a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/format.rs +++ b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/format.rs @@ -1,12 +1,9 @@ /* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v0.10.0.0; DO NOT EDIT. */ -use serde::{Deserialize, Serialize}; +// Supported schema formats -/// Supported schema formats -#[derive(Serialize, Deserialize, Debug, Clone)] -pub enum Format { - #[serde(rename = "Delta/1.0")] - Delta1, - #[serde(rename = "JsonSchema/draft-07")] - JsonSchemaDraft07, -} +/// JSON Schema Draft-07 format +pub const JSON_SCHEMA_DRAFT07: &str = "JsonSchema/draft-07"; + +/// Delta-Parquet format +pub const DELTA1: &str = "Delta/1.0"; diff --git a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/get_command_invoker.rs b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/get_command_invoker.rs index 480ccae9cd..19f05e8b84 100644 --- a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/get_command_invoker.rs +++ b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/get_command_invoker.rs @@ -13,8 +13,6 @@ use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; use azure_iot_operations_protocol::rpc_command; use super::super::common_types::options::CommandInvokerOptions; -use super::MODEL_ID; -use super::REQUEST_TOPIC_PATTERN; use super::get_request_schema::GetRequestSchema; use super::get_response_payload::GetResponsePayload; use super::get_response_schema::GetResponseSchema; @@ -110,15 +108,13 @@ impl GetCommandInvoker { .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("modelId".to_string(), MODEL_ID.to_string()); topic_token_map.insert( "invokerClientId".to_string(), client.client_id().to_string(), ); - topic_token_map.insert("commandName".to_string(), "get".to_string()); let invoker_options = invoker_options_builder - .request_topic_pattern(REQUEST_TOPIC_PATTERN) + .request_topic_pattern("adr/dtmi:ms:adr:SchemaRegistry;2/get") .command_name("get") .topic_token_map(topic_token_map) .response_topic_prefix(options.response_topic_prefix.clone()) @@ -143,44 +139,29 @@ impl GetCommandInvoker { let response = self.0.invoke(request).await; match response { Ok(response) => { - if let Some(error) = response.payload.error { + if let Some(get_error) = response.payload.get_error { Ok(Err(GetResponseError { - payload: error, + payload: get_error, content_type: response.content_type, format_indicator: response.format_indicator, custom_user_data: response.custom_user_data, timestamp: response.timestamp, executor_id: response.executor_id, })) - } else if let Some(schema) = response.payload.schema { + } else { Ok(Ok(GetResponse { - payload: GetResponsePayload { schema }, + payload: GetResponsePayload { + schema: response + .payload + .schema + .ok_or(GetCommandInvoker::get_err("schema"))?, + }, content_type: response.content_type, format_indicator: response.format_indicator, custom_user_data: response.custom_user_data, timestamp: response.timestamp, executor_id: response.executor_id, })) - } else { - Err(AIOProtocolError { - message: Some( - "Command response has neither normal nor error payload content" - .to_string(), - ), - kind: AIOProtocolErrorKind::PayloadInvalid, - is_shallow: false, - is_remote: true, - nested_error: None, - header_name: None, - header_value: None, - timeout_name: None, - timeout_value: None, - property_name: None, - property_value: None, - command_name: Some("get".to_string()), - protocol_version: None, - supported_protocol_major_versions: None, - }) } } Err(err) => Err(err), @@ -195,4 +176,23 @@ impl GetCommandInvoker { pub async fn shutdown(&self) -> Result<(), AIOProtocolError> { self.0.shutdown().await } + + fn get_err(field_name: &str) -> AIOProtocolError { + AIOProtocolError { + message: Some(format!("Command response missing field {field_name}")), + kind: AIOProtocolErrorKind::PayloadInvalid, + is_shallow: false, + is_remote: false, + nested_error: None, + header_name: None, + header_value: None, + timeout_name: None, + timeout_value: None, + property_name: None, + property_value: None, + command_name: Some("get".to_string()), + protocol_version: None, + supported_protocol_major_versions: None, + } + } } diff --git a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/get_request_schema.rs b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/get_request_schema.rs index 5c571dc816..92c8bac0c5 100644 --- a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/get_request_schema.rs +++ b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/get_request_schema.rs @@ -11,6 +11,7 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; +/// GET Schema request object #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct GetRequestSchema { /// Schema name. diff --git a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/get_response_payload.rs b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/get_response_payload.rs index 80ef017ed7..ccdec915d0 100644 --- a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/get_response_payload.rs +++ b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/get_response_payload.rs @@ -12,8 +12,9 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; use super::schema::Schema; +/// GET Schema response object #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct GetResponsePayload { - /// The Command response argument. + /// The requested schema object. pub schema: Schema, } diff --git a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/get_response_schema.rs b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/get_response_schema.rs index 72b61b6fa0..0a7d45962f 100644 --- a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/get_response_schema.rs +++ b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/get_response_schema.rs @@ -13,12 +13,14 @@ use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, use super::schema::Schema; use super::schema_registry_error::SchemaRegistryError; +/// GET Schema response object #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct GetResponseSchema { - /// Error object in case of failure. + /// Read error for the 'get' Action. + #[serde(rename = "getError")] #[serde(skip_serializing_if = "Option::is_none")] #[builder(default = "None")] - pub error: Option, + pub get_error: Option, /// The requested schema object. #[serde(skip_serializing_if = "Option::is_none")] diff --git a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/put_command_invoker.rs b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/put_command_invoker.rs index 70eac4c40e..ba6feaff5c 100644 --- a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/put_command_invoker.rs +++ b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/put_command_invoker.rs @@ -13,8 +13,6 @@ use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; use azure_iot_operations_protocol::rpc_command; use super::super::common_types::options::CommandInvokerOptions; -use super::MODEL_ID; -use super::REQUEST_TOPIC_PATTERN; use super::put_request_schema::PutRequestSchema; use super::put_response_payload::PutResponsePayload; use super::put_response_schema::PutResponseSchema; @@ -110,15 +108,13 @@ impl PutCommandInvoker { .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("modelId".to_string(), MODEL_ID.to_string()); topic_token_map.insert( "invokerClientId".to_string(), client.client_id().to_string(), ); - topic_token_map.insert("commandName".to_string(), "put".to_string()); let invoker_options = invoker_options_builder - .request_topic_pattern(REQUEST_TOPIC_PATTERN) + .request_topic_pattern("adr/dtmi:ms:adr:SchemaRegistry;2/put") .command_name("put") .topic_token_map(topic_token_map) .response_topic_prefix(options.response_topic_prefix.clone()) @@ -143,44 +139,29 @@ impl PutCommandInvoker { let response = self.0.invoke(request).await; match response { Ok(response) => { - if let Some(error) = response.payload.error { + if let Some(put_error) = response.payload.put_error { Ok(Err(PutResponseError { - payload: error, + payload: put_error, content_type: response.content_type, format_indicator: response.format_indicator, custom_user_data: response.custom_user_data, timestamp: response.timestamp, executor_id: response.executor_id, })) - } else if let Some(schema) = response.payload.schema { + } else { Ok(Ok(PutResponse { - payload: PutResponsePayload { schema }, + payload: PutResponsePayload { + schema: response + .payload + .schema + .ok_or(PutCommandInvoker::get_err("schema"))?, + }, content_type: response.content_type, format_indicator: response.format_indicator, custom_user_data: response.custom_user_data, timestamp: response.timestamp, executor_id: response.executor_id, })) - } else { - Err(AIOProtocolError { - message: Some( - "Command response has neither normal nor error payload content" - .to_string(), - ), - kind: AIOProtocolErrorKind::PayloadInvalid, - is_shallow: false, - is_remote: true, - nested_error: None, - header_name: None, - header_value: None, - timeout_name: None, - timeout_value: None, - property_name: None, - property_value: None, - command_name: Some("put".to_string()), - protocol_version: None, - supported_protocol_major_versions: None, - }) } } Err(err) => Err(err), @@ -195,4 +176,23 @@ impl PutCommandInvoker { pub async fn shutdown(&self) -> Result<(), AIOProtocolError> { self.0.shutdown().await } + + fn get_err(field_name: &str) -> AIOProtocolError { + AIOProtocolError { + message: Some(format!("Command response missing field {field_name}")), + kind: AIOProtocolErrorKind::PayloadInvalid, + is_shallow: false, + is_remote: false, + nested_error: None, + header_name: None, + header_value: None, + timeout_name: None, + timeout_value: None, + property_name: None, + property_value: None, + command_name: Some("put".to_string()), + protocol_version: None, + supported_protocol_major_versions: None, + } + } } diff --git a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/put_request_schema.rs b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/put_request_schema.rs index 049a2a1e6e..0cc9c66c6e 100644 --- a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/put_request_schema.rs +++ b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/put_request_schema.rs @@ -10,9 +10,9 @@ use serde::{Deserialize, Serialize}; use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; -use super::format::Format; use super::schema_type::SchemaType; +/// PUT Schema request object #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct PutRequestSchema { /// Human-readable description of the schema. @@ -27,7 +27,7 @@ pub struct PutRequestSchema { pub display_name: Option, /// Format of the schema. - pub format: Format, + pub format: String, /// Content stored in the schema. #[serde(rename = "schemaContent")] diff --git a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/put_response_payload.rs b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/put_response_payload.rs index 83795d9d9a..9eff71036f 100644 --- a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/put_response_payload.rs +++ b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/put_response_payload.rs @@ -12,8 +12,9 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; use super::schema::Schema; +/// PUT Schema response object #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct PutResponsePayload { - /// The Command response argument. + /// Schema object that was created. pub schema: Schema, } diff --git a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/put_response_schema.rs b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/put_response_schema.rs index 045e36ddea..a6a013a0b2 100644 --- a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/put_response_schema.rs +++ b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/put_response_schema.rs @@ -13,12 +13,14 @@ use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, use super::schema::Schema; use super::schema_registry_error::SchemaRegistryError; +/// PUT Schema response object #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct PutResponseSchema { - /// Error object in case of failure. + /// Read error for the 'put' Action. + #[serde(rename = "putError")] #[serde(skip_serializing_if = "Option::is_none")] #[builder(default = "None")] - pub error: Option, + pub put_error: Option, /// Schema object that was created. #[serde(skip_serializing_if = "Option::is_none")] diff --git a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/schema.rs b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/schema.rs index 5dd1c2e466..a9e572632a 100644 --- a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/schema.rs +++ b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/schema.rs @@ -10,10 +10,9 @@ use serde::{Deserialize, Serialize}; use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; -use super::format::Format; use super::schema_type::SchemaType; -/// Schema object +/// Schema object that was created. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct Schema { /// Human-readable description of the schema. @@ -28,7 +27,7 @@ pub struct Schema { pub display_name: Option, /// Format of the schema. - pub format: Format, + pub format: String, /// Hash of the schema content. #[serde(skip_serializing_if = "Option::is_none")] diff --git a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/schema_registry_error.rs b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/schema_registry_error.rs index 012dacf411..2884e39090 100644 --- a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/schema_registry_error.rs +++ b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/schema_registry_error.rs @@ -10,15 +10,13 @@ use serde::{Deserialize, Serialize}; use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; -use super::schema_registry_error_code::SchemaRegistryErrorCode; use super::schema_registry_error_details::SchemaRegistryErrorDetails; -use super::schema_registry_error_target::SchemaRegistryErrorTarget; /// Error object for schema operations #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct SchemaRegistryError { /// Error code for classification of errors (ex: '400', '404', '500', etc.). - pub code: SchemaRegistryErrorCode, + pub code: i32, /// Additional details about the error, if available. #[serde(skip_serializing_if = "Option::is_none")] @@ -37,5 +35,5 @@ pub struct SchemaRegistryError { /// Target of the error, if applicable (e.g., 'schemaType'). #[serde(skip_serializing_if = "Option::is_none")] #[builder(default = "None")] - pub target: Option, + pub target: Option, } diff --git a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/schema_registry_error_code.rs b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/schema_registry_error_code.rs index 4dcc18738a..7e686ed3b0 100644 --- a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/schema_registry_error_code.rs +++ b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/schema_registry_error_code.rs @@ -1,11 +1,10 @@ /* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v0.10.0.0; DO NOT EDIT. */ -use serde_repr::{Deserialize_repr, Serialize_repr}; +/// The request is invalid or malformed. +pub const BAD_REQUEST: i32 = 400; -#[derive(Serialize_repr, Deserialize_repr, Debug, Clone)] -#[repr(i32)] -pub enum SchemaRegistryErrorCode { - BadRequest = 400, - InternalError = 500, - NotFound = 404, -} +/// The target resource was not found. +pub const NOT_FOUND: i32 = 404; + +/// An internal server error occurred. +pub const INTERNAL_ERROR: i32 = 500; diff --git a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/schema_registry_error_details.rs b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/schema_registry_error_details.rs index 82fd3531f6..72b9846f38 100644 --- a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/schema_registry_error_details.rs +++ b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/schema_registry_error_details.rs @@ -11,7 +11,7 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; -/// Additional details about an error +/// Additional details about the error, if available. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct SchemaRegistryErrorDetails { /// Multi-part error code for classification and root causing of errors (e.g., '400.200'). diff --git a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/schema_registry_error_target.rs b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/schema_registry_error_target.rs index 4bb2c2f0af..dac974b79f 100644 --- a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/schema_registry_error_target.rs +++ b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/schema_registry_error_target.rs @@ -1,29 +1,34 @@ /* Code generated by Azure.Iot.Operations.ProtocolCompilerLib v0.10.0.0; DO NOT EDIT. */ -use serde::{Deserialize, Serialize}; - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub enum SchemaRegistryErrorTarget { - #[serde(rename = "Description")] - DescriptionProperty, - #[serde(rename = "DisplayName")] - DisplayNameProperty, - #[serde(rename = "Format")] - FormatProperty, - #[serde(rename = "Name")] - NameProperty, - #[serde(rename = "SchemaArmResource")] - SchemaArmResource, - #[serde(rename = "SchemaContent")] - SchemaContentProperty, - #[serde(rename = "SchemaRegistryResource")] - SchemaRegistryArmResource, - #[serde(rename = "SchemaType")] - SchemaTypeProperty, - #[serde(rename = "SchemaVersionArmResource")] - SchemaVersionArmResource, - #[serde(rename = "Tags")] - TagsProperty, - #[serde(rename = "Version")] - VersionProperty, -} +/// Indicates the error is related to the schema type. +pub const SCHEMA_TYPE_PROPERTY: &str = "SchemaType"; + +/// Indicates the error is related to the schema format. +pub const FORMAT_PROPERTY: &str = "Format"; + +/// Indicates the error is related to the schema version. +pub const VERSION_PROPERTY: &str = "Version"; + +/// Indicates the error is related to the schema name. +pub const NAME_PROPERTY: &str = "Name"; + +/// Indicates the error is related to schema tags. +pub const TAGS_PROPERTY: &str = "Tags"; + +/// Indicates the error is related to the schema description. +pub const DESCRIPTION_PROPERTY: &str = "Description"; + +/// Indicates the error is related to the schema display name. +pub const DISPLAY_NAME_PROPERTY: &str = "DisplayName"; + +/// Indicates the error is related to the schema content. +pub const SCHEMA_CONTENT_PROPERTY: &str = "SchemaContent"; + +/// Indicates the error is related to the schema ARM resource. +pub const SCHEMA_ARM_RESOURCE: &str = "SchemaArmResource"; + +/// Indicates the error is related to the schema version ARM resource. +pub const SCHEMA_VERSION_ARM_RESOURCE: &str = "SchemaVersionArmResource"; + +/// Indicates the error is related to the schema registry ARM resource. +pub const SCHEMA_REGISTRY_ARM_RESOURCE: &str = "SchemaRegistryResource"; diff --git a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/schema_type.rs b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/schema_type.rs index 11ca6b4baf..f4b2d6d225 100644 --- a/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/schema_type.rs +++ b/rust/azure_iot_operations_services/src/schema_registry/schemaregistry_gen/schema_registry/schema_type.rs @@ -2,9 +2,8 @@ use serde::{Deserialize, Serialize}; -/// Supported schema types +/// Type of the schema. #[derive(Serialize, Deserialize, Debug, Clone)] pub enum SchemaType { - #[serde(rename = "MessageSchema")] MessageSchema, } From 893e85256b7d4b7f5fd6694e70f645d0acfc1687 Mon Sep 17 00:00:00 2001 From: vaavva Date: Wed, 21 Jan 2026 18:52:40 -0500 Subject: [PATCH 52/52] updated generated counter sample app as well --- eng/test/schema-samples/Counter.TM.json | 102 ++++++++++++++++++ eng/test/schema-samples/SchemaNames.json | 52 +++++++++ .../counter/envoy/src/counter.rs | 12 +-- .../src/counter/increment_command_executor.rs | 6 +- .../src/counter/increment_command_invoker.rs | 6 +- .../src/counter/increment_request_payload.rs | 3 +- .../src/counter/increment_response_payload.rs | 3 +- .../counter/read_counter_command_executor.rs | 6 +- .../counter/read_counter_command_invoker.rs | 6 +- .../counter/read_counter_response_payload.rs | 3 +- .../src/counter/reset_command_executor.rs | 6 +- .../src/counter/reset_command_invoker.rs | 6 +- .../envoy/src/counter/telemetry_collection.rs | 1 + ...er.rs => telemetry_collection_receiver.rs} | 22 ++-- ...nder.rs => telemetry_collection_sender.rs} | 31 +++--- rust/sample_applications/counter/gen.sh | 6 +- 16 files changed, 199 insertions(+), 72 deletions(-) create mode 100644 eng/test/schema-samples/Counter.TM.json create mode 100644 eng/test/schema-samples/SchemaNames.json rename rust/sample_applications/counter/envoy/src/counter/{telemetry_receiver.rs => telemetry_collection_receiver.rs} (75%) rename rust/sample_applications/counter/envoy/src/counter/{telemetry_sender.rs => telemetry_collection_sender.rs} (81%) diff --git a/eng/test/schema-samples/Counter.TM.json b/eng/test/schema-samples/Counter.TM.json new file mode 100644 index 0000000000..87e3266163 --- /dev/null +++ b/eng/test/schema-samples/Counter.TM.json @@ -0,0 +1,102 @@ +{ + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { "dtv": "http://azure.com/DigitalTwins/dtmi#" } + ], + "@type": "tm:ThingModel", + "title": "Counter", + "links": [ + { + "rel": "dtv:naming", + "href": "SchemaNames.json", + "type": "application/json" + } + ], + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "telemetry/telemetry-samples/counterValue", + "op": "subscribeallevents" + } + ], + "actions": { + "readCounter": { + "output": { + "type": "object", + "required": [ "CounterResponse" ], + "properties": { + "CounterResponse": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + } + } + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "rpc/command-samples/{executorId}/readCounter", + "op": "invokeaction" + } + ] + }, + "increment": { + "input": { + "type": "object", + "required": [ "incrementValue" ], + "properties": { + "incrementValue": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + } + } + }, + "output": { + "type": "object", + "required": [ "CounterResponse" ], + "properties": { + "CounterResponse": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + } + } + }, + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "rpc/command-samples/{executorId}/increment", + "op": "invokeaction" + } + ] + }, + "reset": { + "forms": [ + { + "contentType": "application/json", + "dtv:topic": "rpc/command-samples/{executorId}/reset", + "op": "invokeaction" + } + ] + } + }, + "properties": { + }, + "events": { + "CounterValue": { + "description": "The current value of the counter.", + "data": { + "type": "integer", + "minimum": -2147483648, + "maximum": 2147483647 + }, + "forms": [ + { + "contentType": "application/json", + "op": "subscribeevent" + } + ] + } + } +} diff --git a/eng/test/schema-samples/SchemaNames.json b/eng/test/schema-samples/SchemaNames.json new file mode 100644 index 0000000000..19c8363589 --- /dev/null +++ b/eng/test/schema-samples/SchemaNames.json @@ -0,0 +1,52 @@ +{ + "aggregateEventName": "Telemetry", + "aggregateEventSchema": "TelemetryCollection", + "aggregatePropName": "Property", + "aggregateReadRespValueField": "Properties", + "aggregateRespErrorField": "Errors", + "eventSchema": { + "in": [ "eventName" ], + "out": "{eventName}Telemetry", + "capitalize": true + }, + "eventValueSchema": { + "in": [ "eventName" ], + "out": "{eventName}Schema", + "capitalize": true + }, + "eventSenderBinder": { + "in": [ "eventSchema" ], + "out": "{eventSchema}Sender", + "capitalize": true + }, + "eventReceiverBinder": { + "in": [ "eventSchema" ], + "out": "{eventSchema}Receiver", + "capitalize": true + }, + "actionInSchema": { + "in": [ "actionName" ], + "out": "{actionName}RequestPayload", + "capitalize": true + }, + "actionOutSchema": { + "in": [ "actionName" ], + "out": "{actionName}ResponsePayload", + "capitalize": true + }, + "actionExecutorBinder": { + "in": [ "actionName" ], + "out": "{actionName}CommandExecutor", + "capitalize": true + }, + "actionInvokerBinder": { + "in": [ "actionName" ], + "out": "{actionName}CommandInvoker", + "capitalize": true + }, + "actionRespErrorField": { + "in": [ "actionName", "errorSchemaName" ], + "out": "{actionName}Error", + "capitalize": false + } +} diff --git a/rust/sample_applications/counter/envoy/src/counter.rs b/rust/sample_applications/counter/envoy/src/counter.rs index 5c8504cacf..098125cba4 100644 --- a/rust/sample_applications/counter/envoy/src/counter.rs +++ b/rust/sample_applications/counter/envoy/src/counter.rs @@ -13,19 +13,15 @@ mod read_counter_response_payload_serialization; mod reset_command_executor; mod reset_command_invoker; mod telemetry_collection; +mod telemetry_collection_receiver; +mod telemetry_collection_sender; mod telemetry_collection_serialization; -mod telemetry_receiver; -mod telemetry_sender; pub use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; pub use super::common_types::options::{CommandExecutorOptions, TelemetrySenderOptions}; pub use super::common_types::options::{CommandInvokerOptions, TelemetryReceiverOptions}; -pub const MODEL_ID: &str = "dtmi:com:example:Counter;1"; -pub const REQUEST_TOPIC_PATTERN: &str = "rpc/command-samples/{executorId}/{commandName}"; -pub const TELEMETRY_TOPIC_PATTERN: &str = "telemetry/telemetry-samples/counterValue"; - pub mod client { pub use super::increment_command_invoker::*; pub use super::increment_request_payload::*; @@ -34,7 +30,7 @@ pub mod client { pub use super::read_counter_response_payload::*; pub use super::reset_command_invoker::*; pub use super::telemetry_collection::*; - pub use super::telemetry_receiver::*; + pub use super::telemetry_collection_receiver::*; } pub mod service { @@ -45,5 +41,5 @@ pub mod service { pub use super::read_counter_response_payload::*; pub use super::reset_command_executor::*; pub use super::telemetry_collection::*; - pub use super::telemetry_sender::*; + pub use super::telemetry_collection_sender::*; } diff --git a/rust/sample_applications/counter/envoy/src/counter/increment_command_executor.rs b/rust/sample_applications/counter/envoy/src/counter/increment_command_executor.rs index 45084a658c..2197732702 100644 --- a/rust/sample_applications/counter/envoy/src/counter/increment_command_executor.rs +++ b/rust/sample_applications/counter/envoy/src/counter/increment_command_executor.rs @@ -9,8 +9,6 @@ use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; use azure_iot_operations_protocol::rpc_command; use super::super::common_types::options::CommandExecutorOptions; -use super::MODEL_ID; -use super::REQUEST_TOPIC_PATTERN; use super::increment_request_payload::IncrementRequestPayload; use super::increment_response_payload::IncrementResponsePayload; @@ -90,12 +88,10 @@ impl IncrementCommandExecutor { .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("modelId".to_string(), MODEL_ID.to_string()); topic_token_map.insert("executorId".to_string(), client.client_id().to_string()); - topic_token_map.insert("commandName".to_string(), "increment".to_string()); let executor_options = executor_options_builder - .request_topic_pattern(REQUEST_TOPIC_PATTERN) + .request_topic_pattern("rpc/command-samples/{executorId}/increment") .command_name("increment") .is_idempotent(false) .topic_token_map(topic_token_map) diff --git a/rust/sample_applications/counter/envoy/src/counter/increment_command_invoker.rs b/rust/sample_applications/counter/envoy/src/counter/increment_command_invoker.rs index b06078cb9f..425aaf0be8 100644 --- a/rust/sample_applications/counter/envoy/src/counter/increment_command_invoker.rs +++ b/rust/sample_applications/counter/envoy/src/counter/increment_command_invoker.rs @@ -10,8 +10,6 @@ use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; use azure_iot_operations_protocol::rpc_command; use super::super::common_types::options::CommandInvokerOptions; -use super::MODEL_ID; -use super::REQUEST_TOPIC_PATTERN; use super::increment_request_payload::IncrementRequestPayload; use super::increment_response_payload::IncrementResponsePayload; @@ -124,15 +122,13 @@ impl IncrementCommandInvoker { .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("modelId".to_string(), MODEL_ID.to_string()); topic_token_map.insert( "invokerClientId".to_string(), client.client_id().to_string(), ); - topic_token_map.insert("commandName".to_string(), "increment".to_string()); let invoker_options = invoker_options_builder - .request_topic_pattern(REQUEST_TOPIC_PATTERN) + .request_topic_pattern("rpc/command-samples/{executorId}/increment") .command_name("increment") .topic_token_map(topic_token_map) .response_topic_prefix(options.response_topic_prefix.clone()) diff --git a/rust/sample_applications/counter/envoy/src/counter/increment_request_payload.rs b/rust/sample_applications/counter/envoy/src/counter/increment_request_payload.rs index a8bc05a81a..eb12e47870 100644 --- a/rust/sample_applications/counter/envoy/src/counter/increment_request_payload.rs +++ b/rust/sample_applications/counter/envoy/src/counter/increment_request_payload.rs @@ -11,9 +11,10 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; +/// Input arguments for action 'increment' #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct IncrementRequestPayload { - /// The Command request argument. + /// The 'incrementValue' Field. #[serde(rename = "incrementValue")] pub increment_value: i32, } diff --git a/rust/sample_applications/counter/envoy/src/counter/increment_response_payload.rs b/rust/sample_applications/counter/envoy/src/counter/increment_response_payload.rs index 06543a1ebb..68a59281ae 100644 --- a/rust/sample_applications/counter/envoy/src/counter/increment_response_payload.rs +++ b/rust/sample_applications/counter/envoy/src/counter/increment_response_payload.rs @@ -11,9 +11,10 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; +/// Output arguments for action 'increment' #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct IncrementResponsePayload { - /// The Command response argument. + /// The 'CounterResponse' Field. #[serde(rename = "CounterResponse")] pub counter_response: i32, } diff --git a/rust/sample_applications/counter/envoy/src/counter/read_counter_command_executor.rs b/rust/sample_applications/counter/envoy/src/counter/read_counter_command_executor.rs index 7b5b719545..5536d62f61 100644 --- a/rust/sample_applications/counter/envoy/src/counter/read_counter_command_executor.rs +++ b/rust/sample_applications/counter/envoy/src/counter/read_counter_command_executor.rs @@ -10,8 +10,6 @@ use azure_iot_operations_protocol::rpc_command; use super::super::common_types::empty_json::EmptyJson; use super::super::common_types::options::CommandExecutorOptions; -use super::MODEL_ID; -use super::REQUEST_TOPIC_PATTERN; use super::read_counter_response_payload::ReadCounterResponsePayload; pub type ReadCounterRequest = rpc_command::executor::Request; @@ -87,12 +85,10 @@ impl ReadCounterCommandExecutor { .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("modelId".to_string(), MODEL_ID.to_string()); topic_token_map.insert("executorId".to_string(), client.client_id().to_string()); - topic_token_map.insert("commandName".to_string(), "readCounter".to_string()); let executor_options = executor_options_builder - .request_topic_pattern(REQUEST_TOPIC_PATTERN) + .request_topic_pattern("rpc/command-samples/{executorId}/readCounter") .command_name("readCounter") .is_idempotent(false) .topic_token_map(topic_token_map) diff --git a/rust/sample_applications/counter/envoy/src/counter/read_counter_command_invoker.rs b/rust/sample_applications/counter/envoy/src/counter/read_counter_command_invoker.rs index ece411980f..6d76e925e1 100644 --- a/rust/sample_applications/counter/envoy/src/counter/read_counter_command_invoker.rs +++ b/rust/sample_applications/counter/envoy/src/counter/read_counter_command_invoker.rs @@ -10,8 +10,6 @@ use azure_iot_operations_protocol::rpc_command; use super::super::common_types::empty_json::EmptyJson; use super::super::common_types::options::CommandInvokerOptions; -use super::MODEL_ID; -use super::REQUEST_TOPIC_PATTERN; use super::read_counter_response_payload::ReadCounterResponsePayload; pub type ReadCounterRequest = rpc_command::invoker::Request; @@ -111,15 +109,13 @@ impl ReadCounterCommandInvoker { .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("modelId".to_string(), MODEL_ID.to_string()); topic_token_map.insert( "invokerClientId".to_string(), client.client_id().to_string(), ); - topic_token_map.insert("commandName".to_string(), "readCounter".to_string()); let invoker_options = invoker_options_builder - .request_topic_pattern(REQUEST_TOPIC_PATTERN) + .request_topic_pattern("rpc/command-samples/{executorId}/readCounter") .command_name("readCounter") .topic_token_map(topic_token_map) .response_topic_prefix(options.response_topic_prefix.clone()) diff --git a/rust/sample_applications/counter/envoy/src/counter/read_counter_response_payload.rs b/rust/sample_applications/counter/envoy/src/counter/read_counter_response_payload.rs index e390e1881b..51b39f3214 100644 --- a/rust/sample_applications/counter/envoy/src/counter/read_counter_response_payload.rs +++ b/rust/sample_applications/counter/envoy/src/counter/read_counter_response_payload.rs @@ -11,9 +11,10 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; +/// Output arguments for action 'readCounter' #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct ReadCounterResponsePayload { - /// The Command response argument. + /// The 'CounterResponse' Field. #[serde(rename = "CounterResponse")] pub counter_response: i32, } diff --git a/rust/sample_applications/counter/envoy/src/counter/reset_command_executor.rs b/rust/sample_applications/counter/envoy/src/counter/reset_command_executor.rs index de3aeafe1c..9a7590dbe2 100644 --- a/rust/sample_applications/counter/envoy/src/counter/reset_command_executor.rs +++ b/rust/sample_applications/counter/envoy/src/counter/reset_command_executor.rs @@ -9,8 +9,6 @@ use azure_iot_operations_protocol::rpc_command; use super::super::common_types::empty_json::EmptyJson; use super::super::common_types::options::CommandExecutorOptions; -use super::MODEL_ID; -use super::REQUEST_TOPIC_PATTERN; pub type ResetRequest = rpc_command::executor::Request; pub type ResetResponse = rpc_command::executor::Response; @@ -75,12 +73,10 @@ impl ResetCommandExecutor { .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("modelId".to_string(), MODEL_ID.to_string()); topic_token_map.insert("executorId".to_string(), client.client_id().to_string()); - topic_token_map.insert("commandName".to_string(), "reset".to_string()); let executor_options = executor_options_builder - .request_topic_pattern(REQUEST_TOPIC_PATTERN) + .request_topic_pattern("rpc/command-samples/{executorId}/reset") .command_name("reset") .is_idempotent(false) .topic_token_map(topic_token_map) diff --git a/rust/sample_applications/counter/envoy/src/counter/reset_command_invoker.rs b/rust/sample_applications/counter/envoy/src/counter/reset_command_invoker.rs index 75174314e5..fe83fdbe9b 100644 --- a/rust/sample_applications/counter/envoy/src/counter/reset_command_invoker.rs +++ b/rust/sample_applications/counter/envoy/src/counter/reset_command_invoker.rs @@ -10,8 +10,6 @@ use azure_iot_operations_protocol::rpc_command; use super::super::common_types::empty_json::EmptyJson; use super::super::common_types::options::CommandInvokerOptions; -use super::MODEL_ID; -use super::REQUEST_TOPIC_PATTERN; pub type ResetRequest = rpc_command::invoker::Request; pub type ResetResponse = rpc_command::invoker::Response; @@ -108,15 +106,13 @@ impl ResetCommandInvoker { .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("modelId".to_string(), MODEL_ID.to_string()); topic_token_map.insert( "invokerClientId".to_string(), client.client_id().to_string(), ); - topic_token_map.insert("commandName".to_string(), "reset".to_string()); let invoker_options = invoker_options_builder - .request_topic_pattern(REQUEST_TOPIC_PATTERN) + .request_topic_pattern("rpc/command-samples/{executorId}/reset") .command_name("reset") .topic_token_map(topic_token_map) .response_topic_prefix(options.response_topic_prefix.clone()) diff --git a/rust/sample_applications/counter/envoy/src/counter/telemetry_collection.rs b/rust/sample_applications/counter/envoy/src/counter/telemetry_collection.rs index 714a549572..29b21fc35c 100644 --- a/rust/sample_applications/counter/envoy/src/counter/telemetry_collection.rs +++ b/rust/sample_applications/counter/envoy/src/counter/telemetry_collection.rs @@ -11,6 +11,7 @@ use uuid::Uuid; use super::super::common_types::{b64::Bytes, date_only::Date, decimal::Decimal, time_only::Time}; +/// Data values of Events. #[derive(Serialize, Deserialize, Debug, Clone, Builder)] pub struct TelemetryCollection { /// The current value of the counter. diff --git a/rust/sample_applications/counter/envoy/src/counter/telemetry_receiver.rs b/rust/sample_applications/counter/envoy/src/counter/telemetry_collection_receiver.rs similarity index 75% rename from rust/sample_applications/counter/envoy/src/counter/telemetry_receiver.rs rename to rust/sample_applications/counter/envoy/src/counter/telemetry_collection_receiver.rs index 3405f306cf..fccb076cf6 100644 --- a/rust/sample_applications/counter/envoy/src/counter/telemetry_receiver.rs +++ b/rust/sample_applications/counter/envoy/src/counter/telemetry_collection_receiver.rs @@ -8,17 +8,15 @@ use azure_iot_operations_protocol::common::aio_protocol_error::AIOProtocolError; use azure_iot_operations_protocol::telemetry; use super::super::common_types::options::TelemetryReceiverOptions; -use super::MODEL_ID; -use super::TELEMETRY_TOPIC_PATTERN; use super::telemetry_collection::TelemetryCollection; -pub type TelemetryMessage = telemetry::receiver::Message; +pub type TelemetryCollectionMessage = telemetry::receiver::Message; /// Telemetry Receiver for `TelemetryCollection` -pub struct TelemetryReceiver(telemetry::Receiver); +pub struct TelemetryCollectionReceiver(telemetry::Receiver); -impl TelemetryReceiver { - /// Creates a new [`TelemetryReceiver`] +impl TelemetryCollectionReceiver { + /// Creates a new [`TelemetryCollectionReceiver`] /// /// # Panics /// If the DTDL that generated this code was invalid @@ -32,17 +30,15 @@ impl TelemetryReceiver { receiver_options_builder.topic_namespace(topic_namespace.clone()); } - let mut topic_token_map: HashMap = options + let topic_token_map: HashMap = options .topic_token_map .clone() .into_iter() .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("modelId".to_string(), MODEL_ID.to_string()); - let receiver_options = receiver_options_builder - .topic_pattern(TELEMETRY_TOPIC_PATTERN) + .topic_pattern("telemetry/telemetry-samples/counterValue") .topic_token_map(topic_token_map) .auto_ack(options.auto_ack) .build() @@ -54,7 +50,7 @@ impl TelemetryReceiver { ) } - /// Shut down the [`TelemetryReceiver`] + /// Shut down the [`TelemetryCollectionReceiver`] /// /// # Errors /// [`AIOProtocolError`] if there is a failure in graceful shutdown @@ -62,13 +58,13 @@ impl TelemetryReceiver { self.0.shutdown().await } - /// Receive the next [`TelemetryMessage`] + /// Receive the next [`TelemetryCollectionMessage`] /// /// # Errors /// [`AIOProtocolError`] if there is a failure receiving a message pub async fn recv( &mut self, - ) -> Option), AIOProtocolError>> { + ) -> Option), AIOProtocolError>> { self.0.recv().await } } diff --git a/rust/sample_applications/counter/envoy/src/counter/telemetry_sender.rs b/rust/sample_applications/counter/envoy/src/counter/telemetry_collection_sender.rs similarity index 81% rename from rust/sample_applications/counter/envoy/src/counter/telemetry_sender.rs rename to rust/sample_applications/counter/envoy/src/counter/telemetry_collection_sender.rs index 45ee8a70e4..bb7a820d6f 100644 --- a/rust/sample_applications/counter/envoy/src/counter/telemetry_sender.rs +++ b/rust/sample_applications/counter/envoy/src/counter/telemetry_collection_sender.rs @@ -11,21 +11,19 @@ use azure_iot_operations_protocol::common::payload_serialize::PayloadSerialize; use azure_iot_operations_protocol::telemetry; use super::super::common_types::options::TelemetrySenderOptions; -use super::MODEL_ID; -use super::TELEMETRY_TOPIC_PATTERN; use super::telemetry_collection::TelemetryCollection; -pub type TelemetryMessage = telemetry::sender::Message; -pub type TelemetryMessageBuilderError = telemetry::sender::MessageBuilderError; +pub type TelemetryCollectionMessage = telemetry::sender::Message; +pub type TelemetryCollectionMessageBuilderError = telemetry::sender::MessageBuilderError; -/// Builder for [`TelemetryMessage`] +/// Builder for [`TelemetryCollectionMessage`] #[derive(Default)] -pub struct TelemetryMessageBuilder { +pub struct TelemetryCollectionMessageBuilder { inner_builder: telemetry::sender::MessageBuilder, topic_tokens: HashMap, } -impl TelemetryMessageBuilder { +impl TelemetryCollectionMessageBuilder { /// Quality of Service of the telemetry message. Can only be `AtMostOnce` or `AtLeastOnce`. pub fn qos(&mut self, qos: QoS) -> &mut Self { self.inner_builder.qos(qos); @@ -69,11 +67,13 @@ impl TelemetryMessageBuilder { Ok(self) } - /// Builds a new `TelemetryMessage` + /// Builds a new `TelemetryCollectionMessage` /// /// # Errors /// If a required field has not been initialized - pub fn build(&mut self) -> Result { + pub fn build( + &mut self, + ) -> Result { self.inner_builder.topic_tokens(self.topic_tokens.clone()); self.inner_builder.build() @@ -81,10 +81,10 @@ impl TelemetryMessageBuilder { } /// Telemetry Sender for `TelemetryCollection` -pub struct TelemetrySender(telemetry::Sender); +pub struct TelemetryCollectionSender(telemetry::Sender); -impl TelemetrySender { - /// Creates a new [`TelemetrySender`] +impl TelemetryCollectionSender { + /// Creates a new [`TelemetryCollectionSender`] /// /// # Panics /// If the DTDL that generated this code was invalid @@ -105,11 +105,10 @@ impl TelemetrySender { .map(|(k, v)| (format!("ex:{k}"), v)) .collect(); - topic_token_map.insert("modelId".to_string(), MODEL_ID.to_string()); topic_token_map.insert("senderId".to_string(), client.client_id().to_string()); let sender_options = sender_options_builder - .topic_pattern(TELEMETRY_TOPIC_PATTERN) + .topic_pattern("telemetry/telemetry-samples/counterValue") .topic_token_map(topic_token_map) .build() .expect("DTDL schema generated invalid arguments"); @@ -120,11 +119,11 @@ impl TelemetrySender { ) } - /// Sends a [`TelemetryMessage`] + /// Sends a [`TelemetryCollectionMessage`] /// /// # Error /// [`AIOProtocolError`] if there is a failure sending the message - pub async fn send(&self, message: TelemetryMessage) -> Result<(), AIOProtocolError> { + pub async fn send(&self, message: TelemetryCollectionMessage) -> Result<(), AIOProtocolError> { self.0.send(message).await } } diff --git a/rust/sample_applications/counter/gen.sh b/rust/sample_applications/counter/gen.sh index d839f13e7a..6f55c110f4 100755 --- a/rust/sample_applications/counter/gen.sh +++ b/rust/sample_applications/counter/gen.sh @@ -1,3 +1,5 @@ #!/bin/sh -../../../codegen/src/Azure.Iot.Operations.ProtocolCompiler/bin/Debug/net9.0/Azure.Iot.Operations.ProtocolCompiler \ - --modelFile ../../../eng/test/schema-samples/counter.json --outDir ./envoy --sdkPath ../.. --lang=rust; + +rm -r ./envoy +../../../codegen2/src/Azure.Iot.Operations.ProtocolCompiler/bin/Debug/net9.0/Azure.Iot.Operations.ProtocolCompiler \ + --thingFiles ../../../eng/test/schema-samples/Counter.TM.json --outDir ./envoy --sdkPath ../.. --lang=rust --namespace Counter --workingDir target/counter;