-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathModelsGen.cs
More file actions
67 lines (55 loc) · 2.29 KB
/
Copy pathModelsGen.cs
File metadata and controls
67 lines (55 loc) · 2.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Plugin;
using SqlcGenCsharp.Drivers;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
namespace SqlcGenCsharp.Generators;
internal class ModelsGen(DbDriver dbDriver, string namespaceName)
{
private const string ClassName = "Models";
private RootGen RootGen { get; } = new(dbDriver.Options);
private DataClassesGen DataClassesGen { get; } = new(dbDriver);
private EnumsGen EnumsGen { get; } = new(dbDriver);
public File GenerateFile(
Dictionary<string, Dictionary<string, Table>> tables,
Dictionary<string, Dictionary<string, Enum>> enums)
{
var usingDirectives = dbDriver
.GetUsingDirectivesForModels()
.OrderBy(x => x)
.Select(x => UsingDirective(ParseName(x)))
.ToArray();
var dataclassModels = GenerateDataClasses(tables);
var enumModels = GenerateEnums(enums);
var models = dataclassModels.Concat(enumModels).ToArray();
var root = RootGen.CompilationRootGen(IdentifierName(namespaceName), usingDirectives, models);
root = root.AddCommentOnTop(Consts.AutoGeneratedComment);
return new File
{
Name = $"{ClassName}.cs",
Contents = root.ToByteString()
};
}
private MemberDeclarationSyntax[] GenerateDataClasses(Dictionary<string, Dictionary<string, Table>> tables)
{
return (
from schemaTables in tables
from table in schemaTables.Value
let className = table.Value.Rel.Name.ToModelName(table.Value.Rel.Schema, dbDriver.DefaultSchema)
select DataClassesGen.Generate(className, null, table.Value.Columns, dbDriver.Options, null)
).ToArray();
}
private MemberDeclarationSyntax[] GenerateEnums(Dictionary<string, Dictionary<string, Enum>> enums)
{
return enums.SelectMany(s =>
{
return s.Value.SelectMany(e =>
{
var enumName = e.Value.Name.ToModelName(s.Key, dbDriver.DefaultSchema);
return EnumsGen.Generate(enumName, e.Value.Vals);
});
}).ToArray();
}
}