StoreBackEnd/pkg/protocol/repository/ProtocolRepository.go

72 lines
2.2 KiB
Go
Raw Permalink Normal View History

package repository
import (
"StoreBackEnd/pkg/protocol"
"bufio"
)
2022-02-22 08:29:11 +01:00
func CreateProtocolRepository() *ProtocolRepository {
return &ProtocolRepository{
protocolReaders: make(map[string]*protocol.IProtocolReader),
protocolWriters: make(map[string]*protocol.IProtocolWriter),
}
}
type ProtocolRepository struct {
protocolReaders map[string]*protocol.IProtocolReader
protocolWriters map[string]*protocol.IProtocolWriter
}
// AddReader Permet d'ajouter une règle servant à lire une commande
func (repo ProtocolRepository) AddReader(reader *protocol.IProtocolReader) {
cmd := (*reader).GetCmd()
if cmd != "" && !repo.containsReader(cmd) {
repo.protocolReaders[cmd] = reader
}
}
// AddWriter Permet d'ajouter une règle servant à construire une commande
func (repo ProtocolRepository) AddWriter(writer *protocol.IProtocolWriter) {
cmd := (*writer).GetCmd()
if cmd != "" && !repo.containsWriter(cmd) {
repo.protocolWriters[cmd] = writer
}
}
/*
ExecuteReader Permet d'exécuter un Reader et de récupérer la commande à renvoyer. La deuxième valeur de retour permet de savoir si une commande a put être exécuté
*/
func (repo ProtocolRepository) ExecuteReader(data string) (*protocol.ProtocolWriterResult, func(reader *bufio.Reader) *protocol.ProtocolWriterResult) {
for _, reader := range repo.protocolReaders {
if (*reader).Match(data) { // Exécuter si match
// Récupérer résultat à renvoyer (Donc donner ProtocolRepository aux reader ?!)
return (*reader).Execute(data)
}
}
return nil, nil
}
/*
ExecuteReader Permet d'exécuter un Wrier et de récupérer la commande construite avec nos argument et un indicateur de réussite.
*/
func (repo ProtocolRepository) ExecuteWriter(ruleName string, data ...string) *protocol.ProtocolWriterResult {
protocolWriter, has := repo.protocolWriters[ruleName]
if has {
return (*protocolWriter).Execute(data...)
} else {
return nil
}
}
// containsReader Permet de vérifier si le reader est déjà contenu
func (repo ProtocolRepository) containsReader(cmd string) bool {
_, has := repo.protocolReaders[cmd]
return has
}
// containsReader Permet de vérifier si le writer est déjà contenu
func (repo ProtocolRepository) containsWriter(cmd string) bool {
_, has := repo.protocolWriters[cmd]
return has
}