package repository import ( "StoreBackEnd/pkg/protocol" "bufio" ) 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 }