Пример #1
0
 private static SKONObject ParseWithMetadata(string skon, out SKONMetadata meta)
 {
     return(SKON.Parse(metadataString + skon, out meta));
 }
Пример #2
0
        /// <summary>
        /// Writes a SKEMAObject.
        /// </summary>
        /// <param name="obj">The object to write.</param>
        /// <returns>A string to write into a file.</returns>
        public static string Write(SKEMAObject obj, SKONMetadata metadata = default(SKONMetadata))
        {
            if (obj.Type != SKEMAType.MAP)
            {
                throw new ArgumentException("SKEMAObject to write must be of type map!");
            }

            // We might want to do something here?
            metadata.LanguageVersion = LanguageVersion;

            StringBuilder sb = new StringBuilder();

            sb.Append($"{SKON.Metadelimit}Version: {metadata.LanguageVersion}{SKON.Metadelimit}\n");
            sb.Append($"{SKON.Metadelimit}DocumentVersion: \"{metadata.DocuemntVersion}\"{SKON.Metadelimit}\n");
            if (metadata.SKEMA != null && metadata.SKEMA.Length > 0)
            {
                sb.Append($"{SKON.Metadelimit}SKEMA: \"{metadata.SKEMA}\"{SKON.Metadelimit}\n");
            }

            List <LinkedList <SKEMAObject> > sccs = new ReferenceSolver().FindStronglyConnectedComponents(obj, (v) =>
            {
                List <SKEMAObject> successors = new List <SKEMAObject>();

                switch (v.Type)
                {
                case SKEMAType.REFERENCE:
                    if (v.ReferenceSKEMA.Type == SKEMAType.REFERENCE || v.ReferenceSKEMA.Type == SKEMAType.ARRAY || v.ReferenceSKEMA.Type == SKEMAType.MAP)
                    {
                        successors.Add(v.ReferenceSKEMA);
                    }
                    break;

                case SKEMAType.ANY:
                case SKEMAType.STRING:
                case SKEMAType.INTEGER:
                case SKEMAType.FLOAT:
                case SKEMAType.BOOLEAN:
                case SKEMAType.DATETIME:
                    break;

                case SKEMAType.MAP:
                    foreach (string key in v.Keys)
                    {
                        SKEMAObject w = v[key];
                        if (w.Type == SKEMAType.REFERENCE || w.Type == SKEMAType.ARRAY || w.Type == SKEMAType.MAP)
                        {
                            successors.Add(w);
                        }
                    }
                    break;

                case SKEMAType.ARRAY:
                    if (v.ArrayElementSKEMA.Type == SKEMAType.REFERENCE || v.ArrayElementSKEMA.Type == SKEMAType.ARRAY || v.ArrayElementSKEMA.Type == SKEMAType.MAP)
                    {
                        successors.Add(v.ArrayElementSKEMA);
                    }
                    break;

                default:
                    break;
                }

                //Console.WriteLine($"Found {successors.Count} successsors!");
                foreach (var s in successors)
                {
                    //Console.WriteLine(s.Type);
                }

                return(successors);
            });

            if (sccs.Count > 1)
            {
                List <LinkedList <SKEMAObject> > badSccs = new List <LinkedList <SKEMAObject> >();

                foreach (var scc in sccs)
                {
                    //Console.WriteLine($"Component (Length {scc.Count}):");

                    if (scc.Count == 1 && scc.First.Value.Type != SKEMAType.REFERENCE)
                    {
                        // This strongly connected component can't be bad
                        continue;
                    }

                    bool containsDefiniton = false;

                    foreach (SKEMAObject element in scc)
                    {
                        //Console.WriteLine(element.Type);

                        if (element.Type == SKEMAType.REFERENCE && element.ReferenceSKEMA != null)
                        {
                            containsDefiniton = true;
                            //Console.WriteLine("Component Contains Definition!");
                            break;
                        }
                    }

                    if (containsDefiniton == false)
                    {
                        badSccs.Add(scc);
                    }
                }

                if (badSccs.Count > 0)
                {
                    throw new CouldNotSolveReferencesException(badSccs);
                }
            }

            List <SKEMAObject> references = FindReferences(obj);

            foreach (SKEMAObject reference in references)
            {
                sb.Append("define " + reference.Reference + ": " + WriteObject(reference.ReferenceSKEMA, 0) + ",\n");
            }

            foreach (string key in obj.Keys)
            {
                sb.Append(key + ": " + WriteObject(obj[key], 0) + ",\n");
            }

            return(sb.ToString());
        }