in codegen/src/Azure.Iot.Operations.ProtocolCompiler/ModelSelector.cs [12:100]
public static async Task<ContextualizedInterface> GetInterfaceAndModelContext(string[] modelTexts, string[] modelNames, Dtmi? modelDtmi, Action<string?> acceptHelpMessage)
{
ContextualizedInterface contextualizedInterface = new();
ParsingOptions parsingOptions = new();
parsingOptions.ExtensionLimitContexts = new List<Dtmi> { new Dtmi("dtmi:dtdl:limits:onvif") };
DtdlParseLocator parseLocator = (int parseIndex, int parseLine, out string sourceName, out int sourceLine) =>
{
sourceName = modelNames[parseIndex];
sourceLine = parseLine;
return true;
};
var modelParser = new ModelParser(parsingOptions);
try
{
contextualizedInterface.ModelDict = await modelParser.ParseAsync(EnumerableStringToAsync(modelTexts), parseLocator);
}
catch (ParsingException pex)
{
StringBuilder errorStringBuilder = new();
foreach (ParsingError perr in pex.Errors)
{
acceptHelpMessage(perr.Message);
}
return contextualizedInterface;
}
catch (ResolutionException rex)
{
acceptHelpMessage(rex.Message);
return contextualizedInterface;
}
if (modelDtmi != null)
{
if (!contextualizedInterface.ModelDict.TryGetValue(modelDtmi, out DTEntityInfo? dtEntity))
{
acceptHelpMessage($"{modelDtmi} not found in model");
return contextualizedInterface;
}
else if (dtEntity.EntityKind != DTEntityKind.Interface)
{
acceptHelpMessage($"{modelDtmi} is not an Interface");
return contextualizedInterface;
}
else if (!dtEntity.SupplementalTypes.Any(t => DtdlMqttExtensionValues.MqttAdjunctTypeRegex.IsMatch(t.AbsoluteUri)))
{
acceptHelpMessage($"{modelDtmi} does not have a co-type of {DtdlMqttExtensionValues.GetStandardTerm(DtdlMqttExtensionValues.MqttAdjunctTypePattern)}");
return contextualizedInterface;
}
else
{
contextualizedInterface.InterfaceId = modelDtmi;
}
}
else
{
IEnumerable<DTInterfaceInfo> mqttInterfaces = contextualizedInterface.ModelDict.Values.Where(e => e.EntityKind == DTEntityKind.Interface && e.SupplementalTypes.Any(t => DtdlMqttExtensionValues.MqttAdjunctTypeRegex.IsMatch(t.AbsoluteUri))).Select(e => (DTInterfaceInfo)e);
switch (mqttInterfaces.Count())
{
case 0:
acceptHelpMessage($"No Interface in model has a co-type of {DtdlMqttExtensionValues.GetStandardTerm(DtdlMqttExtensionValues.MqttAdjunctTypePattern)}");
break;
case 1:
contextualizedInterface.InterfaceId = mqttInterfaces.First().Id;
break;
default:
acceptHelpMessage($"More than one Interface has a co-type of {DtdlMqttExtensionValues.GetStandardTerm(DtdlMqttExtensionValues.MqttAdjunctTypePattern)}");
acceptHelpMessage($"Resubmit command with one of the following options:");
foreach (DTInterfaceInfo mqttInterface in mqttInterfaces)
{
acceptHelpMessage($" --modelId {mqttInterface.Id}");
}
break;
}
}
if (contextualizedInterface.InterfaceId != null)
{
Dtmi mqttTypeId = contextualizedInterface.ModelDict[contextualizedInterface.InterfaceId].SupplementalTypes.First(t => DtdlMqttExtensionValues.MqttAdjunctTypeRegex.IsMatch(t.AbsoluteUri));
contextualizedInterface.MqttVersion = int.Parse(DtdlMqttExtensionValues.MqttAdjunctTypeRegex.Match(mqttTypeId.AbsoluteUri).Groups[1].Captures[0].Value);
}
return contextualizedInterface;
}