Skip to content

ansanych/cyberpb2

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

21 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

cyberpb2

Protobuf-контракты и утилиты для сервисов Cybermetrica.

Установка

go get github.com/ansanych/cyberpb2

Структура модуля

proto/
├── cyber.proto           # Базовые protobuf-контракты (Status, HealthReply, Empty и др.)
├── cyber.pb.go           # Сгенерированный Go-код из cyber.proto
├── cybermetrica.proto    # Protobuf-контракты сервиса Cybermetrica
├── cybermetrica.pb.go    # Сгенерированный Go-код из cybermetrica.proto
├── cyberfuel.proto       # Protobuf-контракты сервиса Cyberfuel
├── cyberfuel.pb.go       # Сгенерированный Go-код из cyberfuel.proto
├── status_json.go        # Кастомная JSON-сериализация для enum Status
└── protojson.go          # Утилиты для сериализации protobuf-сообщений в JSON

Использование

Импорт

import (
    "github.com/ansanych/cyberpb2/proto"
)

Сериализация protobuf-ответов в JSON

Enum Status по умолчанию сериализуется как integer (0, 1, 2...).
Для получения строковых значений ("OK", "ERROR"...), используйте proto.MarshalProtoJSON:

// Создаём ответ
reply := &proto.HealthReply{
    Postgres: proto.Status_OK,
    Mongo:    proto.Status_ACTIVE,
    Parser:   proto.Status_ERROR,
    Disk: &proto.Disk{
        All:  500.0,
        Used: 120.5,
        Free: 379.5,
    },
}

// Сериализация в JSON с enum-строками
jsonBytes, err := proto.MarshalProtoJSON(reply)
if err != nil {
    log.Fatal(err)
}
fmt.Println(string(jsonBytes))
// {"postgres":"OK","mongo":"ACTIVE","parser":"ERROR","disk":{"all":500,"used":120.5,"free":379.5}}

Стандартный json.Marshal для отдельных enum-значений

Для отдельных значений Status можно использовать стандартный json.Marshal — он будет выводить строку благодаря кастомному MarshalJSON:

status := proto.Status_OK
jsonBytes, _ := json.Marshal(status)
fmt.Println(string(jsonBytes)) // "OK"

Десериализация JSON в protobuf

data := []byte(`{"postgres":"OK","mongo":"ACTIVE","parser":"ERROR"}`)
reply := &proto.HealthReply{}
err := proto.UnmarshalProtoJSON(data, reply)
// Принимает как строки ("OK"), так и числа (3)

Использование с HTTP-сервером

func healthHandler(w http.ResponseWriter, r *http.Request) {
    // Получаем ответ от gRPC-сервиса
    reply, err := grpcClient.Health(ctx, &proto.Empty{})
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    // Сериализуем в JSON с enum-строками
    w.Header().Set("Content-Type", "application/json")
    jsonBytes, _ := proto.MarshalProtoJSON(reply)
    w.Write(jsonBytes)
}

Генерация Go-кода из proto-файлов

make gen-go

Генерация Python-кода

make gen-py

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors