public static TagBuilder FirstChild(this TagBuilder tagBuilder, string html)
        {
            StringBuilder builder = new StringBuilder(html);

            builder.A(tagBuilder.InnerHtml);
            tagBuilder.InnerHtml = builder.ToString();
            return(tagBuilder);
        }
Beispiel #2
0
        private static StringBuilder CreateAppInitScriptTag(WebViewPage page, object appNameObj)
        {
            HttpServerUtilityBase server = page.Context.Server;
            UrlHelper             url    = page.Url;

            StringBuilder initPath = new StringBuilder();

            initPath.A(AppRoot).A("init.js").ToString().NamedFormat(appNameObj);

            return(CreateScriptTags(url, appNameObj, initPath.ToString()));
        }
Beispiel #3
0
        private static StringBuilder CreateDustBamTemplatesScriptTag(WebViewPage page, object appNameObj)
        {
            HttpServerUtilityBase server = page.Context.Server;
            UrlHelper             url    = page.Url;

            StringBuilder templatePath = new StringBuilder();
            Tag           script       = new Tag("script", new { src = "/dust/bamtemplates?appName={appName}".NamedFormat(appNameObj) });

            templatePath.A(script.ToHtmlString());
            return(templatePath);
        }
Beispiel #4
0
        public static MvcHtmlString DustTemplateFor(this HtmlHelper helper, object value, object wrapperAttrs = null)
        {
            Type type = value.GetType();

            foreach (PropertyInfo prop in type.GetProperties())
            {
                if (prop.CanWrite && prop.PropertyType == typeof(string))
                {
                    StringBuilder str = new StringBuilder();
                    str.A("{").Af("{0}", prop.Name).A("}");
                    prop.SetValue(value, str.ToString(), null);
                }
            }

            return(helper.InputsFor(type, value, wrapperAttrs));
        }
Beispiel #5
0
        public IOutput Create()
        {
            var sb = new StringBuilder();

            sb.Al($"namespace {_module.Namespace}.Commands");
            sb.Al("{");
            sb.I(1).Al($"public class {_request.Name} : INotification");
            sb.I(1).Al("{");
            sb.I(2).A($"public {_request.Name}(");
            foreach (var field in _request.Fields)
            {
                sb.A($"{field.GetDataType()} {field.Name.Singular.LocalVariable}, ");
            }
            sb.TrimEnd(", ");
            sb.Al(")");
            sb.I(2).Al("{");
            foreach (var field in _request.Fields)
            {
                sb.I(3).Al($"{field.Name.Value} = {field.Name.Singular.LocalVariable};");
            }
            sb.I(2).Al("}");
            sb.B();
            foreach (var item in _request.Fields)
            {
                var property = (ISnippet) new Property.Generator(item, setScope: Property.PropertyScope.NotAvailable).Create();
                sb.Al(property.Content);
            }
            sb.I(1).Al("}");
            sb.B();
            sb.I(1).Al($"public class {_request.Name}Handler : INotificationHandler<{_request.Name}>");
            sb.I(1).Al("{");
            sb.I(2).Al($"public async Task Handle({_request.Name} command, CancellationToken cancellationToken)");
            sb.I(2).Al("{");
            sb.I(3).Al("// todo: Add code to complete the command");
            sb.I(2).Al("}");
            sb.I(1).Al("}");
            sb.Al("}");

            return(new File(_request.Name + ".cs", sb.ToString(), path: "Commands"));
        }
Beispiel #6
0
    public static string ArchiveText(string namespaceName, string archiveName, List <Entity> entities)
    {
        var sb = new StringBuilder(@"using System;
using System.IO;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using Bitemporal;

namespace ").A(namespaceName).A(@"
{
    public class ").A(archiveName).A(@"
    {
        uint[] Counts;
        readonly SetSlim<string> Text;");

        for (int e = 0; e < entities.Count; e++)
        {
            var fieldCount = entities[e].Fields.Count;
            for (int f = 0; f < fieldCount; f++)
            {
                sb.A(@"
        DataSeries[] Entity").A(e).A(@"_Field").A(f).A(@";");
            }
        }
        sb.A(@"

        public ").A(archiveName).A(@"()
        {
            Counts = new uint[").A(entities.Count).A(@"];
            Text = new();");
        for (int e = 0; e < entities.Count; e++)
        {
            var fieldCount = entities[e].Fields.Count;
            for (int f = 0; f < fieldCount; f++)
            {
                sb.A(@"
            Entity").A(e).A(@"_Field").A(f).A(@" = Array.Empty<DataSeries>();");
            }
        }
        sb.A(@"
        }

        public ").A(archiveName).A(@"(string filename)
        {
            using var s = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);
            Counts = Serialize.UIntArrayGet(s);
            Text = Serialize.SetSlimStringGet(s);");
        for (int e = 0; e < entities.Count; e++)
        {
            var fieldCount = entities[e].Fields.Count;
            for (int f = 0; f < fieldCount; f++)
            {
                sb.A(@"
            Entity").A(e).A(@"_Field").A(f).A(@" = Serialize.DataSeriesArrayGet(s, Counts[").A(e).A(@"]);");
            }
        }
        sb.A(@"
        }

        public void Save(string filename)
        {
            using var s = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
            Serialize.UIntArraySet(s, Counts);
            Serialize.SetSlimStringSet(s, Text);");
        for (int e = 0; e < entities.Count; e++)
        {
            var fieldCount = entities[e].Fields.Count;
            for (int f = 0; f < fieldCount; f++)
            {
                sb.A(@"
            Serialize.DataSeriesArraySet(s, Entity").A(e).A(@"_Field").A(f).A(@");");
            }
        }
        sb.A(@"
        }

        public Snapshot SnapshotLatest => new(this, Counts, new(Counts[0]-1U));
        public Snapshot SnapshotAt(TxId txId)
        {
            var newCounts = new uint[").A(entities.Count).A(@"];
            Array.Copy(Counts, 0, newCounts, 0, ").A(entities.Count).A(@");
            var i = txId.I;
            newCounts[0] = i;");
        for (int e = 1; e < entities.Count; e++)
        {
            sb.A(@"
            i = newCounts[").A(e).A(@"];
            while (Entity").A(e).A(@"_Field0[--i].After(txId)) { };
            newCounts[").A(e).A(@"] = i;");
        }
        sb.A(@"
            return new(this, newCounts, txId);
        }

        public class Snapshot
        {
            public readonly ").A(archiveName).A(@" Archive;
            public readonly uint[] Counts;
            public readonly TxId TxId;
            public TxId NextTxId => new(TxId.I + 1U);
            SetSlim<string>? Text;");
        for (int e = 0; e < entities.Count; e++)
        {
            var fieldCount = entities[e].Fields.Count;
            for (int f = 0; f < fieldCount; f++)
            {
                sb.A(@"
            internal MapSlim<uint, DataSeries>? Entity").A(e).A(@"_Field").A(f).A(@";");
            }
        }
        sb.A(@"
            internal Snapshot(").A(archiveName).A(@" archive, uint[] counts, TxId txId)
            {
                Archive = archive;
                Counts = counts;
                TxId = txId;
            }

            public SnapshotDate this[Date date] => new(this, date);
            internal Vint AddString(string s)
            {
                var i = Archive.Text.IndexOf(s);
                if (i >= 0) return new(i);
                return new((Text ??= new()).Add(s) + Archive.Text.Count);
            }
            internal string GetString(Vint v)
            {
                return v.I < Archive.Text.Count ? Archive.Text[(int)v.I] : Text![(int)v.I - Archive.Text.Count];
            }

            public void Commit(");
        var fields0     = entities[0].Fields;
        var fieldCount0 = fields0.Count;

        sb.A(fields0[0].Type).A(@" ").A(fields0[0].Name.ToLower());
        for (int f = 1; f < fieldCount0; f++)
        {
            if (!fields0[f].Type.EndsWith(" Set"))
            {
                sb.A(@", ").A(fields0[f].Type).A(@" ").A(fields0[f].Name.ToLower());
            }
        }
        sb.A(@")
            {
                this[time.ToDate()].TxCollection.New(");
        sb.A(fields0[0].Name.ToLower());
        for (int f = 1; f < fieldCount0; f++)
        {
            if (!fields0[f].Type.EndsWith(" Set"))
            {
                sb.A(@", ").A(fields0[f].Name.ToLower());
            }
        }
        sb.A(@");
                var newCounts = new uint[").A(entities.Count).A(@"];
                Array.Copy(Counts, 0, newCounts, 0, ").A(entities.Count).A(@");
                if(Text is not null)
                {
                    for(int i = 0; i < Text.Count; i++)
                        Archive.Text.Add(Text[i]);
                }");
        for (int e = 0; e < entities.Count; e++)
        {
            var fieldCount = entities[e].Fields.Count;
            for (int f = 0; f < fieldCount; f++)
            {
                sb.A(@"
                if (Entity").A(e).A(@"_Field").A(f).A(@" is not null)
                {
                    var maxID = 0U;
                    for(int i = Entity").A(e).A(@"_Field").A(f).A(@".Count - 1; i >= 0; i--)
                    {
                        var k = Entity").A(e).A(@"_Field").A(f).A(@".Key(i);
                        if(k > maxID) maxID = k;
                    }
                    if (Archive.Entity").A(e).A(@"_Field").A(f).A(@".Length <= maxID)
                    {
                        var a = new DataSeries[maxID + 1];
                        Array.Copy(Archive.Entity").A(e).A(@"_Field").A(f).A(@", 0, a, 0, Archive.Entity").A(e).A(@"_Field").A(f).A(@".Length);
                        Archive.Entity").A(e).A(@"_Field").A(f).A(@" = a;
                        newCounts[").A(e).A(@"] = maxID + 1;
                    }
                    foreach (var kv in Entity").A(e).A(@"_Field").A(f).A(@")
                    {
                        Archive.Entity").A(e).A(@"_Field").A(f).A(@"[kv.Key] = kv.Value;
                    }
                }");
            }
        }
        sb.A(@"
                Archive.Counts = newCounts;
            }
        }

        public class SnapshotDate
        {
            public readonly Snapshot Snapshot;
            public readonly Date Date;
            internal SnapshotDate(Snapshot snapshot, Date date)
            {
                Snapshot = snapshot;
                Date = date;
            }");
        for (int e = 0; e < entities.Count; e++)
        {
            sb.A(@"
            public ").A(entities[e].Name).A(@"Collection ").A(entities[e].Name).A(@"Collection => new(this);");
        }
        sb.A(@"
        }");
        for (int e = 0; e < entities.Count; e++)
        {
            if (e != 0)
            {
                sb.A(@"
        public struct ").A(entities[e].Name).A(@"Id
        {
            public readonly uint I;
            public ").A(entities[e].Name).A(@"Id(uint id) => I = id;
        }
");
            }
            sb.A(@"
        public struct ").A(entities[e].Name).A(@"Collection : IReadOnlyCollection<").A(entities[e].Name).A(@">
        {
            public readonly SnapshotDate SD;
            public ").A(entities[e].Name).A(@"Collection(SnapshotDate sd) => SD = sd;

            public IEnumerator<").A(entities[e].Name).A(@"> GetEnumerator() => Entities().GetEnumerator();
            IEnumerator IEnumerable.GetEnumerator() => Entities().GetEnumerator();
            IEnumerable<").A(entities[e].Name).A(@"> Entities()
            {
                var i = SD.Snapshot.Counts[").A(e).A(@"];
                while (i > 0) yield return new(SD, new(--i));
            }
            public ").A(entities[e].Name).A(@" this[").A(entities[e].Name).A(@"Id id] => new(SD, id);");
            var fields     = entities[e].Fields;
            var fieldCount = fields.Count;
            sb.A(@"
            public int Count => (int)SD.Snapshot.Counts[").A(e).A(@"];
            public ").A(entities[e].Name).A(@" New(");
            sb.A(fields[0].Type).A(@" ").A(fields[0].Name.ToLower());
            for (int f = 1; f < fieldCount; f++)
            {
                if (!fields[f].Type.EndsWith(" Set"))
                {
                    sb.A(@", ").A(fields[f].Type).A(@" ").A(fields[f].Name.ToLower());
                }
            }
            sb.A(@")
            {
                var sd = SD;
                var id = sd.Snapshot.Counts[").A(e).A(@"];
                if (sd.Snapshot.Entity").A(e).A(@"_Field0 is null)
                {");
            for (int f = 0; f < fieldCount; f++)
            {
                sb.A(@"
                    sd.Snapshot.Entity").A(e).A(@"_Field").A(f).A(@" = new();");
            }
            sb.A(@"
                }
                else
                {
                    var m = sd.Snapshot.Entity").A(e).A(@"_Field0.Key(sd.Snapshot.Entity").A(e).A(@"_Field0.Count - 1);
                    if (m >= id) id = m + 1;
                }");
            for (int f = 0; f < fieldCount; f++)
            {
                if (fields[f].Type.EndsWith(" Set"))
                {
                    sb.A(@"
                sd.Snapshot.Entity").A(e).A(@"_Field").A(f).A(@"![id] = default;");
                }
                else
                {
                    sb.A(@"
                sd.Snapshot.Entity").A(e).A(@"_Field").A(f).A(@"![id] = DataSeries.Single(sd.Date, sd.Snapshot.NextTxId, ").ToVint(entities, fields[f].Type, fields[f].Name.ToLower()).A(@");");
                }
            }
            sb.A(@"
                return new(sd, new(id));
            }");
            sb.A(@"
        }

        public struct ").A(entities[e].Name).A(@"
        {
            readonly SnapshotDate SD;
            public readonly ").A(entities[e].Name).A(@"Id Id;
            public ").A(entities[e].Name).A(@"(SnapshotDate query, ").A(entities[e].Name).A(@"Id id)
            {
                SD = query;
                Id = id;
            }");
            for (int f = 0; f < fieldCount; f++)
            {
                var field = fields[f];
                sb.A(@"
            DataSeries ").A(field.Name).A(@"_DataSeries
            {
                get
                {
                    var sd = SD;
                    int i;
                    return sd.Snapshot.Entity").A(e).A(@"_Field").A(f).A(@" is not null
                        && (i = sd.Snapshot.Entity").A(e).A(@"_Field").A(f).A(@".IndexOf(Id.I)) != -1
                         ? sd.Snapshot.Entity").A(e).A(@"_Field").A(f).A(@".Value(i)
                         : sd.Snapshot.Archive.Entity").A(e).A(@"_Field").A(f).A(@"[Id.I];
                }
                set
                {
                    (SD.Snapshot.Entity").A(e).A(@"_Field").A(f).A(@" ??= new())[Id.I] = value;
                }
            }
");
                if (field.Type.EndsWith(" Set"))
                {
                    sb.A(@"
            public struct PositionsSet : IEnumerable<Position>
            {
                [System.Diagnostics.CodeAnalysis.SuppressMessage(""Style"", ""IDE0044: Add readonly modifier"")]
                Asset E;

                public PositionsSet(Asset entity) => E = entity;

                IEnumerable<Position> Items()
                {
                    var sd = E.SD;
                    return E.Positions_DataSeries.SetGet(sd.Date, sd.Snapshot.TxId).Select(i => new Position(sd, new((uint)i.I)));
                }

                public IEnumerator<Position> GetEnumerator() => Items().GetEnumerator();

                IEnumerator IEnumerable.GetEnumerator() => Items().GetEnumerator();

                public void Add(Position p)
                {
                    var sd = E.SD;
                    E.Positions_DataSeries = E.Positions_DataSeries.SetAdd(sd.Date, sd.Snapshot.NextTxId, new(p.Id.I));
                }

                public void Remove(Position p)
                {
                    var sd = E.SD;
                    E.Positions_DataSeries = E.Positions_DataSeries.SetRemove(sd.Date, sd.Snapshot.NextTxId, new(p.Id.I));
                }
            }

            public PositionsSet Positions => new(this);");
                }
                else
                {
                    sb.A(@"
            public ").A(field.Type).A(@" ").A(field.Name).A(@"
            {
                get
                {
                    var sd = SD;
                    var ds = ").A(field.Name).A(@"_DataSeries;
                    return ").ToType(entities, field.Type, "ds[sd.Date, sd.Snapshot.TxId].Item3").A(@";
                }
                set
                {
                    var sd = SD;
                    ").A(field.Name).A(@"_DataSeries = ").A(field.Name).A(@"_DataSeries.Add(sd.Date, sd.Snapshot.NextTxId, ").ToVint(entities, field.Type, "value").A(@");
                }
            }

            public IEnumerable<(Date, TxId, ").A(field.Type).A(@")> ").A(field.Name).A(@"_Audit
            {
                get
                {
                    var sd = SD;
                    var date = sd.Date;
                    var txId = sd.Snapshot.TxId;
                    return ").A(field.Name).A(@"_DataSeries
                           .Where(i => i.Item1 <= date && i.Item2 <= txId)
                           .Select(i => (i.Item1, i.Item2, ").ToType(entities, field.Type, "i.Item3").A(@"));
                }
            }

            public (Date, TxId, ").A(field.Type).A(@") ").A(field.Name).A(@"_Detail
            {
                get
                {
                    var sd = SD;
                    var row = ").A(field.Name).A(@"_DataSeries[sd.Date, sd.Snapshot.TxId];
                    return (row.Item1, row.Item2, ").ToType(entities, field.Type, "row.Item3").A(@");
                }
            }");
                }
            }
            sb.A(@"
        }");
        }
        sb.A(@"
    }
}");
        return(sb.ToString());
    }
Beispiel #7
0
        public override void CSGenerateProcess(CSGenerate rGenerate)
        {
            StartGenerateCommon();
            foreach (var rType in SerializerBinaryTypes.Types)
            {
                var rText = new StringBuilder();

                rText
                .A("using System.IO;").N()
                .A("using Core;").N()
                .A("using Core.Serializer;").N()
                .A("using Game.Serializer;").N()
                .L(2)
                .A("/// <summary>").N()
                .A("/// 文件自动生成无需又该!如果出现编译错误,删除文件后会自动生成").N()
                .A("/// </summary>").N();
                if (!string.IsNullOrEmpty(rType.Namespace))
                {
                    rText
                    .F("namespace {0}", rType.Namespace).N()
                    .A("{").N();
                }
                rText
                .F("public partial class {0}", rType.Name).N()
                .A("{").N();

                var rSerializeMemberInfo = SearchSerializeMember(rType);

                // Serialize Function
                rText
                .T(1).A("public override void Serialize(BinaryWriter rWriter)").N()
                .T(1).A("{").N()
                .T(2).A("base.Serialize(rWriter);").N();
                foreach (var rMemberInfo in rSerializeMemberInfo)
                {
                    var rParamText = GenerateClassMemberDummyText(rMemberInfo);
                    if (rMemberInfo.IsDefined(typeof(SBDynamicAttribute), true) && !IsBaseType(GetMemberType(rMemberInfo), false))
                    {
                        rText.T(2).F("rWriter.SerializeDynamic({0});", rParamText).N();
                    }
                    else
                    {
                        rText.T(2).F("rWriter.Serialize({0});", rParamText).N();
                    }
                }

                rText
                .T(1).A("}").N();

                // Deserialize Function
                rText
                .T(1).A("public override void Deserialize(BinaryReader rReader)").N()
                .T(1).A("{").N()
                .T(2).A("base.Deserialize(rReader);").N();
                foreach (var rMemberInfo in rSerializeMemberInfo)
                {
                    if (rMemberInfo.IsDefined(typeof(SBDynamicAttribute), false) && !IsBaseType(GetMemberType(rMemberInfo), false))
                    {
                        rText.T(2).F("this.{0} = {1}rReader.DeserializeDynamic({2});", rMemberInfo.Name,
                                     GenerateClassMemberTypeText(rMemberInfo),
                                     GenerateClassMemberDummyText(rMemberInfo)).N();
                    }
                    else
                    {
                        rText.T(2).F("this.{0} = {1}rReader.Deserialize({2});", rMemberInfo.Name,
                                     GenerateClassMemberTypeText(rMemberInfo),
                                     GenerateClassMemberDummyText(rMemberInfo)).N();
                    }
                }

                rText
                .T(1).A("}").N();

                rText.A("}").N();
                if (!string.IsNullOrEmpty(rType.Namespace))
                {
                    rText.A("}").N();
                }

                var rGroupName  = string.Empty;
                var rAttributes = rType.GetCustomAttributes <SBGroupAttribute>(true);
                if (rAttributes.Length > 0)
                {
                    rGroupName = rAttributes[0].GroupName;
                }

                rGenerate.Add(rText.ToString(), UtilTool.PathCombine(GeneratePath, rGroupName, rType.FullName + ".Binary.cs"));

                foreach (var rMemberInfo in rSerializeMemberInfo)
                {
                    var bDynamic = rMemberInfo.IsDefined(typeof(SBDynamicAttribute), false);
                    if (rMemberInfo.MemberType == MemberTypes.Field)
                    {
                        AnalyzeGenerateCommon((rMemberInfo as FieldInfo).FieldType, bDynamic);
                    }
                    else if (rMemberInfo.MemberType == MemberTypes.Property)
                    {
                        AnalyzeGenerateCommon((rMemberInfo as PropertyInfo).PropertyType, bDynamic);
                    }
                }
            }
            EndGenerateCommon();

            rGenerate.AddHead(mCommonSerializer.ToString(), CommonSerializerPath);
        }
Beispiel #8
0
        public IOutput Create()
        {
            string dt;

            if (_field.DataType == DataTypes.DateTimeOffset && _convertToLocalDates)
            {
                dt = "DateTime";
                if (_field.Nullable)
                {
                    dt += "?";
                }
            }
            else
            {
                dt = _field.GetDataType(ShowNullable, GuidNullable);
            }

            if (ShowNullable && _field.DataType == DataTypes.String && _field.Nullable && !dt.EndsWith("?"))
            {
                dt += "?";
            }

            var sb = new StringBuilder();

            if (_useBackingField)
            {
                sb.I(_indent).Al($"private {dt} {_field.Name.Singular.ModuleVariable}");
            }

            var display = _field.Name.Singular.Display;

            if (_field.Name.ToString() != display)
            {
                if (display.EndsWith(" Id"))
                {
                    display = display.Substring(0, display.Length - 3);
                }
                if (_useDataAnnotations)
                {
                    sb.I(_indent).Al($"[Display(Name = \"{display}\")]");
                }
            }
            if (_field.DataType == DataTypes.String)
            {
                if (!_field.Nullable && _useDataAnnotations)
                {
                    sb.I(_indent).Al("[Required]");
                }
                if (_field.MaxLength.HasValue && _useDataAnnotations)
                {
                    sb.I(_indent).A($"[StringLength({_field.MaxLength.Value}");
                    if (_field.MinLength.HasValue)
                    {
                        sb.A($", MinimumLength={_field.MinLength.Value}");
                    }
                    sb.Al(")]");
                }
            }
            else if (_field.DataType == DataTypes.DateTimeOffset && _convertToLocalDates)
            {
                sb.I(_indent).Al("[DisplayFormat(DataFormatString = Constants.DateFormatVm)]");
            }
            else if (_field.DataType == DataTypes.Decimal)
            {
                if (_field.Scale.HasValue && _field.Precision.HasValue && _useDataAnnotations)
                {
                    sb.I(_indent).Al($"[Range(typeof(decimal), \"{_field.Scale.Value}\", \"{_field.Precision.Value}\", ConvertValueInInvariantCulture = true)]");
                }
            }

            var scopes = SetScopes();

            sb.I(_indent).A($"{scopes.prop} {dt} {_field.Name}");
            if (_useBackingField)
            {
                sb.B();
                sb.I(_indent).Al("{");
                sb.I(_indent + 1).Al($"{scopes.get} get => {_field.Name.Singular.ModuleVariable};");
                sb.I(_indent + 1).Al($"{scopes.set} set");
                sb.I(_indent + 1).Al("{");
                sb.I(_indent + 2).Al($"{_field.Name.Singular.ModuleVariable} = value;");
                sb.I(_indent + 1).Al("}");
                sb.I(_indent).Al("}");
            }
            else
            {
                sb.A(" {");
                sb.A($"{scopes.get} get; ");
                sb.A($"{scopes.set} set; ");
                sb.Al("}");
            }
            return(new Snippet(sb.ToString()));
        }
        public IOutput Create()
        {
            if (!_model.IsRoot)
            {
                return(null);
            }

            var sb = new StringBuilder();

            if (Settings.SupportRegen)
            {
                sb.Al(((ISnippet) new OverwriteHeader.Generator(Settings, new GeneratorDetails()).Create()).Content);
            }
            else
            {
                sb.Al(((ISnippet) new Header.Generator(Settings, new GeneratorDetails()).Create()).Content);
            }

            foreach (var behaviour in _model.Behaviours)
            {
                sb.Al($"using {_module.Namespace}.BusinessLogic.{_model.Name}.{behaviour.Name};");
            }
            sb.B();
            sb.Al($"namespace {_module.Namespace}.Application.Controllers");
            sb.Al("{");
            sb.I(1).Al("[Route(\"api/[controller]/[action]\")]");
            sb.I(1).A(Settings.SupportRegen ? "partial" : "public");
            sb.A($" class {_model.Name}Controller");
            if (!Settings.SupportRegen)
            {
                sb.A(": ApplicationController");
            }
            sb.B();
            sb.I(1).Al("{");
            sb.I(2).Al("private readonly IMediator _mediator;");

            if (!Settings.SupportRegen)
            {
                sb.B();
                sb.I(2).Al($"public {_model.Name}Controller(IMediator mediator)");
                sb.I(2).Al("{");
                sb.I(3).Al("_mediator = mediator;");
                sb.I(2).Al("}");
            }

            foreach (var behaviour in _model.Behaviours)
            {
                sb.B();
                sb.I(2).Al($"[Http{behaviour.Verb}]");
                sb.I(2).A($"public async Task<IActionResult> {behaviour.Name}Async(");
                if (behaviour.Request is not null)
                {
                    sb.A($"[FromBody] {behaviour.Request.Name} {behaviour.Request.Name.Singular.LocalVariable}");
                }
                sb.Al(")");
                sb.I(2).Al("{");

                var request = behaviour.Request is null ?
                              new Name($"{_model.Name}{behaviour.Name}Request") :
                              behaviour.Request.Name;

                if (behaviour.Request is null)
                {
                    sb.I(3).Al($"var {request.Singular.LocalVariable} = new {request}();");
                }
                sb.I(3).A($"var result = await _mediator.Send(");
                sb.Al($"{request.Singular.LocalVariable});");
                if (behaviour.Response is not null)
                {
                    sb.I(3).A("return FromResult");
                    sb.A(behaviour.Response.IsCollection ? "<IEnumerable" : "");
                    sb.A($"<{behaviour.Response.Name}>");
                    sb.A(behaviour.Response.IsCollection ? ">" : "");
                    sb.Al("(result);");
                }
                else
                {
                    sb.I(3).Al("return NoContent();");
                }
                sb.I(2).Al("}");
            }

            sb.I(1).Al("}");
            sb.Al("}");

            var filename = _model.Name.ToString();

            filename += "Controller";
            if (Settings.SupportRegen)
            {
                filename += ".generated";
            }
            filename += ".cs";

            return(new File(filename, sb.ToString(), canOverwrite: Settings.SupportRegen));
        }
Beispiel #10
0
        public IOutput Create()
        {
            var sb = new StringBuilder();

            if (Settings.SupportRegen)
            {
                sb.Al(((ISnippet) new OverwriteHeader.Generator(Settings, new GeneratorDetails()).Create()).Content);
            }
            else
            {
                sb.Al(((ISnippet) new Header.Generator(Settings, new GeneratorDetails()).Create()).Content);
            }
            sb.Al($"namespace {_module.Namespace}.BusinessLogic.{_model.Name}.{_behaviour.Name}");
            sb.Al("{");
            var request = _behaviour.Request is null ?
                          new Name($"{_model.Name}{_behaviour.Name}Request") :
                          _behaviour.Request.Name;

            sb.I(1).A(Settings.SupportRegen ? $"public partial record" : $"public class");
            sb.A($" {request} : IRequest");
            if (_behaviour.Response is not null)
            {
                sb.A("<Result");
                sb.A(_behaviour.Response.IsCollection ? "<IEnumerable" : "");
                sb.A($"<{_behaviour.Response.Name}>");
                sb.A(_behaviour.Response.IsCollection ? ">>" : ">");
            }
            sb.B();
            sb.I(1).Al("{");
            if (_behaviour.Request is not null)
            {
                foreach (var field in _behaviour.Request.Fields)
                {
                    sb.Al(((ISnippet) new Property.Generator(field).Create()).Content);
                }
            }
            sb.I(1).Al("}");

            if (_behaviour.Response is not null)
            {
                sb.I(1).A(Settings.SupportRegen ? $"public partial record" : $"public class");
                sb.Al($" {_behaviour.Response.Name}");
                sb.I(1).Al("{");
                foreach (var field in _behaviour.Response.Fields)
                {
                    sb.Al(((ISnippet) new Property.Generator(field).Create()).Content);
                }
                sb.I(1).Al("}");
            }
            sb.Al("}");

            var filename = _model.Name.ToString();

            if (Settings.SupportRegen)
            {
                filename += ".generated";
            }
            filename += ".cs";

            return(new File(filename, sb.ToString(), path: System.IO.Path.Combine(_model.Name.ToString(), _behaviour.Name.ToString()), canOverwrite: Settings.SupportRegen));
        }
Beispiel #11
0
        public IOutput Create()
        {
            var bk       = _model.HasBusinessKey();
            var isEntity = _model.IsEntity();

            var sb = new StringBuilder();

            if (Settings.SupportRegen)
            {
                sb.Al(((ISnippet) new OverwriteHeader.Generator(Settings, new GeneratorDetails()).Create()).Content);
            }
            else
            {
                sb.Al(((ISnippet) new Header.Generator(Settings, new GeneratorDetails()).Create()).Content);
            }
            sb.Al($"namespace {_module.Namespace}.Common.Domain");
            sb.Al("{");
            sb.I(1).A(Settings.SupportRegen ? $"partial class {_model.Name}" : $"public class {_model.Name}");
            var entity = string.Empty;

            if (isEntity)
            {
                entity += $" : BaseAggregateRoot<{_model.Name}, ";
                if (_model.Key.Fields.Count == 1)
                {
                    entity += $"{_model.Key.Fields.First().GetDataType()}>";
                }
                else
                {
                    entity += "{ ";
                    foreach (var item in _model.Key.Fields)
                    {
                        entity += item.GetDataType() + ",";
                    }
                    entity.TrimEnd(',');
                    entity += " }>;";
                }
            }
            sb.Al(entity);
            sb.I(1).Al("{");

            if (!Settings.SupportRegen)
            {
                sb.I(2).A($"public {_model.Name}(");
                foreach (var field in _model.Fields)
                {
                    sb.A($"{field.GetDataType()} {field.Name.Singular.LocalVariable}, ");
                }
                sb.TrimEnd(", ");
                sb.Al(")");
                sb.I(2).Al("{");
                foreach (var field in _model.Fields.Where(f => !f.Nullable && f.DataType == DataTypes.String))
                {
                    sb.I(3).Al($"if(string.IsNullOrWhiteSpace({field.Name.Singular.LocalVariable}))");
                    sb.I(4).Al($"throw new ArgumentException(\"Must include a value for {field.Name.Singular.Display}\");");
                }

                foreach (var field in _model.Fields)
                {
                    sb.I(3).Al($"{field.Name.Value} = {field.Name.Singular.LocalVariable};");
                }
                sb.I(2).Al("}");
                sb.B();
            }

            foreach (var item in _model.Key.Fields)
            {
                if (isEntity && item.Name.ToString() == "Id")
                {
                    continue;
                }
                var property = (ISnippet) new Property.Generator(item, setScope: Property.PropertyScope.Private).Create();
                sb.Al(property.Content);
            }
            foreach (var item in _model.Fields)
            {
                var property = (ISnippet) new Property.Generator(item, setScope: Property.PropertyScope.Private).Create();
                sb.Al(property.Content);
            }

            foreach (var item in _model.Behaviours)
            {
                if (Settings.SupportRegen)
                {
                    sb.I(2).A($"public partial void {item.Name}(");
                    if (item.Request != null)
                    {
                        foreach (var field in item.Request.Fields)
                        {
                            sb.A($"{field.GetDataType()} {field.Name.Singular.LocalVariable}, ");
                        }
                        sb.TrimEnd(", ");
                    }
                    sb.Al(");");
                }
                else
                {
                    sb.I(2).A($"public void {item.Name}(");
                    if (item.Request != null)
                    {
                        foreach (var field in item.Request.Fields)
                        {
                            sb.A($"{field.GetDataType()} {field.Name.Singular.LocalVariable}, ");
                        }
                        sb.TrimEnd(", ");
                    }
                    sb.Al(")");
                    sb.I(2).Al("{");
                    sb.I(3).Al($"// todo: Add {item.Name.Singular.Display} behaviour here");
                    sb.I(2).Al("}");
                }
                sb.B();
            }

            if (!Settings.SupportRegen)
            {
                sb.I(2).Al($"protected override void Apply(IDomainEvent<Guid> @event)");
                sb.I(2).Al("{");
                sb.I(3).Al($"// todo: Apply events");
                sb.I(2).Al("}");
            }

            sb.TrimEnd(Environment.NewLine);
            sb.B();

            sb.I(1).Al("}");
            sb.Al("}");

            var filename = _model.Name.ToString();

            if (Settings.SupportRegen)
            {
                filename += ".generated";
            }
            filename += ".cs";

            return(new File(filename, sb.ToString(), canOverwrite: Settings.SupportRegen));
        }
Beispiel #12
0
        public IOutput Create()
        {
            if (!Settings.SupportRegen)
            {
                return(null);
            }

            var relationships = _module.FindRelationshipsByModel(_model);

            var sb = new StringBuilder();

            sb.Al(((ISnippet) new Header.Generator(Settings, new GeneratorDetails()).Create()).Content);
            sb.Al($"namespace {_module.Namespace}.Common.Domain");
            sb.Al("{");
            sb.I(1).Al($"public partial class {_model.Name}");
            sb.I(1).Al("{");
            sb.I(2).A($"public {_model.Name}(");
            foreach (var field in _model.Fields)
            {
                sb.A($"{field.GetDataType()} {field.Name.Singular.LocalVariable}, ");
            }
            sb.TrimEnd(", ");
            sb.Al(")");
            sb.I(2).Al("{");
            foreach (var field in _model.Fields.Where(f => !f.Nullable && f.DataType == DataTypes.String))
            {
                sb.I(3).Al($"if(string.IsNullOrWhiteSpace({field.Name.Singular.LocalVariable}))");
                sb.I(4).Al($"throw new ArgumentException(\"Must include a value for {field.Name.Singular.Display}\");");
            }

            foreach (var field in _model.Fields)
            {
                sb.I(3).Al($"{field.Name.Value} = {field.Name.Singular.LocalVariable};");
            }
            sb.I(2).Al("}");
            sb.B();

            var p = "public partial ";

            foreach (var item in _model.Behaviours)
            {
                sb.I(2).A($"{p}void {item.Name}(");
                if (item.Request != null)
                {
                    foreach (var field in item.Request.Fields)
                    {
                        sb.A($"{field.GetDataType()} {field.Name.Singular.LocalVariable}, ");
                    }
                    sb.TrimEnd(", ");
                }
                sb.Al(")");
                sb.I(2).Al("{");
                sb.I(3).Al($"// todo: Add {item.Name.Singular.Display} behaviour here");
                sb.I(2).Al("}");
                sb.B();
            }

            //sb.I(2).Al($"protected override void Apply(IDomainEvent<Guid> @event)");
            //sb.I(2).Al("{");
            //sb.I(3).Al($"// todo: Apply events");
            //sb.I(2).Al("}");
            sb.I(1).Al("}");
            sb.Al("}");

            return(new File(_model.Name + ".cs", sb.ToString()));
        }