Exemplo n.º 1
0
        static Provider ResolveInternal(ComponentBuilderContext context, ElementBuilder element, YamlNode node)
        {
            if (element == null)
            {
                return(null);
            }

            var value = node.ToScalar().Value;

            // declare a variable for this element
            if (!context.TryDeclareVariable(element.Type, value, null, out var variable))
            {
                throw new YamlComponentException($"Variable '{value}' is already declared.", node);
            }

            // assign to this variable when element is constructed
            if (element.Assignee != null)
            {
                throw new YamlComponentException("Cannot specify multiple keys for an element.", node);
            }

            element.Assignee = variable;

            return(new Provider(value));
        }
        public IPropProvider Resolve(ComponentBuilderContext context, ElementBuilder element, PropTypeInfo prop, YamlNode node)
        {
            if (prop.Type != typeof(LocalisedString))
            {
                return(null);
            }

            return(new Provider(node.ToScalar().Value));
        }
Exemplo n.º 3
0
        public bool Handle(ComponentBuilderContext context, string name, YamlNode node)
        {
            if (name != "name")
            {
                return(false);
            }

            context.Name = node.ToScalar().Value;
            return(true);
        }
Exemplo n.º 4
0
        public static bool ToBoolean(this YamlNode node)
        {
            var s = node.ToScalar().Value;

            if (bool.TryParse(s, out var v))
            {
                return(v);
            }

            throw new YamlComponentException($"Cannot convert '{s}' to boolean.", node);
        }
Exemplo n.º 5
0
        public static float ToSingle(this YamlNode node)
        {
            var s = node.ToScalar().Value;

            if (float.TryParse(s, NumberStyles.Any, NumberFormatInfo.InvariantInfo, out var v))
            {
                return(v);
            }

            throw new YamlComponentException($"Cannot convert '{s}' to number.", node);
        }
Exemplo n.º 6
0
        public IPropProvider Resolve(ComponentBuilderContext context, ElementBuilder element, PropTypeInfo prop, YamlNode node)
        {
            if (!prop.Type.IsEnum)
            {
                return(null);
            }

            var value = node.ToScalar().Value;

            if (Enum.TryParse(prop.Type, value, IgnoreEnumCase, out var parsed))
            {
                return(new Provider(parsed, prop.Type));
            }

            throw new YamlComponentException($"Cannot convert '{value}' to enum {prop.Type}.", node);
        }
Exemplo n.º 7
0
        public IPropProvider Resolve(ComponentBuilderContext context, ElementBuilder element, PropTypeInfo prop, YamlNode node)
        {
            if (!prop.Type.IsPrimitive && prop.Type != typeof(string))
            {
                return(null);
            }

            var value = node.ToScalar().Value;

            try
            {
                return(new Provider(Convert.ChangeType(value, prop.Type, CultureInfo.InvariantCulture)));
            }
            catch (Exception e)
            {
                throw new YamlComponentException($"Cannot convert '{value}' to type {prop.Type}.", node, e);
            }
        }
Exemplo n.º 8
0
        static Color4 ParseColor(YamlNode node)
        {
            var value = node.ToScalar().Value;

            if (ParseColorString(value, node, out var color))
            {
                return(color);
            }

            var parts = value.Split(',');

            switch (parts.Length)
            {
            // name, alpha
            case 2:
                if (!ParseColorString(parts[0], node, out color))
                {
                    throw new YamlComponentException($"Cannot convert '{parts[0]}' to named color.", node);
                }

                color.A = node.ToSingle(parts[1]);

                return(color);

            // r, g, b, [alpha]
            case 3:
            case 4:
                return(new Color4(
                           node.ToSingle(parts[0]) / byte.MaxValue,
                           node.ToSingle(parts[1]) / byte.MaxValue,
                           node.ToSingle(parts[2]) / byte.MaxValue,
                           parts.Length == 4 ? node.ToSingle(parts[3]) : 1)); // alpha is [0, 1] so we don't divide
            }

            throw new YamlComponentException("Must be a scalar containing three or four components representing R, G, B and optionally A.", node);
        }