Ejemplo n.º 1
0
 /// <summary>
 /// Create language string resolver that uses a dictionary as a source.
 /// </summary>
 /// <param name="comparer">(optional) comparer to use</param>
 /// <param name="lineFactory">(optional) factory to use when converting line parts</param>
 /// <param name="errorHandler">(optional) handler, if null or returns false, then exception is let to be thrown</param>
 public StringAsset(IEqualityComparer <ILine> comparer, ILineFactory lineFactory, Func <Exception, bool> errorHandler) : base()
 {
     this.comparer     = comparer ?? throw new ArgumentNullException(nameof(comparer));
     this.errorHandler = errorHandler;
     this.LineFactory  = lineFactory;
     Load();
 }
Ejemplo n.º 2
0
        /// <summary>
        /// Try append new <see cref="ILine"/> to <paramref name="previous"/>.
        /// </summary>
        /// <param name="factory"></param>
        /// <param name="previous">(optional) previous part</param>
        /// <param name="a0"></param>
        /// <param name="a1"></param>
        /// <param name="a2"></param>
        /// <param name="line">result</param>
        /// <typeparam name="Intf"></typeparam>
        /// <typeparam name="A0"></typeparam>
        /// <typeparam name="A1"></typeparam>
        /// <typeparam name="A2"></typeparam>
        /// <returns>true if succeeded</returns>
        public static bool TryCreate <Intf, A0, A1, A2>(this ILineFactory factory, ILine previous, A0 a0, A1 a1, A2 a2, out Intf line) where Intf : ILine
        {
            if (factory == null)
            {
                line = default; return(false);
            }
            Intf result = default;

            if (factory is ILineFactory <Intf, A0, A1, A2> _casted && _casted.TryCreate(factory, previous, a0, a1, a2, out result))
            {
                line = result; return(true);
            }
            ILineFactory <Intf, A0, A1, A2> casted;

            if (factory is ILineFactoryCastable castable && (casted = castable.Cast <Intf, A0, A1, A2>()) != null && casted.TryCreate(factory, previous, a0, a1, a2, out result))
            {
                line = result; return(true);
            }
            ILine result_ = null;

            if (factory is ILineFactoryByArgument __casted && __casted.TryCreate(factory, previous, LineArgument.Create <Intf, A0, A1, A2>(a0, a1, a2), out result_) && result_ is Intf result__)
            {
                line = result__; return(true);
            }
            line = default;
            return(false);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Clone <paramref name="line"/>.
        /// </summary>
        /// <param name="factory"></param>
        /// <param name="line"></param>
        /// <returns></returns>
        /// <exception cref="LineException">on append error</exception>
        public static ILine Clone(this ILineFactory factory, ILine line)
        {
            ILine result = null;
            StructList16 <ILine> args = new StructList16 <ILine>();

            for (ILine l = line; l != null; l = l.GetPreviousPart())
            {
                if (l is ILineArgument || l is ILineArgumentEnumerable)
                {
                    args.Add(l);
                }
            }
            for (int i = args.Count - 1; i >= 0; i--)
            {
                ILine l = args[i];
                if (l is ILineArgumentEnumerable enumr)
                {
                    foreach (ILineArgument args_ in enumr)
                    {
                        result = factory.Create(result, args_);
                    }
                }

                if (l is ILineArgument arg)
                {
                    result = factory.Create(result, arg);
                }
            }
            return(result);
        }
 /// <summary>
 /// Create new .json reader.
 /// </summary>
 /// <param name="ext"></param>
 /// <param name="lineFactory"></param>
 public JsonLinesReader(string ext, ILineFactory lineFactory)
 {
     this.Extension   = ext ?? throw new ArgumentNullException(nameof(ext));
     this.lineFormat  = new LineFormat(" :\\", false, " :\\", false, lineFactory, null) ?? throw new ArgumentNullException(nameof(lineFactory));
     this.LineFactory = lineFactory;
     lineFactory.TryGetResolver(out resolver);
 }
Ejemplo n.º 5
0
        /// <summary>
        /// Append
        /// </summary>
        /// <param name="appender"></param>
        /// <param name="previous"></param>
        /// <param name="a0"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        public bool TryCreate(ILineFactory appender, ILine previous, A0 a0, out Intf result)
        {
            var _result = Func(appender, previous, a0);

            result = _result;
            return(_result != default);
        }
Ejemplo n.º 6
0
 /// <summary>
 /// Create localization asset with default properties.
 /// </summary>
 public StringAsset() : base()
 {
     this.comparer     = LineComparer.Default;
     this.errorHandler = null;
     this.LineFactory  = LineAppender.Default;
     Load();
 }
Ejemplo n.º 7
0
        /// <summary>
        /// Append <see cref="StringLocalizerParameter"/>.
        /// </summary>
        /// <param name="appender"></param>
        /// <param name="previous"></param>
        /// <param name="parameterName"></param>
        /// <param name="parameterValue"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        public virtual bool TryCreate(ILineFactory appender, ILine previous, string parameterName, string parameterValue, out ILineParameter result)
        {
            // Try resolve
            ILineArgument args;
            ILine         resolved;

            if (Resolver.TryResolveParameter(previous, parameterName, parameterValue, out args) && this.TryCreate(previous, args, out resolved) && resolved is ILineParameter castedResolved)
            {
                // Return as parameter and as resolved instance
                result = castedResolved;
                return(true);
            }

            IParameterInfo pi;

            if (ParameterInfos.TryGetValue(parameterName, out pi))
            {
                if (pi.InterfaceType == typeof(ILineHint))
                {
                    result = new StringLocalizerHint(appender, previous, parameterName, parameterValue); return(true);
                }
                if (pi.InterfaceType == typeof(ILineCanonicalKey))
                {
                    result = new StringLocalizerCanonicalKey(appender, previous, parameterName, parameterValue); return(true);
                }
                if (pi.InterfaceType == typeof(ILineNonCanonicalKey))
                {
                    result = new StringLocalizerNonCanonicalKey(appender, previous, parameterName, parameterValue); return(true);
                }
            }

            // Return as parameter
            result = new StringLocalizerParameter(appender, previous, parameterName, parameterValue);
            return(true);
        }
Ejemplo n.º 8
0
        /// <summary>
        /// Append new <see cref="ILine"/> to <paramref name="previous"/>.
        /// </summary>
        /// <param name="factory"></param>
        /// <param name="a0"></param>
        /// <param name="a1"></param>
        /// <param name="a2"></param>
        /// <param name="previous">(optional) previous part</param>
        /// <typeparam name="Intf"></typeparam>
        /// <typeparam name="A0"></typeparam>
        /// <typeparam name="A1"></typeparam>
        /// <typeparam name="A2"></typeparam>
        /// <returns>Line</returns>
        /// <exception cref="LineException">If part could not append <typeparamref name="Intf"/></exception>
        public static Intf Create <Intf, A0, A1, A2>(this ILineFactory factory, ILine previous, A0 a0, A1 a1, A2 a2) where Intf : ILine
        {
            if (factory == null)
            {
                throw new LineException(previous, "Appender is not found.");
            }
            Intf result = default;

            if (factory is ILineFactory <Intf, A0, A1, A2> _casted && _casted.TryCreate(factory, previous, a0, a1, a2, out result))
            {
                return(result);
            }
            ILineFactory <Intf, A0, A1, A2> casted;

            if (factory is ILineFactoryCastable castable && (casted = castable.Cast <Intf, A0, A1, A2>()) != null && casted.TryCreate(factory, previous, a0, a1, a2, out result))
            {
                return(result);
            }
            ILine result_ = null;

            if (factory is ILineFactoryByArgument __casted && __casted.TryCreate(factory, previous, LineArgument.Create <Intf, A0, A1, A2>(a0, a1, a2), out result_) && result_ is Intf result__)
            {
                return(result__);
            }
            throw new LineException(previous, $"Appender doesn't have capability to append {nameof(Intf)}.");
        }
Ejemplo n.º 9
0
 /// <summary>
 /// Convenience constructor that adds one lines source <paramref name="reader"/>.
 ///
 /// <paramref name="reader"/> must implement one of:
 /// <list type="bullet">
 /// <item>IEnumerable&gt;KeyValuePair&gt;ILine, IString&lt;&lt;</item>
 /// <item>IEnumerable&gt;KeyValuePair&gt;string, IString&lt;&lt;</item>
 /// <item>IEnumerable&gt;KeyValuePair&gt;ILine, string&lt;&lt;</item>
 /// <item>IEnumerable&gt;KeyValuePair&gt;string, string&lt;&lt;</item>
 /// <item>IEnumerable&gt;ILineTree&lt;</item>
 /// </list>
 /// </summary>
 /// <param name="reader">initial reader</param>
 /// <param name="lineFormat"></param>
 /// <param name="comparer">(optional) comparer to use</param>
 /// <param name="errorHandler">(optional) handler, if null or returns false, then exception is let to be thrown</param>
 public StringAsset(IEnumerable reader, ILineFormat lineFormat = default, IEqualityComparer <ILine> comparer = default, Func <Exception, bool> errorHandler = null) : base()
 {
     this.comparer     = comparer ?? LineComparer.Default;
     this.errorHandler = errorHandler;
     this.LineFactory  = LineAppender.Default;
     Add(reader ?? throw new ArgumentNullException(nameof(reader)), lineFormat);
     Load();
 }
Ejemplo n.º 10
0
 /// <summary>
 /// Create new xml reader
 /// </summary>
 /// <param name="extension"></param>
 /// <param name="lineFactory">Line factory that converts parameters into <see cref="ILine"/>s.</param>
 /// <param name="xmlReaderSettings"></param>
 public XmlLinesReader(string extension, ILineFactory lineFactory, XmlReaderSettings xmlReaderSettings = default)
 {
     this.Extension         = extension;
     this.xmlReaderSettings = xmlReaderSettings ?? CreateXmlReaderSettings();
     this.LineFactory       = lineFactory ?? throw new ArgumentNullException(nameof(lineFactory));
     // Extract resolver from line factory
     lineFactory.TryGetResolver(out resolver);
 }
Ejemplo n.º 11
0
 /// <summary>
 /// Get parameter infos
 /// </summary>
 /// <param name="lineFactory"></param>
 /// <param name="parameterInfos"></param>
 /// <returns></returns>
 public static bool TryGetParameterInfos(this ILineFactory lineFactory, out IParameterInfos parameterInfos)
 {
     if (lineFactory is ILineFactoryParameterInfos lineFactory1 && lineFactory1.ParameterInfos != null)
     {
         parameterInfos = lineFactory1.ParameterInfos; return(true);
     }
     parameterInfos = default;
     return(false);
 }
Ejemplo n.º 12
0
 /// <summary>
 /// Get associated resolver.
 /// </summary>
 /// <param name="lineFactory"></param>
 /// <param name="resolver"></param>
 /// <returns></returns>
 public static bool TryGetResolver(this ILineFactory lineFactory, out IResolver resolver)
 {
     if (lineFactory is ILineFactoryResolver lineFactory1 && lineFactory1.Resolver != null)
     {
         resolver = lineFactory1.Resolver; return(true);
     }
     resolver = default;
     return(false);
 }
Ejemplo n.º 13
0
 /// <summary>
 /// Create new ini file reader.
 /// </summary>
 /// <param name="ext"></param>
 /// <param name="lineFactory"></param>
 public IniLinesReader(string ext, ILineFactory lineFactory)
 {
     this.Extension       = ext ?? throw new ArgumentNullException(nameof(ext));
     this.LineFactory     = lineFactory ?? throw new ArgumentNullException(nameof(LineFactory));
     this.escaper_section = new LineFormat("\\:[]", true, "\\:[]", true, lineFactory, null);
     this.escaper_key     = new LineFormat("\\:= ", true, "\\:= ", true, lineFactory, null);
     this.LineFactory     = lineFactory;
     lineFactory.TryGetResolver(out resolver);
 }
Ejemplo n.º 14
0
 public bool TryCreate(
     ILineFactory factory,
     ILine previous,
     string parameterName,
     string parameterValue,
     out ILineCanonicalKey line)
 {
     line = new LineCanonicalKey(factory, previous, parameterName, parameterValue);
     return(true);
 }
Ejemplo n.º 15
0
        /// <summary>
        /// Clone <see cref="ILineKey"/> parts.
        /// </summary>
        /// <param name="line"></param>
        /// <param name="appender">(optional) appender to use for clone. If null uses the appender of <paramref name="line"/></param>
        /// <param name="parameterInfos">(optional) for checking which parameters are keys</param>
        /// <returns>clone of key parts</returns>
        /// <exception cref="LineException">If cloning failed.</exception>
        public static ILine CloneKey(this ILine line, ILineFactory appender = default, IParameterInfos parameterInfos = null)
        {
            if (appender == null)
            {
                appender = line.GetAppender();
            }
            ILine result = null;

            if (parameterInfos == null)
            {
                appender.TryGetParameterInfos(out parameterInfos);
            }

            StructList16 <ILine> args = new StructList16 <ILine>();

            for (ILine l = line; l != null; l = l.GetPreviousPart())
            {
                if (l is ILineArgument || l is ILineArgumentEnumerable)
                {
                    args.Add(l);
                }
            }

            for (int i = args.Count - 1; i >= 0; i--)
            {
                ILine l = args[i];
                if (l is ILineParameterEnumerable lineParameters)
                {
                    foreach (ILineParameter lineParameter in lineParameters)
                    {
                        if (lineParameter.IsCanonicalKey(parameterInfos))
                        {
                            result = appender.Create <ILineCanonicalKey, string, string>(result, lineParameter.ParameterName, lineParameter.ParameterValue);
                        }
                        else if (lineParameter.IsNonCanonicalKey(parameterInfos))
                        {
                            result = appender.Create <ILineNonCanonicalKey, string, string>(result, lineParameter.ParameterName, lineParameter.ParameterValue);
                        }
                    }
                }
                if (l is ILineParameter parameter)
                {
                    if (parameter.IsCanonicalKey(parameterInfos))
                    {
                        result = appender.Create <ILineCanonicalKey, string, string>(result, parameter.ParameterName, parameter.ParameterValue);
                    }
                    else if (parameter.IsNonCanonicalKey(parameterInfos))
                    {
                        result = appender.Create <ILineNonCanonicalKey, string, string>(result, parameter.ParameterName, parameter.ParameterValue);
                    }
                }
            }
            return(result ?? appender.Create <ILinePart>(null));
        }
Ejemplo n.º 16
0
        public SessionDrawer(ISessionCircleFactory sessionCircleFactory, ISessionCircleList sessionCircles, ILineFactory lineFactory,
                             ICanvasWrapper canvas, ISessionDetail sessionDetail)
        {
            this.sessionCircleFactory = sessionCircleFactory;
            this.sessionCircles       = sessionCircles;
            this.lineFactory          = lineFactory;
            this.canvas        = canvas;
            this.sessionDetail = sessionDetail;

            this.canvas.OnMouseMove(MouseMove);
            this.canvas.OnMouseUp(EndMove);
        }
Ejemplo n.º 17
0
 /// <summary>
 /// Get appender from <paramref name="part"/>.
 /// If its null, follows to previous part.
 /// </summary>
 /// <param name="part"></param>
 /// <param name="appender"></param>
 /// <returns>true if appender was found</returns>
 public static bool TryGetAppender(this ILine part, out ILineFactory appender)
 {
     for (ILine p = part; p != null; p = p.GetPreviousPart())
     {
         if (p is ILineAppendable appendable && appendable.Appender != null)
         {
             appender = appendable.Appender; return(true);
         }
     }
     appender = default;
     return(false);
 }
            public bool TryCreate(ILineFactory factory, ILine previous, ILineArgument arguments, out ILine line)
            {
                ILine result = previous;

                foreach (var f in factories)
                {
                    if (!f.TryCreate(factory, result, arguments, out result))
                    {
                        line = default; return(false);
                    }
                }
                line = result;
                return(true);
            }
Ejemplo n.º 19
0
        /// <summary>
        /// Append enumeration of parameters and keys.
        /// </summary>
        /// <param name="part"></param>
        /// <param name="parameters">enumeration of parameters to append</param>
        /// <param name="parameterInfos">(optional) instructions on whether to instantiate as parameter or key. See ParameterInfos.Default for default configuration</param>
        /// <returns>new key that is appended to this key</returns>
        /// <exception cref="LineException">If key doesn't implement ILineParameterAssignable, or append failed</exception>
        public static ILine Parameters(this ILine part, IEnumerable <KeyValuePair <string, string> > parameters, IParameterInfos parameterInfos)
        {
            ILineFactory appender = part.GetAppender();

            foreach (var parameter in parameters)
            {
                if (parameter.Key == null)
                {
                    continue;
                }
                part = part.Parameter(parameter.Key, parameter.Value, parameterInfos);
            }
            return(part);
        }
Ejemplo n.º 20
0
        /// <summary>
        /// Append enumeration of parameters.
        /// </summary>
        /// <param name="part"></param>
        /// <param name="parameters">enumeration of parameters to append</param>
        /// <returns>new key that is appended to this key</returns>
        /// <exception cref="LineException">If key doesn't implement ILineParameterAssignable, or append failed</exception>
        public static ILine Parameters(this ILine part, IEnumerable <KeyValuePair <string, string> > parameters)
        {
            ILineFactory appender = part.GetAppender();

            if (appender == null)
            {
                throw new LineException(part, "Appender is not found.");
            }
            foreach (var parameter in parameters)
            {
                part = appender.Create <ILineParameter, string, string>(part, parameter.Key, parameter.Value);
            }
            return(part);
        }
Ejemplo n.º 21
0
        /// <summary>
        /// Create inlined <paramref name="subkey"/> resource.
        /// </summary>
        /// <param name="lineFactory"></param>
        /// <param name="subkey">subkey in parametrized format, e.g. "Culture:en"</param>
        /// <param name="value">(optional) value to append, if null removes previously existing the inline</param>
        /// <returns>new line with inlines or <paramref name="lineFactory"/></returns>
        /// <exception cref="LineException">If key can't be inlined.</exception>
        public static ILine Inline(this ILineFactory lineFactory, ILine subkey, byte[] value)
        {
            ILineInlines inlines = lineFactory.Create <ILineInlines>(null);

            if (value != null)
            {
                subkey = subkey.Resource(value);
            }
            if (subkey != null)
            {
                inlines[subkey] = subkey;
            }
            return(inlines);
        }
Ejemplo n.º 22
0
        /// <summary>
        /// Create a clone of <paramref name="previous"/>'s appender, and add new components to it.
        /// </summary>
        /// <param name="previous">previous part</param>
        /// <param name="appender">appender to add</param>
        /// <param name="policy">add policy</param>
        /// <returns>part with another appender</returns>
        public static ILine AddAppender(this ILine previous, ILineFactory appender, LineFactoryAddPolicy policy = LineFactoryAddPolicy.OverwriteIfExists)
        {
            ILineFactory previousAppender;

            if (previous.TryGetAppender(out previousAppender))
            {
                ILineFactory newAppender = previousAppender == null ? appender : (ILineFactory) new LineFactoryComposition().Add(previousAppender, policy).Add(appender, policy);
                return(newAppender.Create <ILinePart>(previous));
            }
            else
            {
                return(appender.Create <ILinePart>(previous));
            }
        }
Ejemplo n.º 23
0
        /// <summary>
        /// Read key from <paramref name="element"/>.
        /// </summary>
        /// <param name="element"></param>
        /// <param name="parent"></param>
        /// <param name="_lineFactory"></param>
        /// <returns>key or null</returns>
        public ILine ReadKey(XElement element, ILineTree parent, ILineFactory _lineFactory)
        {
            ILine result = null;

            // <line type="MyClass" type="something" key="something">
            if (element.Name == NameLine || element.Name == NameRoot)
            {
                result = null;
            }
            // <type:MyClass>
            else if (element.Name.NamespaceName != null && element.Name.NamespaceName.StartsWith(URN_))
            {
                string parameterName  = element.Name.NamespaceName.Substring(URN_.Length);
                string parameterValue = element.Name.LocalName;
                result = Append(parent, _lineFactory, result, parameterName, parameterValue);
            }
            else
            {
                return(null);
            }

            // Read attributes
            if (element.HasAttributes)
            {
                foreach (XAttribute attribute in element.Attributes())
                {
                    if (string.IsNullOrEmpty(attribute.Name.NamespaceName))
                    {
                        string parameterName  = attribute.Name.LocalName;
                        string parameterValue = attribute.Value;
                        if (parameterName.StartsWith("xml"))
                        {
                            continue;
                        }

                        Match m      = occuranceIndexParser.Match(parameterName);
                        Group g_name = m.Groups["name"];
                        if (m.Success && g_name.Success)
                        {
                            parameterName = g_name.Value;
                        }
                        // Append parameter
                        result = Append(parent, _lineFactory, result, parameterName, parameterValue);
                    }
                }
            }

            return(result);
        }
Ejemplo n.º 24
0
        /// <summary>
        /// Inline <paramref name="value"/> to <paramref name="culture"/>.
        /// </summary>
        /// <param name="lineFactory"></param>
        /// <param name="culture">subkey in parametrized format, e.g. "Culture:en", or "Culture:en:N:One"</param>
        /// <param name="value">(optional) value to append, if null removes previously existing the inline</param>
        /// <returns>new line with inlines or <paramref name="lineFactory"/></returns>
        /// <exception cref="LineException">If key can't be inlined.</exception>
        public static ILine InlineCulture(this ILineFactory lineFactory, string culture, IString value)
        {
            ILineInlines inlines = lineFactory.Create <ILineInlines>(null);
            ILine        subkey  = lineFactory.Create <ILineNonCanonicalKey, string, string>(null, "Culture", culture);

            if (value != null)
            {
                subkey = subkey.String(value);
            }
            if (subkey != null)
            {
                inlines[subkey] = subkey;
            }
            return(inlines);
        }
Ejemplo n.º 25
0
        /// <summary>
        /// Append <see cref="StringLocalizerHint"/>.
        /// </summary>
        /// <param name="appender"></param>
        /// <param name="previous"></param>
        /// <param name="parameterName"></param>
        /// <param name="parameterValue"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        public virtual bool TryCreate(ILineFactory appender, ILine previous, string parameterName, string parameterValue, out ILineHint result)
        {
            // Try resolve
            ILineArgument args;
            ILine         resolved;

            if (Resolver.TryResolveParameter(previous, parameterName, parameterValue, out args) && this.TryCreate(previous, args, out resolved) && resolved is ILineHint castedResolved)
            {
                // Return as parameter and as resolved instance
                result = castedResolved;
                return(true);
            }

            result = new StringLocalizerHint(appender, previous, parameterName, parameterValue);
            return(true);
        }
Ejemplo n.º 26
0
        /// <summary>
        /// Create line (part) with <paramref name="arguments"/>.
        /// </summary>
        /// <param name="factory"></param>
        /// <param name="previous"></param>
        /// <param name="arguments"></param>
        /// <returns>appended part</returns>
        /// <exception cref="LineException">If append failed due to unexpected reason</exception>
        public static ILine Create(this ILineFactory factory, ILine previous, ILineArgument arguments)
        {
            ILine result = null;

            if (factory.TryCreate(previous, arguments, out result))
            {
                return(result);
            }
            ILineFactoryByArgument argumentAdapter;

            if (LineFactoryByArgumentAdapter.Default.TryGet(arguments.GetType(), out argumentAdapter) && argumentAdapter.TryCreate(factory, previous, arguments, out result))
            {
                return(result);
            }
            throw new LineException(arguments, "Could not be appended");
        }
 public bool TryCreate(ILineFactory factory, ILine previous, ILineArgument arguments, out ILine line)
 {
     if (arguments is ILineArgument <Intf> )
     {
         Intf result;
         if (factory is ILineFactory <Intf> casted && casted.TryCreate(factory, previous, out result))
         {
             line = result; return(true);
         }
         ILineFactory <Intf> _casted;
         if (factory is ILineFactoryCastable castable && ((_casted = castable.Cast <Intf>()) != null) && _casted.TryCreate(factory, previous, out result))
         {
             line = result; return(true);
         }
     }
     line = default;
     return(false);
 }
Ejemplo n.º 28
0
        /// <summary>
        /// Create line (part) with <paramref name="arguments"/>.
        /// </summary>
        /// <param name="factory"></param>
        /// <param name="previous"></param>
        /// <param name="arguments"></param>
        /// <param name="line"></param>
        /// <returns>try if create succeeded</returns>
        /// <exception cref="LineException">If append failed due to unexpected reason</exception>
        public static bool TryCreate(this ILineFactory factory, ILine previous, ILineArgument arguments, out ILine line)
        {
            if (factory == null)
            {
                line = previous; return(false);
            }
            if (factory is ILineFactoryByArgument argFactory && argFactory.TryCreate(factory, previous, arguments, out line))
            {
                return(true);
            }
            ILineFactoryByArgument argumentAdapter;

            if (LineFactoryByArgumentAdapter.Default.TryGet(arguments.GetType(), out argumentAdapter) && argumentAdapter.TryCreate(factory, previous, arguments, out line))
            {
                return(true);
            }
            line = default;
            return(false);
        }
Ejemplo n.º 29
0
        /// <summary>
        /// Append <paramref name="right"/> to <paramref name="left"/>.
        /// </summary>
        /// <param name="factory"></param>
        /// <param name="left">part to append to</param>
        /// <param name="right"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        /// <exception cref="LineException">on append error</exception>
        public static bool TryConcat(this ILineFactory factory, ILine left, ILine right, out ILine result)
        {
            if (factory == null)
            {
                result = left; return(false);
            }
            ILine _result = left;
            StructList16 <ILine> _args = new StructList16 <ILine>();

            for (ILine l = right; l != null; l = l.GetPreviousPart())
            {
                if (l is ILineArgument || l is ILineArgumentEnumerable)
                {
                    _args.Add(l);
                }
            }
            for (int i = _args.Count - 1; i >= 0; i--)
            {
                ILine l = _args[i];
                if (l is ILineArgumentEnumerable enumr)
                {
                    foreach (ILineArgument args_ in enumr)
                    {
                        if (!factory.TryCreate(args_, out _result))
                        {
                            result = null; return(false);
                        }
                    }
                }


                if (l is ILineArgument args)
                {
                    if (!factory.TryCreate(args, out _result))
                    {
                        result = null; return(false);
                    }
                }
            }
            result = _result;
            return(false);
        }
Ejemplo n.º 30
0
 /// <summary>
 /// Append value to <paramref name="prev"/>>
 /// </summary>
 /// <param name="parent"></param>
 /// <param name="_lineFactory"></param>
 /// <param name="prev">(optional)</param>
 /// <param name="parameterName"></param>
 /// <param name="parameterValue"></param>
 /// <returns></returns>
 ILine Append(ILineTree parent, ILineFactory _lineFactory, ILine prev, string parameterName, string parameterValue)
 {
     if (parameterName == "String")
     {
         IStringFormat stringFormat;
         if (parent.TryGetStringFormat(resolver, out stringFormat))
         {
             IString valueString = stringFormat.Parse(parameterValue);
             return(LineFactory.Create <ILineString, IString>(prev, valueString));
         }
         else
         {
             return(LineFactory.Create <ILineHint, string, string>(prev, "String", parameterValue));
         }
     }
     else
     {
         return(LineFactory.Create <ILineParameter, string, string>(prev, parameterName, parameterValue));
     }
 }