Skip to content

Commit 49bc5d1

Browse files
standardize list construction across project (#37)
1 parent 9ab0c3a commit 49bc5d1

File tree

7 files changed

+71
-76
lines changed

7 files changed

+71
-76
lines changed

CodeGenerator/CodeGenerator.cs

+33-36
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,10 @@ public Task<GenerateResponse> Generate(GenerateRequest generateRequest)
4545
{
4646
Options = new Options(generateRequest);
4747
DbDriver = InstantiateDriver();
48-
var fileQueries = GetFileQueries();
49-
var files = fileQueries
48+
var generatedFiles = GetFileQueries()
5049
.SelectMany(fq => GenerateFiles(fq.Value, fq.Key))
51-
.AppendIfNotNull(GenerateGemfile());
52-
return Task.FromResult(new GenerateResponse { Files = { files } });
50+
.AppendIf(GenerateGemfile(), Options.GenerateGemfile);
51+
return Task.FromResult(new GenerateResponse { Files = { generatedFiles } });
5352

5453
Dictionary<string, Query[]> GetFileQueries()
5554
{
@@ -71,25 +70,31 @@ string QueryFilenameToClassName(string filenameWithExtension)
7170
private IEnumerable<File> GenerateFiles(IList<Query> queries, string className)
7271
{
7372
var (requiredGems, moduleDeclaration) = GenerateModule(queries, className);
74-
IEnumerable<File> files = new List<File>
73+
return new List<File>()
74+
.Append(GenerateCodeFile(className, requiredGems, moduleDeclaration))
75+
.AppendIf(GenerateTypedefFile(className, moduleDeclaration), Options.GenerateTypes);
76+
}
77+
78+
private static File GenerateCodeFile(string className, IEnumerable<RequireGem> requiredGems,
79+
ModuleDeclaration moduleDeclaration)
80+
{
81+
return new File
7582
{
76-
new()
77-
{
78-
Name = $"{className.SnakeCase()}.rb",
79-
Contents = ByteString.CopyFromUtf8(
80-
$"""
81-
{AutoGeneratedComment}
82-
{requiredGems.Select(r => r.Build()).JoinByNewLine()}
83-
84-
{moduleDeclaration.BuildCode()}
85-
"""
86-
)
87-
}
83+
Name = $"{className.SnakeCase()}.rb",
84+
Contents = ByteString.CopyFromUtf8(
85+
$"""
86+
{AutoGeneratedComment}
87+
{requiredGems.Select(r => r.Build()).JoinByNewLine()}
88+
89+
{moduleDeclaration.BuildCode()}
90+
"""
91+
)
8892
};
89-
if (!Options.GenerateTypes)
90-
return files;
93+
}
9194

92-
files = files.Append(new File
95+
private static File GenerateTypedefFile(string className, ModuleDeclaration moduleDeclaration)
96+
{
97+
return new File
9398
{
9499
Name = $"{className.SnakeCase()}.rbs",
95100
Contents = ByteString.CopyFromUtf8(
@@ -98,29 +103,25 @@ private IEnumerable<File> GenerateFiles(IList<Query> queries, string className)
98103
{moduleDeclaration.BuildType()}
99104
"""
100105
)
101-
});
102-
return files;
106+
};
103107
}
104108

105-
private File? GenerateGemfile()
109+
private File GenerateGemfile()
106110
{
107-
if (!Options.GenerateGemfile)
108-
return null;
109-
var requireGems = DbDriver.GetRequiredGems().Select(gem => $"gem '{gem.Name()}'").JoinByNewLine();
110111
return new File
111112
{
112113
Name = "Gemfile",
113114
Contents = ByteString.CopyFromUtf8(
114115
$"""
115116
source 'https://rubygems.org'
116117
117-
{requireGems}
118+
{DbDriver.GetRequiredGems().Select(gem => $"gem '{gem.Name()}'").JoinByNewLine()}
118119
"""
119120
)
120121
};
121122
}
122123

123-
private (IEnumerable<RequireGem>, ModuleDeclaration) GenerateModule(IList<Query> queries,
124+
private (IList<RequireGem>, ModuleDeclaration) GenerateModule(IList<Query> queries,
124125
string className)
125126
{
126127
var requiredGems = DbDriver.GetRequiredGems();
@@ -132,14 +133,10 @@ ModuleDeclaration GetModuleDeclaration()
132133
{
133134
return new ModuleDeclaration($"{Options.DriverName.ToString()}Codegen",
134135
queries
135-
.SelectMany(q =>
136-
{
137-
IEnumerable<IComposable> members = new List<IComposable>();
138-
members = members.Append(DbDriver.QueryTextConstantDeclare(q));
139-
members = members.AppendIfNotNull(GetQueryColumnsDataclass(q));
140-
members = members.AppendIfNotNull(GetQueryParamsDataclass(q));
141-
return members;
142-
})
136+
.SelectMany(q => new List<IComposable>()
137+
.Append(DbDriver.QueryTextConstantDeclare(q))
138+
.AppendIfNotNull(GetQueryColumnsDataclass(q))
139+
.AppendIfNotNull(GetQueryParamsDataclass(q)))
143140
.Append(classDeclaration));
144141
}
145142

Drivers/DbDriver.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ namespace SqlcGenRuby.Drivers;
88

99
public abstract class DbDriver
1010
{
11-
protected static IEnumerable<RequireGem> GetCommonGems()
11+
protected static IList<RequireGem> GetCommonGems()
1212
{
1313
return [new RequireGem("connection_pool")];
1414
}
1515

16-
public abstract IEnumerable<RequireGem> GetRequiredGems();
16+
public abstract IList<RequireGem> GetRequiredGems();
1717

1818
public abstract MethodDeclaration GetInitMethod();
1919

Drivers/MethodGen.cs

+24-32
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using Plugin;
22
using RubyCodegen;
3-
using System;
43
using System.Collections.Generic;
54
using System.Linq;
65

@@ -59,38 +58,36 @@ public MethodDeclaration ManyDeclare(string funcName, string queryTextConstant,
5958
string returnInterface, IList<Parameter> parameters, IList<Column> columns, bool poolingEnabled = true,
6059
RowDataType rowDataType = RowDataType.Hash)
6160
{
62-
var listAppend = new ListAppend(Variable.Entities.AsVar(),
63-
new NewObject(returnInterface, GetColumnsInitExpressions(columns, rowDataType)));
64-
IEnumerable<IComposable> withResourceBody = new List<IComposable>();
6561
var queryParams = GetQueryParams(argInterface, parameters);
66-
withResourceBody = withResourceBody.AppendIfNotNull(queryParams);
67-
withResourceBody = withResourceBody
68-
.Concat(
69-
[
70-
dbDriver.PrepareStmt(funcName, queryTextConstant),
71-
ExecuteAndAssign(funcName, queryParams),
72-
new SimpleStatement(Variable.Entities.AsVar(), new SimpleExpression("[]")),
73-
new ForeachLoop(
74-
Variable.Result.AsVar(),
75-
Variable.Row.AsVar(),
76-
new List<IComposable> { listAppend }
77-
),
78-
new SimpleExpression($"return {Variable.Entities.AsVar()}")
79-
]
80-
);
62+
var withResourceBody = new List<IComposable>()
63+
.AppendIfNotNull(queryParams)
64+
.Append(dbDriver.PrepareStmt(funcName, queryTextConstant))
65+
.Append(ExecuteAndAssign(funcName, queryParams))
66+
.Append(new SimpleStatement(Variable.Entities.AsVar(), new SimpleExpression("[]")))
67+
.Append(AssignResultInForeach())
68+
.Append(new SimpleExpression($"return {Variable.Entities.AsVar()}"));
8169

8270
var methodArgs = GetMethodArgs(argInterface, parameters);
8371
var methodBody = OptionallyAddPoolUsage(poolingEnabled, withResourceBody);
8472
return new MethodDeclaration(funcName, argInterface, methodArgs, null, methodBody);
73+
74+
ForeachLoop AssignResultInForeach()
75+
{
76+
var listAppend = new ListAppend(Variable.Entities.AsVar(),
77+
new NewObject(returnInterface, GetColumnsInitExpressions(columns, rowDataType)));
78+
return new ForeachLoop(
79+
Variable.Result.AsVar(),
80+
Variable.Row.AsVar(),
81+
new List<IComposable> { listAppend });
82+
}
8583
}
8684

8785
public MethodDeclaration ExecDeclare(string funcName, string queryTextConstant, string argInterface,
8886
IList<Parameter> parameters, bool poolingEnabled = true)
8987
{
90-
IEnumerable<IComposable> withResourceBody = new List<IComposable>();
9188
var queryParams = GetQueryParams(argInterface, parameters);
92-
withResourceBody = withResourceBody.AppendIfNotNull(queryParams);
93-
withResourceBody = withResourceBody
89+
var withResourceBody = new List<IComposable>()
90+
.AppendIfNotNull(queryParams)
9491
.Append(dbDriver.PrepareStmt(funcName, queryTextConstant))
9592
.Append(dbDriver.ExecuteStmt(funcName, queryParams))
9693
.ToList();
@@ -103,17 +100,12 @@ public MethodDeclaration ExecDeclare(string funcName, string queryTextConstant,
103100
public MethodDeclaration ExecLastIdDeclare(string funcName, string queryTextConstant, string argInterface,
104101
IList<Parameter> parameters)
105102
{
106-
IEnumerable<IComposable> withResourceBody = new List<IComposable>();
107103
var queryParams = GetQueryParams(argInterface, parameters);
108-
withResourceBody = withResourceBody.AppendIfNotNull(queryParams);
109-
withResourceBody = withResourceBody
110-
.Concat(
111-
[
112-
dbDriver.PrepareStmt(funcName, queryTextConstant),
113-
dbDriver.ExecuteStmt(funcName, queryParams),
114-
new SimpleExpression($"return {Variable.Client.AsVar()}.last_id")
115-
]
116-
);
104+
var withResourceBody = new List<IComposable>()
105+
.AppendIfNotNull(queryParams)
106+
.Append(dbDriver.PrepareStmt(funcName, queryTextConstant))
107+
.Append(dbDriver.ExecuteStmt(funcName, queryParams))
108+
.Append(new SimpleExpression($"return {Variable.Client.AsVar()}.last_id"));
117109

118110
return new MethodDeclaration(
119111
funcName,

Drivers/Mysql2Driver.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ public Mysql2Driver()
1414
MethodGen = new MethodGen(this);
1515
}
1616

17-
public override IEnumerable<RequireGem> GetRequiredGems()
17+
public override IList<RequireGem> GetRequiredGems()
1818
{
19-
return GetCommonGems().Append(new RequireGem("mysql2"));
19+
return GetCommonGems().Append(new RequireGem("mysql2")).ToList();
2020
}
2121

2222
public override MethodDeclaration GetInitMethod()

Drivers/PgDriver.cs

+3-2
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,12 @@ public PgDriver()
1515
MethodGen = new MethodGen(this);
1616
}
1717

18-
public override IEnumerable<RequireGem> GetRequiredGems()
18+
public override IList<RequireGem> GetRequiredGems()
1919
{
2020
return GetCommonGems()
2121
.Append(new RequireGem("pg"))
22-
.Append(new RequireGem("set"));
22+
.Append(new RequireGem("set"))
23+
.ToList();
2324
}
2425

2526
public override MethodDeclaration GetInitMethod()

Drivers/Sqlite3Driver.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ public Sqlite3Driver()
1414
MethodGen = new MethodGen(this);
1515
}
1616

17-
public override IEnumerable<RequireGem> GetRequiredGems()
17+
public override IList<RequireGem> GetRequiredGems()
1818
{
19-
return GetCommonGems().Append(new RequireGem("sqlite3"));
19+
return GetCommonGems().Append(new RequireGem("sqlite3")).ToList();
2020
}
2121

2222
public override MethodDeclaration GetInitMethod()

Extensions/ListExtensions.cs

+5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ public static class ListExtensions
44
{
55
private const int MaxElementsPerLine = 5;
66

7+
public static IEnumerable<T> AppendIf<T>(this IEnumerable<T> me, T item, bool condition)
8+
{
9+
return condition ? me.Append(item) : me;
10+
}
11+
712
public static IEnumerable<T> AppendIfNotNull<T>(this IEnumerable<T> me, T? item)
813
{
914
return item is not null ? me.Append(item) : me;

0 commit comments

Comments
 (0)