private static void Counter(int from, int to, FeedBack fb) { for (int val = from; val <= to; val++) { fb?.Invoke(val); } }
private void WriteClassesToFile(string path, IEnumerable <JsonType> types) { FeedBack?.Invoke($"Writing {path}"); using (var sw = new StreamWriter(path, false, Encoding.UTF8)) { WriteClassesToFile(sw, types); } }
private static void Counter(Int32 from, Int32 to, FeedBack fb) { for (Int32 value = from; value <= to; value++) { if (fb != null) { fb.Invoke(value); } } }
/// <summary> /// Creates factory entities (mostly segment, arcs, cotations...) in <see cref="PicFactory"/> class instance passed as first argument /// </summary> /// <param name="factory">Instance of class <see cref="PicFactory"/> to be populated with entities</param> /// <param name="stack">Array of <see cref="Paramerter"/> to apply while generating entities</param> public void CreateFactoryEntities(PicFactory factory, ParameterStack stackIn) { ParameterStack stack = ConvertIn(stackIn); var tempList = new List <string>(MessageList); MessageList.Clear(); var handler = new ComponentLoader.FeedbackEmitted(OnFeedbackAdded); ComponentLoader.OnFeedbackEmitted += handler; Plugin.CreateFactoryEntities(factory, stack, Transform2D.Identity); // --- US units --- stackIn = ConvertOut(stack); ConvertOutRef(factory); // --- ComponentLoader.OnFeedbackEmitted -= handler; if (!MessageList.SequenceEqual(tempList)) { FeedBack?.Invoke(this, MessageList); } }
public void GenerateClasses() { if (CodeWriter == null) { CodeWriter = new CSharpCodeWriter(); } if (ExplicitDeserialization && !(CodeWriter is CSharpCodeWriter)) { throw new ArgumentException("Explicit deserialization is obsolete and is only supported by the C# provider."); } if (used) { throw new InvalidOperationException("This instance of JsonClassGenerator has already been used. Please create a new instance."); } used = true; var writeToDisk = TargetFolder != null; if (writeToDisk && !Directory.Exists(TargetFolder)) { Directory.CreateDirectory(TargetFolder); } JObject[] examples; var example = Example.StartsWith("HTTP/") ? Example.Substring(Example.IndexOf("\r\n\r\n")) : Example; using (var sr = new StringReader(example)) using (var reader = new JsonTextReader(sr)) { var json = JToken.ReadFrom(reader); if (json is JArray) { examples = ((JArray)json).Cast <JObject>().ToArray(); } else if (json is JObject) { examples = new[] { (JObject)json }; } else { throw new Exception("Sample JSON must be either a JSON array, or a JSON object."); } } Types = new List <JsonType>(); Names.Add(MainClass); var rootType = new JsonType(this, examples[0]); rootType.IsRoot = true; rootType.AssignName(MainClass, MainClass); GenerateClass(examples, rootType); if (DeduplicateClasses) { FeedBack?.Invoke("De-duplicating classes"); DeDuplicateClasses(); } FeedBack?.Invoke("Writing classes to disk."); if (writeToDisk) { var parentFolder = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); if (writeToDisk && !NoHelperClass && ExplicitDeserialization) { File.WriteAllBytes(Path.Combine(TargetFolder, "JsonClassHelper.cs"), Properties.Resources.JsonClassHelper); } if (SingleFile) { WriteClassesToFile(Path.Combine(TargetFolder, MainClass + CodeWriter.FileExtension), Types); } else { foreach (var type in Types) { var folder = TargetFolder; if (!UseNestedClasses && !type.IsRoot && SecondaryNamespace != null) { var s = SecondaryNamespace; if (s.StartsWith(Namespace + ".")) { s = s.Substring(Namespace.Length + 1); } folder = Path.Combine(folder, s); Directory.CreateDirectory(folder); } WriteClassesToFile(Path.Combine(folder, (UseNestedClasses && !type.IsRoot ? MainClass + "." : string.Empty) + type.AssignedName + CodeWriter.FileExtension), new[] { type }); } } } else if (OutputStream != null) { WriteClassesToFile(OutputStream, Types); } }
private void GenerateClass(JObject[] examples, JsonType type) { var jsonFields = new Dictionary <string, JsonType>(); var fieldExamples = new Dictionary <string, IList <object> >(); var first = true; foreach (var obj in examples) { foreach (var prop in obj.Properties()) { JsonType fieldType; var currentType = new JsonType(this, prop.Value); var propName = prop.Name; if (jsonFields.TryGetValue(propName, out fieldType)) { var commonType = fieldType.GetCommonType(currentType); jsonFields[propName] = commonType; } else { var commonType = currentType; if (first) { commonType = commonType.MaybeMakeNullable(this); } else { commonType = commonType.GetCommonType(JsonType.GetNull(this)); } jsonFields.Add(propName, commonType); fieldExamples[propName] = new List <object>(); } var fe = fieldExamples[propName]; var val = prop.Value; if (val.Type == JTokenType.Null || val.Type == JTokenType.Undefined) { if (!fe.Contains(null)) { fe.Insert(0, null); } } else { var v = val.Type == JTokenType.Array || val.Type == JTokenType.Object ? val : val.Value <object>(); if (!fe.Any(x => v.Equals(x))) { fe.Add(v); } } } first = false; } if (UseNestedClasses) { foreach (var field in jsonFields) { Names.Add(field.Key.ToLower()); } } foreach (var field in jsonFields) { var fieldType = field.Value; if (fieldType.Type == JsonTypeEnum.Object) { var subexamples = new List <JObject>(examples.Length); foreach (var obj in examples) { JToken value; if (obj.TryGetValue(field.Key, out value)) { if (value.Type == JTokenType.Object) { subexamples.Add((JObject)value); } } } fieldType.AssignName(CreateUniqueClassName(field.Key), field.Key); GenerateClass(subexamples.ToArray(), fieldType); } if (fieldType.InternalType != null && fieldType.InternalType.Type == JsonTypeEnum.Object) { var subexamples = new List <JObject>(examples.Length); foreach (var obj in examples) { JToken value; if (obj.TryGetValue(field.Key, out value)) { if (value.Type == JTokenType.Array) { foreach (var item in (JArray)value) { if (!(item is JObject)) { throw new NotSupportedException("Arrays of non-objects are not supported yet."); } subexamples.Add((JObject)item); } } else if (value.Type == JTokenType.Object) { foreach (var item in (JObject)value) { if (!(item.Value is JObject)) { throw new NotSupportedException("Arrays of non-objects are not supported yet."); } subexamples.Add((JObject)item.Value); } } } } field.Value.InternalType.AssignName(CreateUniqueClassNameFromPlural(field.Key), ConvertPluralToSingle(field.Key)); GenerateClass(subexamples.ToArray(), field.Value.InternalType); } } type.Fields = jsonFields.Select(x => new FieldInfo(this, x.Key, x.Value, UsePascalCase, fieldExamples[x.Key])).ToList(); FeedBack?.Invoke($"Generating class {type.AssignedName}"); Types.Add(type); }