private object HandleConceptOrExpressionSlotInAttributeValue(
            TemplateInformationSlot infoSlot,
            ConceptReference attrName,
            OneOf <ConceptReplacementSlot, ExpressionReplacementSlot> valueSlot,
            IDictionary <string, TemplateData.Item> itemData,
            string lang
            )
        {
            var(attrTitle, attrDesc) = GetConceptOrSlotTitleAndDesc(infoSlot, attrName, itemData, lang);
            var result = new Dictionary <string, object>
            {
                ["attribute"] = attrName.SctId
            };

            result["title"] = attrTitle ?? throw new Exception($"No title specified for {attrName.SctId}");
            if (attrDesc != null)
            {
                result["description"] = attrDesc;
            }
            result["cardinality"] = new
            {
                min = infoSlot?.Cardinality?.MinCardinality ?? 1,
                max = infoSlot?.Cardinality?.MaxCardinality
            };
            result["value"] = GetConceptSlotJson(valueSlot.Handle(c => c.ExpressionConstraint, e => e.ExpressionConstraint));
            return(result);
        }