@@ -46,7 +46,7 @@ public Task<GenerateResponse> Generate(GenerateRequest generateRequest)
4646 DbDriver = InstantiateDriver ( ) ;
4747 var fileQueries = GetFileQueries ( ) ;
4848 var files = fileQueries
49- . Select ( fq => GenerateFile ( fq . Value , fq . Key ) )
49+ . SelectMany ( fq => GenerateFiles ( fq . Value , fq . Key ) )
5050 . AppendIfNotNull ( GenerateGemfile ( ) ) ;
5151 return Task . FromResult ( new GenerateResponse { Files = { files } } ) ;
5252
@@ -67,20 +67,38 @@ string QueryFilenameToClassName(string filenameWithExtension)
6767 }
6868 }
6969
70- private File GenerateFile ( IList < Query > queries , string className )
70+ private IEnumerable < File > GenerateFiles ( IList < Query > queries , string className )
7171 {
7272 var ( requiredGems , moduleDeclaration ) = GenerateModule ( queries , className ) ;
73- var contents = $ """
74- { AutoGeneratedComment }
75- { requiredGems . Select ( r => r . Build ( ) ) . JoinByNewLine ( ) }
76-
77- { moduleDeclaration . Build ( ) }
78- """ ;
79- return new File
73+ IEnumerable < File > files = new List < File >
8074 {
81- Name = $ "{ className . SnakeCase ( ) } .rb",
82- Contents = ByteString . CopyFromUtf8 ( contents )
75+ new ( )
76+ {
77+ Name = $ "{ className . SnakeCase ( ) } .rb",
78+ Contents = ByteString . CopyFromUtf8 (
79+ $ """
80+ { AutoGeneratedComment }
81+ { requiredGems . Select ( r => r . Build ( ) ) . JoinByNewLine ( ) }
82+
83+ { moduleDeclaration . BuildCode ( ) }
84+ """
85+ )
86+ }
8387 } ;
88+ if ( ! Options . GenerateTypes )
89+ return files ;
90+
91+ files = files . Append ( new File
92+ {
93+ Name = $ "{ className . SnakeCase ( ) } .rbs",
94+ Contents = ByteString . CopyFromUtf8 (
95+ $ """
96+ { AutoGeneratedComment }
97+ { moduleDeclaration . BuildType ( ) }
98+ """
99+ )
100+ } ) ;
101+ return files ;
84102 }
85103
86104 private File ? GenerateGemfile ( )
@@ -91,15 +109,18 @@ private File GenerateFile(IList<Query> queries, string className)
91109 return new File
92110 {
93111 Name = "Gemfile" ,
94- Contents = ByteString . CopyFromUtf8 ( $ """
95- source 'https://rubygems.org'
112+ Contents = ByteString . CopyFromUtf8 (
113+ $ """
114+ source 'https://rubygems.org'
96115
97- { requireGems }
98- """ )
116+ { requireGems }
117+ """
118+ )
99119 } ;
100120 }
101121
102- private ( IEnumerable < RequireGem > , ModuleDeclaration ) GenerateModule ( IList < Query > queries , string className )
122+ private ( IEnumerable < RequireGem > , ModuleDeclaration ) GenerateModule ( IList < Query > queries ,
123+ string className )
103124 {
104125 var requiredGems = DbDriver . GetRequiredGems ( ) ;
105126 var initMethod = DbDriver . GetInitMethod ( ) ;
@@ -130,37 +151,39 @@ ClassDeclaration GetClassDeclaration()
130151 }
131152 }
132153
133- private static SimpleStatement GenerateDataclass ( string name , ClassMember classMember , IEnumerable < Column > columns ,
154+ private IComposableRbsType GenerateDataclass ( string funcName , ClassMember classMember , IList < Column > columns ,
134155 Options options )
135156 {
136- var dataclassName = $ "{ name . FirstCharToUpper ( ) } { classMember . Name ( ) } ";
137- var dataColumns = columns . Select ( c => $ ":{ c . Name . ToLower ( ) } ") . ToList ( ) ;
138- var dataColumnsStr = dataColumns . JoinByCommaAndFormat ( ) ;
139- return new SimpleStatement ( dataclassName ,
140- new SimpleExpression ( options . RubyVersion . ImmutableDataSupported ( )
141- ? $ "Data.define({ dataColumnsStr } )"
142- : $ "Struct.new({ dataColumnsStr } )") ) ;
157+ var dataclassName = $ "{ funcName . FirstCharToUpper ( ) } { classMember . Name ( ) } ";
158+ var nameToType = columns . ToDictionary (
159+ kv => kv . Name ,
160+ kv => DbDriver . GetColumnType ( kv )
161+ ) ;
162+ return options . RubyVersion . ImmutableDataSupported ( )
163+ ? new DataDefine ( dataclassName , nameToType )
164+ : new NewStruct ( dataclassName , nameToType ) ;
143165 }
144166
145- private SimpleStatement ? GetQueryColumnsDataclass ( Query query )
167+ private IComposableRbsType ? GetQueryColumnsDataclass ( Query query )
146168 {
147169 return query . Columns . Count <= 0
148170 ? null
149171 : GenerateDataclass ( query . Name , ClassMember . Row , query . Columns , Options ) ;
150172 }
151173
152- private SimpleStatement ? GetQueryParamsDataclass ( Query query )
174+
175+ private IComposableRbsType ? GetQueryParamsDataclass ( Query query )
153176 {
154177 if ( query . Params . Count <= 0 )
155178 return null ;
156- var columns = query . Params . Select ( p => p . Column ) ;
179+ var columns = query . Params . Select ( p => p . Column ) . ToList ( ) ;
157180 return GenerateDataclass ( query . Name , ClassMember . Args , columns , Options ) ;
158181 }
159182
160183 private MethodDeclaration GetMethodDeclaration ( Query query )
161184 {
162185 var queryTextConstant = GetInterfaceName ( ClassMember . Sql ) ;
163- var argInterface = GetInterfaceName ( ClassMember . Args ) . SnakeCase ( ) ;
186+ var argInterface = GetInterfaceName ( ClassMember . Args ) ;
164187 var returnInterface = GetInterfaceName ( ClassMember . Row ) ;
165188 var funcName = query . Name . SnakeCase ( ) ;
166189
0 commit comments