Skip to content

Commit b6d03c7

Browse files
committed
Определение обязательных соединений, рефакторинг ошибок oscript-library#78
1 parent 895ac82 commit b6d03c7

9 files changed

+261
-159
lines changed

src/core/Классы/internal/parser/Классы/АргументыПарсера.os

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,11 @@
22

33
// Ссылка на класс аргумента
44
Перем Аргумент Экспорт;
5-
Перем Обязательный Экспорт; // Булево
65
Перем Лог;
76

8-
Процедура ПриСозданииОбъекта(КлассОпции, ОбязательныйАргумент = Истина)
7+
Процедура ПриСозданииОбъекта(КлассОпции)
98

109
Аргумент = КлассОпции;
11-
Обязательный = ОбязательныйАргумент;
1210

1311
КонецПроцедуры
1412

@@ -43,25 +41,21 @@
4341
КонтекстПоиска.НеВключенныеАргументы.Вставить(Аргумент, Истина);
4442
КонецЕсли;
4543

46-
Если Обязательный И НЕ (Результат.Найден ИЛИ Аргумент.УстановленаИзПеременнойОкружения) Тогда
47-
Результат.Ошибка = СтрШаблон("Ожидается аргумент %1", Аргумент.Имя);
44+
Если НЕ (Результат.Найден ИЛИ Аргумент.УстановленаИзПеременнойОкружения) Тогда
45+
Результат.Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяАргумент(Аргумент.Имя);
4846
КонецЕсли;
4947

5048
Возврат Результат;
5149

5250
КонецЕсли;
5351

5452
Если ПустаяСтрока(Аргументы[0]) Тогда
55-
Если Обязательный Тогда
56-
Результат.Ошибка = СтрШаблон("Ожидается аргумент %1", Аргумент.Имя);
57-
КонецЕсли;
53+
Результат.Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяАргумент(Аргумент.Имя);
5854
Возврат Результат;
5955
КонецЕсли;
6056

6157
Если НЕ КонтекстПоиска.СбросОпций И СтрНачинаетсяС(Аргументы[0], "-") И НЕ Аргументы[0] = "-" Тогда
62-
Если Обязательный Тогда
63-
Результат.Ошибка = СтрШаблон("Ожидается аргумент %1 вместо опции %2", Аргумент.Имя, Аргументы[0]);
64-
КонецЕсли;
58+
Результат.Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяАргументВместоОпции(Аргумент.Имя, Аргументы[0]);
6559
Возврат Результат;
6660
КонецЕсли;
6761

src/core/Классы/internal/parser/Классы/ВсеОпцииПарсера.os

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,12 @@
8686
КонецЕсли;
8787

8888
Возврат РезультатПоиска;
89+
90+
КонецЕсли;
91+
92+
Если ЗначениеЗаполнено(РезультатПоиска.Ошибка)
93+
И ОшибкиПарсера.ОшибкаТребуетВнимания(РезультатПоиска.Ошибка) Тогда
94+
Возврат Новый РезультатПоискаПараметра(Аргументы, Ложь, РезультатПоиска.Ошибка);
8995
КонецЕсли;
9096

9197
КонецЦикла;

src/core/Классы/internal/parser/Классы/ОпцияПарсера.os

Lines changed: 25 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,14 @@
22

33
Перем Опция Экспорт; // ПараметрКоманды - Ссылка на класс опции
44
Перем ОпцииИндекс Экспорт; // Соответствие - Ссылка на текущий индекс опций
5-
Перем Обязательный Экспорт; // Булево
65

76
Перем Лог;
87

9-
Процедура ПриСозданииОбъекта(КлассОпции, Индекс, ОбязательнаяОпция = Истина)
8+
Процедура ПриСозданииОбъекта(КлассОпции, Индекс)
109

1110
Лог.Отладка("Создан парсер для опции %1", КлассОпции.Имя);
1211
Опция = КлассОпции;
1312
ОпцииИндекс = Индекс;
14-
Обязательный = ОбязательнаяОпция;
1513

1614
КонецПроцедуры
1715

@@ -42,8 +40,8 @@
4240

4341
Результат.Найден = Опция.УстановленаИзПеременнойОкружения;
4442

45-
Если Обязательный И НЕ (Результат.Найден ИЛИ КонтекстПоиска.СбросОпций) Тогда
46-
Результат.Ошибка = ОшибкаОжидаетсяОпция(Опция.Имя);
43+
Если НЕ (Результат.Найден ИЛИ КонтекстПоиска.СбросОпций) Тогда
44+
Результат.Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпция(Опция.Имя);
4745
КонецЕсли;
4846

4947
Возврат Результат;
@@ -128,20 +126,20 @@
128126
КлассОпции = ОпцииИндекс[Имя];
129127
Если КлассОпции = Неопределено Тогда
130128
Лог.Отладка("Неопределенная опция: %1", Строка(Имя));
131-
Результат.Ошибка = ОшибкаНеожидаемаяОпция(Имя);
129+
Результат.Ошибка = ОшибкиПарсера.ОшибкаНеожидаемаяОпция(Имя);
132130
Возврат Результат;
133131
КонецЕсли;
134132

135133
Если Не КлассОпции.Имя = Опция.Имя Тогда
136-
Результат.Ошибка = ОшибкаОжидаетсяВместо(Опция.Имя, Имя);
134+
Результат.Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо(Опция.Имя, Имя);
137135
Результат.ДополнительныеСвойства.ПрибавочныйИндекс = 1;
138136
Возврат Результат;
139137
КонецЕсли;
140138

141139
Значение = Сред(ТекущийАргумент, 4);
142140

143141
Если ПустаяСтрока(СокрЛП(Значение)) Тогда
144-
Результат.Ошибка = СтрШаблон("Опция %1 должна содержать значение после знака =", Имя);
142+
Результат.Ошибка = ОшибкиПарсера.ОшибкаТребуетсяЗначениеПослеЗнакаРавноДляОпции(Имя);
145143
Возврат Результат;
146144
КонецЕсли;
147145

@@ -179,7 +177,7 @@
179177

180178
Если КлассОпции = Неопределено Тогда
181179
Лог.Отладка("Неопределенная опция: %1", Строка(ИмяОпции));
182-
Ошибка = ?(Ошибка = Неопределено, ОшибкаНеожидаемаяОпция(ИмяОпции), Ошибка);
180+
Ошибка = ?(Ошибка = Неопределено, ОшибкиПарсера.ОшибкаНеожидаемаяОпция(ИмяОпции), Ошибка);
183181
Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка);
184182
КонецЕсли;
185183

@@ -191,7 +189,7 @@
191189
Если Не КлассОпции.Имя = Опция.Имя Тогда
192190
ИИ = ИИ + 1;
193191
Лог.Отладка("Не нашли опцию %1, %2 <> %3", ИмяОпции, КлассОпции.Имя, Опция.Имя);
194-
Ошибка = ОшибкаОжидаетсяВместо(Опция.Имя, ИмяОпции);
192+
Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо(Опция.Имя, ИмяОпции);
195193
Продолжить;
196194
КонецЕсли;
197195

@@ -225,23 +223,23 @@
225223

226224
Если Аргументы.Вграница() - Индекс = 0 Тогда
227225
Если Не КлассОпции.Имя = Опция.Имя Тогда
228-
Ошибка = ОшибкаОжидаетсяВместо(Опция.Имя, ИмяОпции);
226+
Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо(Опция.Имя, ИмяОпции);
229227
Иначе
230-
Ошибка = ОшибкаТребуетсяЗначение(ИмяОпции);
228+
Ошибка = ОшибкиПарсера.ОшибкаТребуетсяЗначениеДляОпции(ИмяОпции);
231229
КонецЕсли;
232230
Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка);
233231
КонецЕсли;
234232

235233
Если Не КлассОпции.Имя = Опция.Имя Тогда
236-
Ошибка = ОшибкаОжидаетсяВместо(Опция.Имя, ИмяОпции);
234+
Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо(Опция.Имя, ИмяОпции);
237235
Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка, 2);
238236
КонецЕсли;
239237

240238
Значение = Аргументы[Индекс + 1];
241239
Лог.Отладка("Значение найденной опции равно <%1>", Значение);
242240

243241
Если СтрНачинаетсяС(Значение, "-") Тогда
244-
Возврат РезультатПоискаОтрицательный(Аргументы, ОшибкаТребуетсяЗначение(ИмяОпции));
242+
Возврат РезультатПоискаОтрицательный(Аргументы, ОшибкиПарсера.ОшибкаТребуетсяЗначениеДляОпции(ИмяОпции));
245243
КонецЕсли;
246244

247245
ОпцииКонтекст = КонтекстПоиска.Опции[Опция];
@@ -270,7 +268,7 @@
270268
КонецЕсли;
271269

272270
Если Не КлассОпции.Имя = Опция.Имя Тогда
273-
Ошибка = ОшибкаОжидаетсяВместо(Опция.Имя, ИмяОпции);
271+
Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо(Опция.Имя, ИмяОпции);
274272
Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка, 1);
275273
КонецЕсли;
276274

@@ -299,7 +297,9 @@
299297

300298
КонецЦикла;
301299

302-
Ошибка = ?(Обязательный, ОшибкаНеожидаемаяОпция(ТекущийАргумент), Неопределено);
300+
Если Не ЗначениеЗаполнено(Ошибка) Тогда
301+
Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпция(Опция.Имя);
302+
КонецЕсли;
303303

304304
Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка, 1);
305305

@@ -320,7 +320,7 @@
320320
Лог.Отладка("Класс опции по имени %1", КлассОпции);
321321

322322
Если КлассОпции = Неопределено Тогда
323-
Ошибка = ОшибкаНеожидаемаяОпция(ИмяОпции);
323+
Ошибка = ОшибкиПарсера.ОшибкаНеожидаемаяОпция(ИмяОпции);
324324
Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка);
325325
КонецЕсли;
326326

@@ -329,14 +329,14 @@
329329
Лог.Отладка("Строка содержит <=> второй элемент массива %1", МассивСтрокаАргумента[1]);
330330

331331
Если Не КлассОпции.Имя = Опция.Имя Тогда
332-
Ошибка = ОшибкаОжидаетсяВместо(Опция.Имя, ИмяОпции);
332+
Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо(Опция.Имя, ИмяОпции);
333333
Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка, 1);
334334
КонецЕсли;
335335

336336
Значение = МассивСтрокаАргумента[1];
337337

338338
Если ПустаяСтрока(Значение) Тогда
339-
Ошибка = ОшибкаТребуетсяЗначение(ИмяОпции);
339+
Ошибка = ОшибкиПарсера.ОшибкаТребуетсяЗначениеДляОпции(ИмяОпции);
340340
Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка);
341341
КонецЕсли;
342342

@@ -356,7 +356,7 @@
356356
Или КлассОпции.ТипОпции = Тип("Массив") И КлассОпции.ТипЭлементаОпции = Тип("Булево") Тогда
357357

358358
Если Не КлассОпции.Имя = Опция.Имя Тогда
359-
Ошибка = ОшибкаОжидаетсяВместо(Опция.Имя, ИмяОпции);
359+
Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо(Опция.Имя, ИмяОпции);
360360
Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка, 1);
361361
КонецЕсли;
362362

@@ -377,28 +377,28 @@
377377

378378
Если Аргументы.Количество() - Индекс < 2 Тогда
379379
Если Не КлассОпции.Имя = Опция.Имя Тогда
380-
Ошибка = ОшибкаОжидаетсяВместо(Опция.Имя, ИмяОпции);
380+
Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо(Опция.Имя, ИмяОпции);
381381
Иначе
382-
Ошибка = ОшибкаТребуетсяЗначение(ИмяОпции);
382+
Ошибка = ОшибкиПарсера.ОшибкаТребуетсяЗначениеДляОпции(ИмяОпции);
383383
КонецЕсли;
384384
Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка);
385385
КонецЕсли;
386386

387387
Если Не КлассОпции.Имя = Опция.Имя Тогда
388-
Ошибка = ОшибкаОжидаетсяВместо(Опция.Имя, ИмяОпции);
388+
Ошибка = ОшибкиПарсера.ОшибкаОжидаетсяОпцияВместо(Опция.Имя, ИмяОпции);
389389
Возврат РезультатПоискаОтрицательный(Аргументы, Ошибка, 2);
390390
КонецЕсли;
391391

392392
Значение = Аргументы[Индекс + 1];
393393

394394
Если СтрНачинаетсяС(Значение, "-") Тогда
395-
Возврат РезультатПоискаОтрицательный(Аргументы, ОшибкаТребуетсяЗначение(ИмяОпции));
395+
Возврат РезультатПоискаОтрицательный(Аргументы, ОшибкиПарсера.ОшибкаТребуетсяЗначениеДляОпции(ИмяОпции));
396396
КонецЕсли;
397397

398398
Лог.Отладка("Значение длинной опции <%1>", Значение);
399399

400400
Если ПустаяСтрока(Значение) Тогда
401-
Возврат РезультатПоискаОтрицательный(Аргументы, ОшибкаТребуетсяЗначение(ИмяОпции));
401+
Возврат РезультатПоискаОтрицательный(Аргументы, ОшибкиПарсера.ОшибкаТребуетсяЗначениеДляОпции(ИмяОпции));
402402
КонецЕсли;
403403

404404
ОпцииКонтекст = КонтекстПоиска.Опции[Опция];
@@ -446,40 +446,4 @@
446446
Возврат РезультатПоиска;
447447
КонецФункции
448448

449-
Функция ОшибкаТребуетсяЗначение(Имя)
450-
Возврат СтрШаблон("Опция %1 должна содержать значение", ВосстановитьТиреПередОпцией(Имя));
451-
КонецФункции
452-
453-
Функция ОшибкаНеожидаемаяОпция(Имя)
454-
Возврат СтрШаблон("Неожидаемая опция %1", ВосстановитьТиреПередОпцией(Имя));
455-
КонецФункции
456-
457-
Функция ОшибкаОжидаетсяОпция(Имя)
458-
Возврат СтрШаблон("Ожидается опция %1", ВосстановитьТиреПередОпцией(Имя));
459-
КонецФункции
460-
461-
Функция ОшибкаОжидаетсяВместо(Имя, ИмяВместо)
462-
Если Не Обязательный Тогда
463-
Возврат Неопределено;
464-
КонецЕсли;
465-
466-
Возврат СтрШаблон("Ожидается опция %1 вместо %2",
467-
ВосстановитьТиреПередОпцией(Имя),
468-
ВосстановитьТиреПередОпцией(ИмяВместо));
469-
КонецФункции
470-
471-
Функция ВосстановитьТиреПередОпцией(Имя)
472-
473-
Если СтрНачинаетсяС(Имя, "-") Тогда
474-
Возврат Имя;
475-
КонецЕсли;
476-
477-
Если СтрДлина(Имя) > 1 Тогда
478-
Возврат "--" + Имя;
479-
Иначе
480-
Возврат "-" + Имя;
481-
КонецЕсли;
482-
483-
КонецФункции
484-
485449
Лог = Логирование.ПолучитьЛог("oscript.lib.cli_class_opt");

0 commit comments

Comments
 (0)