Service Sequences as Code — gera código de serviço a partir de um DSL de comentários Go.

A lógica de serviço é uma série de decisões: qual modelo consultar, contra o que proteger, quando rejeitar, o que retornar. Essas decisões pertencem a quem entende o negócio — mas ficam enterradas em boilerplate, espalhadas entre camadas e perdidas em reescritas.

O SSaC preserva essas decisões como uma especificação declarativa. Você declara o que acontece e em que ordem. A ferramenta gera a implementação.

specs/service/*.go  →  ssac validate  →  ssac gen  →  artifacts/service/*.go

GitHub

Ideia Central

Toda função de serviço é uma sequência de passos. Cada passo segue um contrato binário: sucesso → próxima linha, falha → return. Não é uma abstração inventada — é como a lógica de serviço já funciona. O SSaC torna isso explícito.

10 tipos de sequência fixos cobrem todas as operações da camada de serviço que seguem este contrato. O que não se encaixar, delegue ao call. O conjunto é fechado por design.

Sem LLM, sem inferência — codegen simbólico puro a partir de templates. A especificação é a fonte de verdade.

Exemplo

// @sequence get
// @model Project.FindByID
// @param ProjectID request
// @result project Project

// @sequence guard nil project
// @message "project not found"

// @sequence post
// @model Session.Create
// @param ProjectID request
// @param Command request
// @result session Session

// @sequence response json
// @var session
func CreateSession(w http.ResponseWriter, r *http.Request) {}

Esta declaração de 10 linhas gera o seguinte código:

func CreateSession(w http.ResponseWriter, r *http.Request) {
    projectID := r.FormValue("ProjectID")
    command := r.FormValue("Command")

    project, err := projectModel.FindByID(projectID)
    if err != nil {
        http.Error(w, "Project lookup failed", http.StatusInternalServerError)
        return
    }

    if project == nil {
        http.Error(w, "project not found", http.StatusNotFound)
        return
    }

    session, err := sessionModel.Create(projectID, command)
    if err != nil {
        http.Error(w, "Session creation failed", http.StatusInternalServerError)
        return
    }

    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(map[string]interface{}{
        "session": session,
    })
}

Tipos de Sequência (10)

TipoPapel
authorizeVerificação de permissão (OPA, etc.)
getBusca de recurso
guard nilSair se nulo
guard existsSair se existir
postCriação de recurso
putAtualização de recurso
deleteExclusão de recurso
passwordComparação de senha
callChamada externa (@component / @func)
responseRetornar resposta (json)

Recursos de Codegen

/api/reservations:
  get:
    operationId: ListReservations
    x-pagination:
      style: offset
      defaultLimit: 20
      maxLimit: 100
    x-sort:
      allowed: [start_at, created_at]
      default: start_at
      direction: desc
    x-filter:
      allowed: [status, room_id]
    x-include:
      allowed: [room, user]

Licença

MIT — GitHub