@@ -53,6 +53,51 @@ templateDirs(Config const& config, std::string_view generator, std::string_view
5353 return dirs;
5454}
5555
56+ } // (anon)
57+
58+ namespace paths {
59+
60+ std::string selectExistingTemplateDir (std::vector<std::string> const & candidates)
61+ {
62+ for (auto const & dir : candidates)
63+ {
64+ if (files::exists (dir))
65+ return dir;
66+ }
67+ return {};
68+ }
69+
70+ } // namespace paths
71+
72+
73+ static std::string pickTemplateDir (
74+ Config const & config,
75+ std::string_view generator,
76+ std::string_view subdir,
77+ std::string_view purpose)
78+ {
79+ auto dirs = templateDirs (config, generator, subdir);
80+ auto selected = paths::selectExistingTemplateDir (dirs);
81+ if (!selected.empty ())
82+ return selected;
83+
84+ std::string searched;
85+ for (auto it = dirs.begin (); it != dirs.end (); ++it)
86+ {
87+ if (it != dirs.begin ())
88+ searched.append (" , " );
89+ searched.append (*it);
90+ }
91+
92+ formatError (
93+ " No {} templates found for generator '{}' (subdir '{}'); searched: {}" ,
94+ purpose,
95+ generator,
96+ subdir,
97+ searched.empty () ? std::string{" <none>" } : searched).Throw ();
98+ return {};
99+ }
100+
56101void
57102loadPartials (
58103 Handlebars& hbs,
@@ -181,11 +226,6 @@ relativize_fn(dom::Value to0, dom::Value from0, dom::Value options)
181226 relativePath += hash;
182227 return relativePath;
183228}
184-
185- } // (anon)
186-
187-
188-
189229Builder::
190230Builder (
191231 HandlebarsCorpus const & corpus,
@@ -454,40 +494,35 @@ std::string
454494Builder::
455495layoutDir () const
456496{
457- auto dirs = templateDirs (domCorpus->config , domCorpus.fileExtension , " layouts" );
458- return dirs.empty () ? std::string{} : dirs.back ();
497+ return pickTemplateDir (domCorpus->config , domCorpus.fileExtension , " layouts" , " layout" );
459498}
460499
461500std::string
462501Builder::
463502templatesDir () const
464503{
465- auto dirs = templateDirs (domCorpus->config , domCorpus.fileExtension , {});
466- return dirs.empty () ? std::string{} : dirs.back ();
504+ return pickTemplateDir (domCorpus->config , domCorpus.fileExtension , {}, " template" );
467505}
468506
469507std::string
470508Builder::
471509templatesDir (std::string_view subdir) const
472510{
473- auto dirs = templateDirs (domCorpus->config , domCorpus.fileExtension , subdir);
474- return dirs.empty () ? std::string{} : dirs.back ();
511+ return pickTemplateDir (domCorpus->config , domCorpus.fileExtension , subdir, " template" );
475512}
476513
477514std::string
478515Builder::
479516commonTemplatesDir () const
480517{
481- auto dirs = templateDirs (domCorpus->config , " common" , {});
482- return dirs.empty () ? std::string{} : dirs.back ();
518+ return pickTemplateDir (domCorpus->config , " common" , {}, " common template" );
483519}
484520
485521std::string
486522Builder::
487523commonTemplatesDir (std::string_view const subdir) const
488524{
489- auto dirs = templateDirs (domCorpus->config , " common" , subdir);
490- return dirs.empty () ? std::string{} : dirs.back ();
525+ return pickTemplateDir (domCorpus->config , " common" , subdir, " common template" );
491526}
492527
493528
0 commit comments