public override async Task GenerateInCommonMixin(ObjectGeneration obj, FileGeneration fg) { await base.GenerateInCommonMixin(obj, fg); if (!await obj.IsMajorRecord()) { return; } using (var args = new FunctionWrapper(fg, $"public static {obj.ObjectName} Duplicate{obj.GetGenericTypes(MaskType.Normal, MaskType.NormalGetter)}")) { args.Wheres.AddRange(obj.GenericTypeMaskWheres(LoquiInterfaceType.IGetter, MaskType.Normal, MaskType.NormalGetter)); args.Add($"this {obj.Interface(obj.GetGenericTypes(MaskType.NormalGetter), getter: true, internalInterface: true)} item"); args.Add($"{nameof(FormKey)} formKey"); args.Add($"{obj.Mask(MaskType.Translation)}? copyMask = null"); } using (new BraceWrapper(fg)) { using (var args = new ArgsWrapper(fg, $"return {obj.CommonClassInstance("item", LoquiInterfaceType.IGetter, CommonGenerics.Functions, MaskType.NormalGetter)}.Duplicate{obj.GetGenericTypes(MaskType.Normal, MaskType.NormalGetter, MaskType.Translation)}")) { args.AddPassArg("item"); args.AddPassArg("formKey"); args.Add("copyMask: copyMask?.GetCrystal()"); } } fg.AppendLine(); }
private async Task GenerateForMod(ObjectGeneration obj, FileGeneration fg) { using (var args = new FunctionWrapper(fg, $"public static Task<{obj.Name}> CreateFromXmlFolder")) { args.Add("DirectoryPath dir"); args.Add("ModKey modKey"); } using (new BraceWrapper(fg)) { using (var args = new ArgsWrapper(fg, "return CreateFromXmlFolder")) { args.Add("dir: dir"); args.Add("modKey: modKey"); args.Add("errorMask: null"); } } fg.AppendLine(); using (var args = new FunctionWrapper(fg, $"public static async Task<({obj.Name} Mod, {obj.Mask(MaskType.Error)} ErrorMask)> CreateFromXmlFolderWithErrorMask")) { args.Add("DirectoryPath dir"); args.Add("ModKey modKey"); } using (new BraceWrapper(fg)) { fg.AppendLine("ErrorMaskBuilder? errorMaskBuilder = new ErrorMaskBuilder();"); using (var args = new ArgsWrapper(fg, "var ret = await CreateFromXmlFolder")) { args.Add("dir: dir"); args.Add("modKey: modKey"); args.Add("errorMask: errorMaskBuilder"); } fg.AppendLine($"var errorMask = {obj.Mask(MaskType.Error)}.Factory(errorMaskBuilder);"); fg.AppendLine("return (ret, errorMask);"); } fg.AppendLine(); using (var args = new FunctionWrapper(fg, $"public static async Task<{obj.Name}> CreateFromXmlFolder")) { args.Add("DirectoryPath dir"); args.Add("ModKey modKey"); args.Add("ErrorMaskBuilder? errorMask"); } using (new BraceWrapper(fg)) { fg.AppendLine($"var item = new {obj.Name}(modKey);"); fg.AppendLine($"var tasks = new List<Task>();"); foreach (var field in obj.IterateFields()) { if (field.GetFieldData().CustomFolder) { using (var args = new ArgsWrapper(fg, $"tasks.Add(Task.Run(() => item.CreateFromXmlFolder{field.Name}", suffixLine: "))")) { args.Add("dir: dir"); args.Add($"name: nameof({field.Name})"); args.Add($"index: (int){field.IndexEnumName}"); args.Add($"errorMask: errorMask"); } continue; } if (!(field is LoquiType loqui)) { throw new ArgumentException(); } switch (loqui.TargetObjectGeneration.GetObjectType()) { case ObjectType.Record: using (var args = new ArgsWrapper(fg, $"item.{field.Name}.CopyInFromXml")) { args.Add($"path: Path.Combine(dir.Path, \"{field.Name}.xml\")"); args.Add($"errorMask: errorMask"); args.Add($"translationMask: null"); } break; case ObjectType.Group: if (!loqui.TryGetSpecificationAsObject("T", out var subObj)) { continue; } using (var args = new ArgsWrapper(fg, $"tasks.Add(Task.Run(() => item.{field.Name}.CreateFromXmlFolder<{subObj.Name}>", suffixLine: "))")) { args.Add($"dir: dir"); args.Add($"name: nameof({field.Name})"); args.Add($"errorMask: errorMask"); args.Add($"index: (int){field.IndexEnumName}"); } break; default: break; } } fg.AppendLine("await Task.WhenAll(tasks);"); fg.AppendLine("return item;"); } fg.AppendLine(); using (var args = new FunctionWrapper(fg, $"public async Task<{obj.Mask(MaskType.Error)}?> WriteToXmlFolder")) { args.Add("DirectoryPath dir"); args.Add("bool doMasks = true"); } using (new BraceWrapper(fg)) { fg.AppendLine($"ErrorMaskBuilder? errorMaskBuilder = null;"); fg.AppendLine("dir.Create();"); fg.AppendLine("using (new FolderCleaner(dir, FolderCleaner.CleanType.AccessTime))"); using (new BraceWrapper(fg)) { fg.AppendLine($"var tasks = new List<Task>();"); foreach (var field in obj.IterateFields()) { if (!(field is LoquiType loqui)) { throw new ArgumentException(); } if (field.GetFieldData().CustomFolder) { using (var args = new ArgsWrapper(fg, $"tasks.Add(Task.Run(() => WriteToXmlFolder{field.Name}", suffixLine: "))")) { args.Add("dir: dir"); args.Add($"name: nameof({field.Name})");; args.Add($"index: (int){field.IndexEnumName}"); args.Add($"errorMask: errorMaskBuilder"); } continue; } switch (loqui.TargetObjectGeneration.GetObjectType()) { case ObjectType.Record: using (var args = new ArgsWrapper(fg, $"tasks.Add(Task.Run(() => this.{field.Name}.WriteToXml", suffixLine: "))")) { args.Add($"path: Path.Combine(dir.Path, \"{field.Name}.xml\")"); args.Add($"errorMask: errorMaskBuilder"); args.Add($"translationMask: null"); } break; case ObjectType.Group: ObjectGeneration subObj; if (field is GroupType group) { if (!group.TryGetSpecificationAsObject("T", out subObj)) { continue; } using (var args = new ArgsWrapper(fg, $"tasks.Add(Task.Run(() => {field.Name}.WriteToXmlFolder<{subObj.Name}, {subObj.Mask(MaskType.Error)}>", suffixLine: "))")) { args.Add($"dir: dir.Path"); args.Add($"name: nameof({field.Name})"); args.Add($"errorMask: errorMaskBuilder"); args.Add($"index: (int){field.IndexEnumName}"); } } else { using (var args = new ArgsWrapper(fg, $"tasks.Add(Task.Run(() => {field.Name}.WriteToXmlFolder", suffixLine: "))")) { args.Add($"dir: dir.Path"); args.Add($"name: nameof({field.Name})"); args.Add($"errorMask: errorMaskBuilder"); args.Add($"index: (int){field.IndexEnumName}"); } } break; default: break; } } fg.AppendLine("await Task.WhenAll(tasks);"); } fg.AppendLine("return null;"); } }