public static async Task <ElementManager> DeserializeObjectAsync(TextReader reader) { ISubjectParsingHandler lastSubjectHandler = null; EventContainer lastSubject = null; //int lastDeep = 0; var line = await reader.ReadLineAsync(); int l = 0; var em = new ElementManager(); while (line != null) { if (line.StartsWith("//") || line.StartsWith("[") && line.EndsWith("]")) { } else { var split = line.Split(','); var mahou = split[0].TrimStart(); var deep = split[0].Length - mahou.Length; if (deep == 0) { var handler = Register.GetSubjectHandler(mahou); if (handler == null && int.TryParse(mahou, out var flag)) { var magicWord = ElementTypeSign.GetString(flag); if (magicWord != null) { handler = Register.GetSubjectHandler(magicWord); } } if (handler != null) { try { var subject = handler.Deserialize(split); var eg = em.GetOrAddGroup(subject.ZDistance); eg.AddSubject(subject); lastSubject = subject; } catch (Exception ex) { Console.WriteLine($"Error while parsing subject. L {l}: `{line}`\r\n{ex}"); lastSubject = null; handler = null; } } else { Console.WriteLine($"Cannot find subject handler. L {l}: `{line}`"); } lastSubjectHandler = handler; } else if (deep == 1) { if (lastSubjectHandler != null) { var actHandler = lastSubjectHandler.GetActionHandler(mahou); if (actHandler != null) { try { var action = actHandler.Deserialize(split); lastSubject.ApplyAction(action); } catch (Exception ex) { Console.WriteLine($"Error while parsing action. L {l}: `{line}`\r\n{ex}"); } } else { Console.WriteLine($"Cannot find action handler. L {l}: `{line}`"); } } else { Console.WriteLine($"Current subject is null, skipped. L {l}: `{line}`"); } } else { Console.WriteLine($"Unknown deep {deep}. L {l}: `{line}`"); } } //var deepMinus = deep - lastDeep; //lastDeep = deep; //if (deepMinus < 0) //{ // while (expression) // { // stack.pop; // } //} line = await reader.ReadLineAsync(); l++; } return(em); //var count = Environment.ProcessorCount - 1; //var locks = new SemaphoreSlim(count, count); //var strLock = new object(); //bool isFinished = false; //var str = await reader.ReadLineAsync(); //if (str != null) //{ //} //while (true) //{ // lock (strLock) // { // if (isFinished) break; // } // var inStr = await reader.ReadLineAsync(); // if (inStr == null) // { // lock (strLock) // { // isFinished = true; // } // } // else // { // } //} //while (locks.CurrentCount != count) //{ // await Task.Delay(1); //} }
public static ISubjectParsingHandler RegisterSubject(ISubjectParsingHandler handler) { SubjectHandlerDic.Add(handler.Flag, handler); return(handler); }