private void ValidateTemplateMarkup(Template template, IEnumerable <TemplateErrorSuppression> errorSuppressions) { var references = template.Steps.SelectMany(s => s.Inputs.Select(i => { var inputId = s.Id; if (!string.IsNullOrEmpty(i.Key)) { inputId += $".{i.Key}"; } if (i.Type == TemplateStepInputType.Text) { return(ReferenceDefinition.String(inputId)); } else if (i.Type == TemplateStepInputType.Checkbox) { return(ReferenceDefinition.Boolean(inputId)); } else if (i.Type == TemplateStepInputType.Radio) { var values = DynamicUtility.Unwrap(() => (IEnumerable <dynamic>)i.TypeData) .Select(d => DynamicUtility.Unwrap <string>(() => d.Value)); return(ReferenceDefinition.StringFrom(inputId, values)); } else { throw new Exception($"Unknown {nameof(TemplateStepInputType)}"); } })); _templateMarkupValidator.Validate(template.Markup, template.MarkupVersion, references, errorSuppressions); }
private object CreateReference(ReferenceDefinition referenceDefinition) { TypeDefinition typeDefinition = referenceDefinition.typeDefinition; if (typeDefinition.IsArray) { Type typeElement = typeDefinition.type.GetElementType(); return(Array.CreateInstance(typeElement, referenceDefinition.fields.Length)); } else if (typeDefinition.IsList) { Type elementType = typeDefinition.GetArrayLikeElementType().type; IList list = MakeInstance <IList>(typeDefinition.type); Debug.Assert(list != null, nameof(list) + " != null"); object defaultValue = GetDefaultForType(elementType); for (int i = 0; i < referenceDefinition.fields.Length; i++) { list.Add(defaultValue); } return(list); } else { return(MakeInstance(typeDefinition.type)); } }
private void CreateArrayMembers(Array target, ReferenceDefinition def) { FieldDefinition[] fields = def.fields; for (int i = 0; i < fields.Length; i++) { FieldDefinition field = fields[i]; switch (field.fieldType) { case FieldType.Array: case FieldType.Reference: target.SetValue(field.refId == -1 ? null : referenceMap[field.refId], i); break; case FieldType.Struct: target.SetValue(CreateStruct(field), i); break; case FieldType.Primitive: target.SetValue(field.value, i); break; case FieldType.Type: target.SetValue(field.value, i); break; case FieldType.Unity: target.SetValue(null, i); break; default: throw new ArgumentOutOfRangeException(); } } }
public void TestUnknownReference_DataElement() { RunValidation( nameof(TestUnknownReference_DataElement), new ReferenceDefinition[] { ReferenceDefinition.StringFrom("known_reference", new string[] { "person" }) }, new TemplateError[] { new TemplateError() { Code = TemplateErrorCode.UnknownReference, LineNumber = 4, LinePosition = 13 } }); }
public void TestUnknownReference_IfAttribute() { RunValidation( nameof(TestUnknownReference_IfAttribute), new ReferenceDefinition[] { ReferenceDefinition.String("known_reference") }, new TemplateError[] { new TemplateError() { Code = TemplateErrorCode.UnknownReference, LineNumber = 3, LinePosition = 16 } }); }
private ReferenceDefinition CreateReferenceDefinition(object target) { ReferenceDefinition refNode = new ReferenceDefinition(); refNode.refId = referenceIdGenerator++; refNode.typeDefinition = TypeDefinition.Get(target.GetType()); referenceMap[target] = refNode; if (refNode.typeDefinition.IsArray) { Array array = target as Array; Debug.Assert(array != null, nameof(array) + " != null"); int length = array.Length; refNode.fields = new FieldDefinition[length]; TypeDefinition elementType = refNode.typeDefinition.GetArrayLikeElementType(); for (int i = 0; i < length; i++) { refNode.fields[i] = CreateArrayMemberDefinition(elementType, array.GetValue(i), i); } } else if (refNode.typeDefinition.IsArrayLike) { IList list = target as IList; Debug.Assert(list != null, nameof(list) + " != null"); int length = list.Count; refNode.fields = new FieldDefinition[length]; TypeDefinition elementType = refNode.typeDefinition.GetArrayLikeElementType(); for (int i = 0; i < length; i++) { refNode.fields[i] = CreateArrayMemberDefinition(elementType, list[i], i); } } else { refNode.fields = new FieldDefinition[refNode.typeDefinition.fields.Length]; FieldInfo[] fields = refNode.typeDefinition.fields; for (int i = 0; i < fields.Length; i++) { refNode.fields[i] = CreateFieldDefinition(target, fields[i]); } } return(refNode); }