44using Moryx . Cli . Template . StateBaseTemplate ;
55using Moryx . Cli . Template . Exceptions ;
66using Moryx . Cli . Template . StateTemplate ;
7+ using Moryx . Cli . Template . Components ;
8+ using Moryx . AbstractionLayer . Resources ;
79
810namespace Moryx . Cli . Commands
911{
@@ -19,16 +21,17 @@ internal static CommandResult Exec(TemplateSettings settings, string resource, I
1921
2022 private static CommandResult Add ( TemplateSettings settings , List < string > cleanedResourceNames , string resource , IEnumerable < string > states )
2123 {
22- if ( ! ResourceExists ( settings , resource ) )
24+ var resourceFile = FindResource ( settings , resource ) ;
25+ if ( string . IsNullOrEmpty ( resourceFile ) )
2326 {
24- return CommandResult . WithError ( $ "Resource `{ resource } ` not found. Make sure that a `{ resource } .cs ` exists in the project.") ;
27+ return CommandResult . WithError ( $ "`{ resource } ` not found. Make sure that a type `{ resource } ` exists in the project.") ;
2528 }
2629
2730 var projectFileNames = cleanedResourceNames . InitialProjects ( ) ;
28- var StateBaseFileName = cleanedResourceNames . StateBaseFile ( ) ;
31+ var stateBaseFileName = cleanedResourceNames . StateBaseFile ( ) ;
2932
30- var dictionary = Template . Template . PrepareFileStructure ( settings . AppName , StateBaseFileName , projectFileNames ) ;
31- var targetPath = Path . Combine ( settings . TargetDirectory , "src" , $ " { settings . AppName } .Resources" , resource ) ;
33+ var dictionary = Template . Template . PrepareFileStructure ( settings . AppName , stateBaseFileName , projectFileNames ) ;
34+ var targetPath = Path . Combine ( Path . GetDirectoryName ( resourceFile ) ! , "States" ) ;
3235 var newStateBaseFileName = Path . Combine ( targetPath , $ "{ resource } StateBase.cs") ;
3336
3437 if ( ! File . Exists ( newStateBaseFileName ) )
@@ -44,13 +47,14 @@ private static CommandResult Add(TemplateSettings settings, List<string> cleaned
4447 {
4548 { Template . Template . AppPlaceholder , settings . AppName } ,
4649 { Template . Template . StateBasePlaceholder , $ "{ resource } StateBase" } ,
50+ { Template . Template . CellPlaceholder , $ "{ resource } " } ,
4751 { Template . Template . ResourcePlaceholder , resource } ,
4852 } ) ;
4953
50- if ( ! states . Any ( ) )
54+ if ( ! states . Any ( ) )
5155 {
52- states =
53- [
56+ states =
57+ [
5458 "Idle" ,
5559 "ReadyToWork" ,
5660 "Running" ,
@@ -92,6 +96,7 @@ private static CommandResult Add(TemplateSettings settings, List<string> cleaned
9296 { Template . Template . AppPlaceholder , settings . AppName } ,
9397 { Template . Template . StatePlaceholder , stateType } ,
9498 { Template . Template . ResourcePlaceholder , resource } ,
99+ { Template . Template . CellPlaceholder , resource } ,
95100 { Template . Template . StateBasePlaceholder , $ "{ resource } StateBase" } ,
96101 } ) ;
97102
@@ -114,7 +119,7 @@ private static CommandResult Add(TemplateSettings settings, List<string> cleaned
114119
115120 UpdateResource (
116121 settings ,
117- resource ,
122+ resource ,
118123 success => msg . Add ( success ) ,
119124 warning => warnings . Add ( warning ) ) ;
120125
@@ -123,51 +128,69 @@ private static CommandResult Add(TemplateSettings settings, List<string> cleaned
123128
124129 private static void UpdateResource ( TemplateSettings settings , string resource , Action < string > onSuccess , Action < string > onWarning )
125130 {
126- var dir = Path . Combine ( settings . TargetDirectory , "src" , $ "{ settings . AppName } .Resources") ;
127- var files = Directory . GetFiles (
128- dir ,
129- $ "{ resource } .cs",
130- new EnumerationOptions
131- {
132- ReturnSpecialDirectories = false ,
133- RecurseSubdirectories = true
134- } ) ;
135- if ( files . Length == 0 )
136- {
137- onWarning ( $ "Filename `{ resource } .cs` not found. Could not update resource.") ;
138- return ;
139- }
140- if ( files . Length > 1 )
131+ var candidate = FindResource ( settings , resource ) ;
132+
133+ if ( string . IsNullOrEmpty ( candidate ) )
141134 {
142- onWarning ( $ "Filename `{ resource } .cs` is ambiguous . Could not update resource.") ;
135+ onWarning ( $ "Type `{ resource } ` not found . Could not update resource.") ;
143136 return ;
144137 }
145- var filename = files . Single ( ) ;
146138
147139 try
148140 {
149- var template = StateTemplate . FromFile ( filename ) ;
150- template = template . ImplementIStateContext ( resource ) ;
151- template . SaveToFile ( filename ) ;
152- onSuccess ( $ "Updated `{ resource } .cs `") ;
141+ var template = StateTemplate . FromFile ( candidate ) ;
142+ template = template . ImplementIStateContext ( resource ) ;
143+ template . SaveToFile ( candidate ) ;
144+ onSuccess ( $ "Updated `{ Path . GetFileName ( candidate ) } `") ;
153145 }
154146 catch ( Exception )
155147 {
156- onWarning ( $ "Failed to update `{ resource } .cs `") ;
148+ onWarning ( $ "Failed to update `{ Path . GetFileName ( candidate ) } `") ;
157149 }
158150 }
159151
160- private static bool ResourceExists ( TemplateSettings settings , string resource )
152+ private static string FindResource ( TemplateSettings settings , string resourceName )
161153 {
154+ var dir = Path . Combine ( settings . TargetDirectory , "src" ) ;
162155 var files = Directory . GetFiles (
163- Path . Combine ( settings . TargetDirectory ) ,
164- $ "{ resource } .cs",
156+ dir ,
157+ $ "* .cs",
165158 new EnumerationOptions
166159 {
167160 ReturnSpecialDirectories = false ,
168161 RecurseSubdirectories = true
169- } ) ;
170- return files . Length > 0 ;
162+ } )
163+ . AsEnumerable ( ) ;
164+
165+ var promisingCandidate = files . FirstOrDefault ( f => f . EndsWith ( $ "{ resourceName } .cs") ) ;
166+ if ( ! string . IsNullOrEmpty ( promisingCandidate ) )
167+ {
168+ files = files . Prepend ( promisingCandidate ) ;
169+ }
170+
171+ var candidate = string . Empty ;
172+ foreach ( var file in files )
173+ {
174+ if ( ContainsType ( file , resourceName ) )
175+ {
176+ candidate = file ;
177+ break ;
178+ }
179+ }
180+ return candidate ;
181+ }
182+
183+ private static bool ContainsType ( string filename , string typeName )
184+ {
185+ try
186+ {
187+ var file = CSharpFile . FromFile ( filename ) ;
188+ return file . Types . Any ( t => t == typeName ) ;
189+ }
190+ catch
191+ {
192+ return false ;
193+ }
171194 }
172195 }
173196}
0 commit comments