rafaeljusto/atiradorfrequente

Utilizar hooks nas configurações

Opened this issue · 2 comments

Acrescentar no pacote núcleo/config um sistema de registro de Hooks de configuração. Com isso as inicializações de banco de dados, syslog, etc. são removidas da inicialização do servidor e movidas para um local mais apropriado, tornando o sistema mais modularizado.

Não sei se teríamos muito ganho com isso, pois tanto no caso do banco de dados quanto no caso do syslog as informações encontram-se na configuração do servidor REST. Portanto o gancho (hook) não poderia estar no pacote núcleo/db ou em um núcleo/syslog para não termos referências do servidor REST no núcleo do projeto.

Se movermos os ganchos para pacotes novos no servidor REST, parece ser um desacoplamento desnecessário. Portanto por enquanto não vejo necessidade de implementar isso.

Mas vou deixar o código de registro de gancho aqui para uma iteração futura. A ideia de receber uma interface vazia como parâmetro da função não me agrada, mas não vi uma solução melhor por enquanto.

núcleo/config/gancho.go

package config

import (
    "sort"

    "github.com/rafaeljusto/atiradorfrequente/núcleo/erros"
)

var ganchos = make(map[int][]Gancho)

// Gancho descreve a função de pós-execução após carregar as configurações.
// Útil para executar ações como conectar-se ao banco de dados, inicializar
// o log, etc.
type Gancho func(config interface{}) error

// RegistrarGancho armazena as funções de pós-execução da configuração.
func RegistrarGancho(g Gancho, prioridade int) {
    ganchos[prioridade] = append(ganchos[prioridade], g)
}

// ExecutarGanchos executa todas as funções de pós-execução da configuração
// que foram previamente registradas.
func ExecutarGanchos(config interface{}) error {
    var prioridades []int
    for p := range ganchos {
        prioridades = append(prioridades, p)
    }

    sort.Ints(prioridades)

    for _, p := range prioridades {
        g := ganchos[p]
        for _, gancho := range g {
            if err := gancho(config); err != nil {
                return erros.Novo(err)
            }
        }
    }

    return nil
}

Pensando melhor até poderíamos fazer uma interface que corresponde-se a todos os campos da configuração necessários para iniciar o componente desejado (BD ou syslog). Vou reabrir a tarfefa para pensar melhor sobre isso.