private void DisplayOutputs(ThingClass thingClass, string prefix = "")
        {
            var outputs = thingClass.OutputTagGroups;

            Console.WriteLine(prefix + "outputs:");
            if (outputs.Count == 0)
            {
                Console.WriteLine(prefix + "   <none>");
            }
            else
            {
                foreach (var output in outputs)
                {
                    try
                    {
                        TagGroup tagGroup = FindTagGroup(output.OutputTagGroup);
                        Console.ForegroundColor = ConsoleColor.Green;
                        Console.Write(prefix + "   " + output.Name);
                        Console.ResetColor();
                        Console.Write(": ");
                        DisplayTagGroup(tagGroup, prefix + "      ");
                    }
                    catch (TagGroupNotFoundException e)
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine(prefix + "   TagGroup not found");
                        Console.ResetColor();
                    }
                }
            }
        }
        private void DisplayInputs(ThingClass thingClass, string prefix = "")
        {
            var inputs = thingClass.InputTagGroups;

            Console.WriteLine(prefix + "inputs:");
            if (inputs.Count == 0)
            {
                Console.WriteLine(prefix + "   <none>");
            }
            else
            {
                foreach (var input in inputs)
                {
                    string inputTagGroup = input.InputTagGroup;
                    if (IsDynamicTagGroup(inputTagGroup))
                    {
                        Console.ForegroundColor = ConsoleColor.Green;
                        Console.Write(prefix + input.Name);
                        Console.ResetColor();
                        Console.Write(": ");
                        Console.ForegroundColor = ConsoleColor.Magenta;
                        Console.Write("[expression]");
                        Console.ResetColor();
                        Console.WriteLine(" " + inputTagGroup);
                    }
                    else
                    {
                        try
                        {
                            TagGroup tagGroup = FindTagGroup(inputTagGroup);
                            Console.ForegroundColor = ConsoleColor.Green;
                            Console.Write(prefix + "   " + input.Name);
                            Console.ResetColor();
                            Console.Write(": ");
                            DisplayTagGroup(tagGroup, prefix + "      ");
                        }
                        catch (TagGroupNotFoundException e)
                        {
                            Console.ForegroundColor = ConsoleColor.Red;
                            Console.WriteLine(prefix + "   TagGroup not found");
                            Console.ResetColor();
                        }
                    }
                }
            }
        }
        private void DisplayThingClass(ThingClass thingClass, string prefix = "")
        {
            var thingClassName = thingClass.Id.Name + ":" +
                                 thingClass.Context + ":" +
                                 thingClass.VersionTag;

            Console.ForegroundColor = ConsoleColor.Magenta;
            Console.Write(prefix + thingClassName);
            Console.ForegroundColor = ConsoleColor.DarkMagenta;
            Console.WriteLine(" [ThingClass]");
            Console.ResetColor();

            Console.WriteLine(prefix + "   Description: " + thingClass.Description);

            DisplayInputs(thingClass, prefix + "   ");
            DisplayOutputs(thingClass, prefix + "   ");
        }