101 lines
3.1 KiB
Go
101 lines
3.1 KiB
Go
package gomodules
|
||
|
||
import (
|
||
"fmt"
|
||
"rubric/utils"
|
||
"strings"
|
||
)
|
||
|
||
// Module описывает один раздел справочника
|
||
type Module struct {
|
||
Key string // основной ключ для -topic
|
||
Aliases []string // сокращения
|
||
Title string // название в меню
|
||
Description string // краткое описание
|
||
Run func() // функция вывода
|
||
}
|
||
|
||
// All — список всех модулей в порядке меню
|
||
var All = []Module{
|
||
BasicsModule,
|
||
StructuresModule,
|
||
// сюда будут добавляться новые модули
|
||
}
|
||
|
||
// Find ищет модуль по ключу или алиасу
|
||
func Find(key string) (Module, bool) {
|
||
key = strings.ToLower(strings.TrimSpace(key))
|
||
for _, m := range All {
|
||
if m.Key == key {
|
||
return m, true
|
||
}
|
||
for _, a := range m.Aliases {
|
||
if a == key {
|
||
return m, true
|
||
}
|
||
}
|
||
}
|
||
return Module{}, false
|
||
}
|
||
|
||
// ShowMenu отображает интерактивное меню
|
||
func ShowMenu() {
|
||
utils.Header("Справочник Go")
|
||
|
||
fmt.Printf(" %s%sДоступные разделы:%s\n\n", utils.ColorBold, utils.ColorWhite, utils.ColorReset)
|
||
|
||
for i, m := range All {
|
||
aliases := ""
|
||
if len(m.Aliases) > 0 {
|
||
aliases = fmt.Sprintf("%s [%s]%s", utils.ColorDim, strings.Join(m.Aliases, ", "), utils.ColorReset)
|
||
}
|
||
fmt.Printf(" %s%s%2d.%s %-10s %s%-36s%s%s\n",
|
||
utils.ColorBold, utils.ColorCyan, i+1, utils.ColorReset,
|
||
utils.ColorYellow+utils.ColorBold+m.Key+utils.ColorReset,
|
||
utils.ColorWhite, m.Title, utils.ColorReset,
|
||
aliases,
|
||
)
|
||
fmt.Printf(" %s%s%s\n", utils.ColorDim, m.Description, utils.ColorReset)
|
||
fmt.Println()
|
||
}
|
||
|
||
fmt.Printf(" %s%sВведите номер или ключ раздела (q — выход):%s ", utils.ColorBold, utils.ColorGreen, utils.ColorReset)
|
||
}
|
||
|
||
// ShowHelp выводит справку по ключам
|
||
func ShowHelp() {
|
||
utils.Header("rubric — справка по использованию")
|
||
|
||
utils.Section("Запуск")
|
||
utils.Command("./rubric", "интерактивное меню")
|
||
utils.Command("./rubric -topic basics", "открыть раздел напрямую")
|
||
utils.Command("./rubric -topic b", "по короткому алиасу")
|
||
utils.Command("./rubric -list", "список всех разделов")
|
||
utils.Command("./rubric -help", "эта справка")
|
||
fmt.Println()
|
||
|
||
utils.Section("Доступные разделы и ключи")
|
||
for _, m := range All {
|
||
keys := append([]string{m.Key}, m.Aliases...)
|
||
fmt.Printf(" %s%-10s%s %-32s %sключи: %s%s\n",
|
||
utils.ColorBold+utils.ColorCyan, m.Key, utils.ColorReset,
|
||
m.Title,
|
||
utils.ColorDim, strings.Join(keys, ", "), utils.ColorReset,
|
||
)
|
||
}
|
||
|
||
utils.Footer()
|
||
}
|
||
|
||
// ListModules выводит краткий список модулей
|
||
func ListModules() {
|
||
fmt.Printf("\n%s%sРазделы Go:%s\n\n", utils.ColorBold, utils.ColorCyan, utils.ColorReset)
|
||
for i, m := range All {
|
||
fmt.Printf(" %s%d.%s %-10s — %s\n",
|
||
utils.ColorDim, i+1, utils.ColorReset,
|
||
utils.ColorYellow+utils.ColorBold+m.Key+utils.ColorReset,
|
||
m.Title,
|
||
)
|
||
}
|
||
fmt.Println()
|
||
}
|