Ускоряем разработку новых фич: как я написал плагин кодогенерации для Protobuf

3e93aa51bfadefd2a600e3f500a91a95.png
package notifications


import (
    "github.com/pkg/errors"
    "google.golang.org/protobuf/reflect/protoreflect"
)


type NotificationProto interface {
    GetGeneral() *EventGeneral
    ProtoReflect() protoreflect.Message
}


type NotificationNameShortPath struct {
    Name        string `json:"name"`
    ShortPath   string `json:"short_path"`
    EventTypeId int32  `json:"event_type_id"`
}


// NotificationsTypeList — cписок всех уведомлений (название, сокращенный путь топика MQTT и номер типа события контроллера)
var NotificationsTypeList = []NotificationNameShortPath{{"Фото", "********", 0}, {"Пользователь рядом (BLE)", "********", 0}, {"Пользователь ушел (BLE)", "********", 0}, {"Авторизация началась", "********", 0}, {"Авторизация завершилась успешно", "********", 0}, {"Авторизация не удалась", "********", 0}, {"Ошибка авторизации", "********", 0}, {"Синхронизация пользователей началась", "********", 0}, {"Синхронизация доступов завершилась успешно", "********", 0}, {"Синхронизация доступов завершилась с ошибкой", "********", 0}, {"Добавлен пользователь", "********", 0}, {"Обновлён пользователь", "********", 0}, {"Удалён пользователь", "********", 0}, {"Дверь открыта", "********", 0}, {"Дверь закрыта", "********", 0}, {"Контроллер включился", "********", 0}, {"Контроллер подключился", "********", 0}, {"Контроллер отключился", "********", 0}, {"Изменены настройки", "********", 0}, {"Ошибка при изменении", "********", 0}, {"Изменение состояния закрытости замка", "********", 0}, {"Изменение состояния ригеля", "********", 0}, {"Изменение состояния язычка", "********", 0}, {"Изменение состояния ручки", "********", 0}, {"Изменение состояния цилиндра", "********", 0}, {"Ошибка замка", "********", 0}}


// NotificationsGroupList — cписок всех названий групп уведомлений
var NotificationsGroupList = []string{"Фото", "Пользователь рядом", "Авторизация", "Доступы", "Дверь", "Подключение", "Настройки контроллера", "Замок"}


// NotificationsShortPathList — cписок всех сокращенных путей топиков MQTT для уведомлений
var NotificationsShortPathList = []string{"********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********", "********"}


// NotificationsWithGroupMap — мапа с ключом в виде названия группы уведомлений, значением структуры (название события, сокращенный путь топика MQTT)
var NotificationsWithGroupMap = map[string][]NotificationNameShortPath{


    "Авторизация": []NotificationNameShortPath{{"Авторизация началась", "********", 0}, {"Авторизация завершилась успешно", "********", 0}, {"Авторизация не удалась", "********", 0}, {"Ошибка авторизации", "********", 0}},
    "Дверь":       []NotificationNameShortPath{{"Дверь открыта", "********", 0}, {"Дверь закрыта", "********", 0}},
    "Доступы":     []NotificationNameShortPath{{"Синхронизация пользователей началась", "********", 0}, {"Синхронизация доступов завершилась успешно", "********", 0}, {"Синхронизация доступов завершилась с ошибкой", "********", 0}, {"Добавлен пользователь", "********", 0}, {"Обновлён пользователь", "********", 0}, {"Удалён пользователь", "********", 0}},
    "Замок":       []NotificationNameShortPath{{"Изменение состояния закрытости замка", "********", 0}, {"Изменение состояния ригеля", "********", 0}, {"Изменение состояния язычка", "********", 0}, {"Изменение состояния ручки", "********", 0}, {"Изменение состояния цилиндра", "********", 0}, {"Ошибка замка", "********", 0}},
    "Настройки контроллера": []NotificationNameShortPath{{"Изменены настройки", "********", 0}, {"Ошибка при изменении", "********", 0}},
    "Подключение":           []NotificationNameShortPath{{"Контроллер включился", "********", 0}, {"Контроллер подключился", "********", 0}, {"Контроллер отключился", "********", 0}},
    "Пользователь рядом":    []NotificationNameShortPath{{"Пользователь рядом (BLE)", "********", 0}, {"Пользователь ушел (BLE)", "********", 0}},
    "Фото":                  []NotificationNameShortPath{{"Фото", "********", 0}},
}


var (
    UnknownNotificationPathErr = errors.New("unknown notification path")
)


// NewNotificationByPath — функция для получения protobuf типа структуры уведомления по теме MQTT
func NewNotificationByPath(notificationPath string) (notification NotificationProto, err error) {
    switch notificationPath {


    case "********":
        notification = new(PhotoEvent)
        return


    case "********":
        notification = new(BleDeviceNearEvent)
        return


    case "********":
        notification = new(BleDeviceGoneEvent)
        return


    case "********":
        notification = new(AcsAuthProcessingEvent)
        return


    case "********":
        notification = new(AcsAuthSuccessEvent)
        return


    case "********":
        notification = new(AcsAuthErrorEvent)
        return


    case "********":
        notification = new(AcsAuthFailedEvent)
        return


    case "********":
        notification = new(AcsUserSyncProcessingEvent)
        return


    case "********":
        notification = new(AcsUserSyncSuccessEvent)
        return


    case "********":
        notification = new(AcsUserSyncErrorEvent)
        return


    case "********":
        notification = new(AcsUserCreateEvent)
        return


    case "********":
        notification = new(AcsUserUpdateEvent)
        return


    case "********":
        notification = new(AcsUserDeleteEvent)
        return


    case "********":
        notification = new(DoorOpenedEvent)
        return


    case "********":
        notification = new(DoorClosedEvent)
        return


    case "********":
        notification = new(StateStartedEvent)
        return


    case "********":
        notification = new(StateConnectedEvent)
        return


    case "********":
        notification = new(StateDisconnectedEvent)
        return


    case "********":
        notification = new(ConfigSuccessEvent)
        return


    case "********":
        notification = new(ConfigErrorEvent)
        return


    case "********":
        notification = new(ModuleLockClosed)
        return


    case "********":
        notification = new(ModuleLockLock)
        return


    case "********":
        notification = new(ModuleLockTrigger)
        return


    case "********":
        notification = new(ModuleLockHandle)
        return


    case "********":
        notification = new(ModuleLockCylinder)
        return


    case "********":
        notification = new(ModuleLockError)
        return


    default:
        err = UnknownNotificationPathErr
        return
    }
}


// NameAndGroupByShortPathMqtt — функция для получения названия, группы и описания уведомления по сокращенной теме MQTT
// Используется для отображения списка уведомлений контроллера в панели управления и генерации уведомлений в мессенджерах
func NameAndGroupAndDescriptionByShortPathMqtt(notificationPath string) (name string, group string, description string, err error) {
    switch notificationPath {


    case "********":
        return "Фото", "Фото", "Фото, инициированное каким-то другим событием", nil


    case "********":
        return "Пользователь рядом (BLE)", "Пользователь рядом", "Событие обнаружения пользователя при помощи BLE", nil


    case "********":
        return "Пользователь ушел (BLE)", "Пользователь рядом", "Событие потери пользователя из области видимости при помощи BLE", nil


    case "********":
        return "Авторизация началась", "Авторизация", "Попытка авторизации", nil


    case "********":
        return "Авторизация завершилась успешно", "Авторизация", "Успешная попытка авторизации", nil


    case "********":
        return "Авторизация не удалась", "Авторизация", "Ошибка при попытке авторизации (авторизация может быть не завершена), уведомляет о любых ошибках в процессе авторизации", nil


    case "********":
        return "Ошибка авторизации", "Авторизация", "Авторизация провалена (завершена)", nil


    case "********":
        return "Синхронизация пользователей началась", "Доступы", "Начало процесса синхронизации доступов пользователей", nil


    case "********":
        return "Синхронизация доступов завершилась успешно", "Доступы", "Cобытие успешной синхронизации доступов пользователей", nil


    case "********":
        return "Синхронизация доступов завершилась с ошибкой", "Доступы", "Ошибка при синхронизации доступов пользователей", nil


    case "********":
        return "Добавлен пользователь", "Доступы", "Cобытие добавления доступа пользователя", nil


    case "********":
        return "Обновлён пользователь", "Доступы", "Cобытие обновления данных доступа пользователя", nil


    case "********":
        return "Удалён пользователь", "Доступы", "Событие удаления доступа пользователя", nil


    case "********":
        return "Дверь открыта", "Дверь", "Cобытие открытия двери (геркон разомкнулся)", nil


    case "********":
        return "Дверь закрыта", "Дверь", "Событие закрытия двери (геркон замкнулся)", nil


    case "********":
        return "Контроллер включился", "Подключение", "Событие включения контроллера", nil


    case "********":
        return "Контроллер подключился", "Подключение", "Событие подключения контроллера к серверу (в том числе и после разрыва соединения)", nil


    case "********":
        return "Контроллер отключился", "Подключение", "Событие разрыва соединения контроллера с сервером (не отправляется контроллером)", nil


    case "********":
        return "Изменены настройки", "Настройки контроллера", "Событие успешного изменения настроек", nil


    case "********":
        return "Ошибка при изменении", "Настройки контроллера", "Событие ошибки при изменении настроек", nil


    case "********":
        return "Изменение состояния закрытости замка", "Замок", "Изменение состояния замка (закрыт/не закрыт)", nil


    case "********":
        return "Изменение состояния ригеля", "Замок", "Изменение состояния ригеля (выдвинулся/не выдвинулся)", nil


    case "********":
        return "Изменение состояния язычка", "Замок", "Изменение состояния язычка (нажат/не нажат)", nil


    case "********":
        return "Изменение состояния ручки", "Замок", "Изменение состояния ручки (нажата/не нажата)", nil


    case "********":
        return "Изменение состояния цилиндра", "Замок", "Изменение состояния цилиндра", nil


    case "********":
        return "Ошибка замка", "Замок", "Любая ошибка модуля", nil


    default:
        err = UnknownNotificationPathErr
        return
    }
}

© Habrahabr.ru