Skip to content

Commit 491dd4b

Browse files
Copilotnixel2007
andauthored
Use DI injection for КомандаПриложения beans and СборщикОпций for ОписаниеКоманды-based commands
Agent-Logs-Url: https://github.com/oscript-library/ovm/sessions/133e180e-c446-4b87-ab6a-acbb38796823 Co-authored-by: nixel2007 <1132840+nixel2007@users.noreply.github.com>
1 parent f7ca444 commit 491dd4b

2 files changed

Lines changed: 143 additions & 23 deletions

File tree

src/cmd/Классы/КомандаCompletions.os

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
&ЛогOVM
44
Перем Лог;
55

6-
&Пластилин
7-
Перем Поделка;
6+
&Пластилин(Тип = "ТаблицаЗначений", Значение = "КомандаПриложения")
7+
Перем КомандыПриложения;
8+
9+
Перем Рефлектор;
810

911
&Опция(Имя = "shell s", Описание = "Тип оболочки для генерации автодополнения (поддерживается: bash)")
1012
&ТСтрока
@@ -14,6 +16,7 @@
1416

1517
&КомандаПриложения(Имя = "completions", Описание = "Вывести скрипт автодополнения команд для выбранной оболочки")
1618
Процедура ПриСозданииОбъекта()
19+
Рефлектор = Новый Рефлектор();
1720
КонецПроцедуры
1821

1922
&ВыполнениеКоманды
@@ -125,14 +128,13 @@ complete -F _ovm_completions ovm";
125128

126129
Функция ПолучитьДеревоКоманд()
127130

128-
ОпределенияКоманд = Поделка.ПолучитьОпределенияЖелудей("КомандаПриложения");
129-
130131
// Первый проход: собрать все команды с их именами желудей и родителями
131132
ВсеИнфо = Новый Соответствие();
132133

133-
Для Каждого КлючЗначение Из ОпределенияКоманд Цикл
134-
ИмяЖелудя = КлючЗначение.Ключ;
135-
ОпределениеЖелудя = КлючЗначение.Значение;
134+
Для Каждого ДанныеЖелудя Из КомандыПриложения Цикл
135+
ИмяЖелудя = ДанныеЖелудя.Имя;
136+
ОпределениеЖелудя = ДанныеЖелудя.ОпределениеЖелудя;
137+
Желудь = ДанныеЖелудя.Желудь;
136138
Конструктор = ОпределениеЖелудя.Завязь().ДанныеМетода();
137139

138140
АннотацияКоманды = РаботаСАннотациями.НайтиАннотацию(Конструктор.Аннотации, "КомандаПриложения");
@@ -151,7 +153,7 @@ complete -F _ovm_completions ovm";
151153
ИнфоКоманды.ИмяЖелудя = ИмяЖелудя;
152154
ИнфоКоманды.Родитель = Родитель;
153155
ИнфоКоманды.Имена = СтрРазделить(ИмяКоманды, " ");
154-
ИнфоКоманды.Опции = ПолучитьОпцииКоманды(ОпределениеЖелудя);
156+
ИнфоКоманды.Опции = ПолучитьОпцииКоманды(Желудь, ОпределениеЖелудя);
155157

156158
ВсеИнфо.Вставить(ИмяЖелудя, ИнфоКоманды);
157159
КонецЦикла;
@@ -199,27 +201,35 @@ complete -F _ovm_completions ovm";
199201

200202
КонецФункции
201203

202-
Функция ПолучитьОпцииКоманды(ОпределениеЖелудя)
204+
Функция ПолучитьОпцииКоманды(Желудь, ОпределениеЖелудя)
203205

204206
Опции = Новый Массив();
205207
Опции.Добавить("--help");
206208

207-
Свойства = ОпределениеЖелудя.Свойства();
208-
Для Каждого Свойство Из Свойства Цикл
209-
АннотацияОпции = РаботаСАннотациями.ПолучитьАннотацию(Свойство, "Опция");
210-
Если АннотацияОпции = Неопределено Тогда
211-
Продолжить;
212-
КонецЕсли;
213-
214-
ИмяОпции = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияОпции, "Имя");
215-
Для Каждого ЧастьОпции Из СтрРазделить(ИмяОпции, " ") Цикл
216-
Если СтрДлина(ЧастьОпции) = 1 Тогда
217-
Опции.Добавить("-" + ЧастьОпции);
218-
Иначе
219-
Опции.Добавить("--" + ЧастьОпции);
209+
Если Рефлектор.МетодСуществует(Желудь, "ОписаниеКоманды") Тогда
210+
Сборщик = Новый СборщикОпций();
211+
Желудь.ОписаниеКоманды(Сборщик);
212+
Для Каждого ИмяОпции Из Сборщик.ПолучитьОпции() Цикл
213+
Опции.Добавить(ИмяОпции);
214+
КонецЦикла;
215+
Иначе
216+
Свойства = ОпределениеЖелудя.Свойства();
217+
Для Каждого Свойство Из Свойства Цикл
218+
АннотацияОпции = РаботаСАннотациями.ПолучитьАннотацию(Свойство, "Опция");
219+
Если АннотацияОпции = Неопределено Тогда
220+
Продолжить;
220221
КонецЕсли;
222+
223+
ИмяОпции = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияОпции, "Имя");
224+
Для Каждого ЧастьОпции Из СтрРазделить(ИмяОпции, " ") Цикл
225+
Если СтрДлина(ЧастьОпции) = 1 Тогда
226+
Опции.Добавить("-" + ЧастьОпции);
227+
Иначе
228+
Опции.Добавить("--" + ЧастьОпции);
229+
КонецЕсли;
230+
КонецЦикла;
221231
КонецЦикла;
222-
КонецЦикла;
232+
КонецЕсли;
223233

224234
Возврат Опции;
225235

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
// Вспомогательный класс для сбора имён опций команды.
2+
// Используется как заглушка вместо КомандаПриложения при вызове ОписаниеКоманды(),
3+
// чтобы получить зарегистрированные опции без запуска команды.
4+
5+
Перем Опции; // Массив - собранные имена опций
6+
7+
Процедура ПриСозданииОбъекта()
8+
Опции = Новый Массив();
9+
КонецПроцедуры
10+
11+
// Перехватывает регистрацию опции и возвращает себя для поддержки цепочек вызовов.
12+
//
13+
// Параметры:
14+
// Имя - Строка - имя опции (может включать синонимы через пробел, например "clean c")
15+
// Значение - Произвольный - значение по умолчанию (не используется)
16+
// Описание - Строка - описание (не используется)
17+
//
18+
// Возвращаемое значение:
19+
// СборщикОпций - ЭтотОбъект для цепочки вызовов
20+
Функция Опция(Имя, Значение = "", Описание = "") Экспорт
21+
22+
Для Каждого ЧастьИмени Из СтрРазделить(Имя, " ", Ложь) Цикл
23+
Если СтрДлина(ЧастьИмени) = 1 Тогда
24+
Опции.Добавить("-" + ЧастьИмени);
25+
Иначе
26+
Опции.Добавить("--" + ЧастьИмени);
27+
КонецЕсли;
28+
КонецЦикла;
29+
30+
Возврат ЭтотОбъект;
31+
32+
КонецФункции
33+
34+
// Игнорирует регистрацию аргумента (позиционные аргументы не нужны для автодополнения опций).
35+
//
36+
// Возвращаемое значение:
37+
// СборщикОпций - ЭтотОбъект для цепочки вызовов
38+
Функция Аргумент(Имя, Значение = "", Описание = "") Экспорт
39+
Возврат ЭтотОбъект;
40+
КонецФункции
41+
42+
// Методы цепочки вызовов — возвращают ЭтотОбъект, не выполняя реальных действий.
43+
44+
Функция ТСтрока() Экспорт
45+
Возврат ЭтотОбъект;
46+
КонецФункции
47+
48+
Функция ТЧисло() Экспорт
49+
Возврат ЭтотОбъект;
50+
КонецФункции
51+
52+
Функция ТБулево() Экспорт
53+
Возврат ЭтотОбъект;
54+
КонецФункции
55+
56+
Функция ТДата(ФорматДаты = "") Экспорт
57+
Возврат ЭтотОбъект;
58+
КонецФункции
59+
60+
Функция ТМассивСтрок() Экспорт
61+
Возврат ЭтотОбъект;
62+
КонецФункции
63+
64+
Функция ТМассивЧисел() Экспорт
65+
Возврат ЭтотОбъект;
66+
КонецФункции
67+
68+
Функция ТМассивДат() Экспорт
69+
Возврат ЭтотОбъект;
70+
КонецФункции
71+
72+
Функция ВОкружении(Переменная) Экспорт
73+
Возврат ЭтотОбъект;
74+
КонецФункции
75+
76+
Функция Флаговый() Экспорт
77+
Возврат ЭтотОбъект;
78+
КонецФункции
79+
80+
Функция Флаг() Экспорт
81+
Возврат ЭтотОбъект;
82+
КонецФункции
83+
84+
Функция СкрытьВСправке() Экспорт
85+
Возврат ЭтотОбъект;
86+
КонецФункции
87+
88+
Функция ПоУмолчанию(Значение) Экспорт
89+
Возврат ЭтотОбъект;
90+
КонецФункции
91+
92+
Функция Обязательный(Признак = Истина) Экспорт
93+
Возврат ЭтотОбъект;
94+
КонецФункции
95+
96+
Функция ПодробноеОписание(Описание) Экспорт
97+
Возврат ЭтотОбъект;
98+
КонецФункции
99+
100+
Функция Псевдоним(Имя) Экспорт
101+
Возврат ЭтотОбъект;
102+
КонецФункции
103+
104+
// Возвращает собранные имена опций.
105+
//
106+
// Возвращаемое значение:
107+
// Массив - список строк вида "--name" и "-n"
108+
Функция ПолучитьОпции() Экспорт
109+
Возврат Опции;
110+
КонецФункции

0 commit comments

Comments
 (0)