protected override ElementBuilder Render(ComponentBuilderContext context)
        {
            var render = null as YamlNode;

            foreach (var(keyNode, valueNode) in _mapping)
            {
                try
                {
                    var key = keyNode.ToScalar().Value;

                    if (key == "render")
                    {
                        render = valueNode;
                        continue;
                    }

                    if (!PartHandler.Handle(context, key, valueNode))
                    {
                        throw new YamlComponentException($"Invalid component part '{key}'.", keyNode);
                    }
                }
                catch (Exception e)
                {
                    context.OnException(e);
                }
            }

            if (render == null)
            {
                return(null);
            }

            return(BuildElement(context, render));
        }
        // resolving a style delegate parameter
        public IPropProvider Resolve(ComponentBuilderContext context, ElementBuilder element, PropTypeInfo prop, YamlNode node)
        {
            if (!IsStyleDelegate(prop.Type))
            {
                return(null);
            }

            var provider = new Provider(prop.Type);

            foreach (var(key, value) in node.ToMapping())
            {
                try
                {
                    // find member by name
                    var memberName = key.ToScalar().Value;
                    var member     = provider.FindMember(memberName);

                    // resolve member using prop provider
                    var memberProvider = member == null ? null : ((IYamlComponentBuilder)context.Builder).PropResolver.Resolve(context, null, member, value);

                    if (memberProvider == null)
                    {
                        throw new YamlComponentException($"Cannot resolve property or field '{memberName}' in element {provider.DrawableType}.", key);
                    }

                    provider.Properties[member] = memberProvider;
                }
                catch (Exception e)
                {
                    context.OnException(e);
                }
            }

            return(provider);
        }
示例#3
0
        public bool Handle(ComponentBuilderContext context, string name, YamlNode node)
        {
            if (name != "import")
            {
                return(false);
            }

            var assemblies = new List <Assembly>();

            foreach (var item in node.ToSequence())
            {
                try
                {
                    assemblies.Add(Assembly.LoadFrom(item.ToScalar().Value));
                }
                catch (Exception e)
                {
                    context.OnException(e);
                }
            }

            // append as element resolver with new assemblies
            var builder = (IYamlComponentBuilder)context.Builder;

            builder.ElementResolver = new CompositeElementResolver(assemblies.Select(a => new AssemblyElementResolver(a)).Append(builder.ElementResolver));

            return(true);
        }