2525
2626using json = nlohmann::json;
2727
28+ #define EXPECT_FILENAME_ARG (name, i ) \
29+ if (filenames.size() <= i || !Glib::file_test(filenames.at(i), Glib::FILE_TEST_EXISTS)) { \
30+ g_warning (" %s filename argument at %i missing or does not exist" , name, static_cast <int >(i)); \
31+ }
32+
33+ #define EXPECT_DIR_ARG (name, i ) \
34+ if (filenames.size() <= i || filenames.at(i).size() == 0 ) { \
35+ g_warning (" %s directory argument at %i missing" , name, static_cast <int >(i)); \
36+ }
37+
38+ #define EXPECT_POOL_ENV () \
39+ if (pool_base_path.length() <= 0 ) { \
40+ g_warning (" HORIZON_POOL dir env var is not set" ); \
41+ } \
42+ else if (!Glib::file_test(pool_base_path, Glib::FILE_TEST_EXISTS)) { \
43+ g_warning (" HORIZON_POOL dir does not exist" ); \
44+ } \
45+ else if (!Glib::file_test(Glib::build_filename(pool_base_path, " pool.json" ), Glib::FILE_TEST_EXISTS)) { \
46+ g_warning (" HORIZON_POOL dir does not contain pool.json" ); \
47+ }
48+
2849int main (int argc, char *argv[])
2950{
3051#ifdef G_OS_WIN32
@@ -38,6 +59,7 @@ int main(int argc, char *argv[])
3859
3960 Glib::OptionContext options;
4061 options.set_summary (" horizon interactive manipulator" );
62+ options.set_description (" The 'HORIZON_POOL' env var should be set directory of the pool being used." );
4163 options.set_help_enabled ();
4264
4365 Glib::OptionGroup group (" imp" , " imp" );
@@ -123,41 +145,59 @@ int main(int argc, char *argv[])
123145 horizon::setup_locale ();
124146
125147 horizon::create_cache_and_config_dir ();
126-
127148 std::unique_ptr<horizon::ImpBase> imp = nullptr ;
128149 if (mode_sch) {
150+ EXPECT_FILENAME_ARG (" blocks" , 0 )
151+ EXPECT_DIR_ARG (" pictures" , 1 )
152+ EXPECT_POOL_ENV ()
129153 imp.reset (new horizon::ImpSchematic (filenames, {pool_base_path}));
130154 }
131155 else if (mode_symbol) {
156+ EXPECT_FILENAME_ARG (" symbol" , 0 )
157+ EXPECT_POOL_ENV ()
132158 imp.reset (new horizon::ImpSymbol (filenames.at (0 ), pool_base_path, temp_mode));
133159 if (filenames.size () > 1 )
134160 imp->set_suggested_filename (filenames.at (1 ));
135161 }
136162 else if (mode_padstack) {
163+ EXPECT_FILENAME_ARG (" padstack" , 0 )
164+ EXPECT_POOL_ENV ()
137165 imp.reset (new horizon::ImpPadstack (filenames.at (0 ), pool_base_path, temp_mode));
138166 if (filenames.size () > 1 )
139167 imp->set_suggested_filename (filenames.at (1 ));
140168 }
141169 else if (mode_package) {
170+ EXPECT_FILENAME_ARG (" package" , 0 )
171+ EXPECT_POOL_ENV ()
142172 imp.reset (new horizon::ImpPackage (filenames.at (0 ), pool_base_path, temp_mode));
143173 if (filenames.size () > 1 )
144174 imp->set_suggested_filename (filenames.at (1 ));
145175 }
146176 else if (mode_board) {
177+ EXPECT_FILENAME_ARG (" board" , 0 )
178+ EXPECT_FILENAME_ARG (" planes" , 1 )
179+ EXPECT_FILENAME_ARG (" blocks" , 2 )
180+ EXPECT_DIR_ARG (" pictures" , 3 )
181+ EXPECT_POOL_ENV ()
147182 imp.reset (new horizon::ImpBoard (filenames, {pool_base_path}));
148183 }
149184 else if (mode_frame) {
185+ EXPECT_FILENAME_ARG (" frame" , 0 )
186+ EXPECT_POOL_ENV ()
150187 imp.reset (new horizon::ImpFrame (filenames.at (0 ), pool_base_path, temp_mode));
151188 if (filenames.size () > 1 )
152189 imp->set_suggested_filename (filenames.at (1 ));
153190 }
154191 else if (mode_decal) {
192+ EXPECT_FILENAME_ARG (" decal" , 0 )
193+ EXPECT_POOL_ENV ()
155194 imp.reset (new horizon::ImpDecal (filenames.at (0 ), pool_base_path, temp_mode));
156195 if (filenames.size () > 1 )
157196 imp->set_suggested_filename (filenames.at (1 ));
158197 }
159198 else {
160199 std::cout << " wrong invocation" << std::endl;
200+ std::cout << options.get_help ().c_str ();
161201 return 1 ;
162202 }
163203 imp->set_read_only (read_only);
@@ -167,3 +207,7 @@ int main(int argc, char *argv[])
167207
168208 return 0 ;
169209}
210+
211+ #undef EXPECT_FILENAME_ARG
212+ #undef EXPECT_DIR_ARG
213+ #undef EXPECT_POOL_ENV
0 commit comments