diff --git a/pkg/protocol/IProtocolReader.go b/pkg/protocol/IProtocolReader.go index 7968d56..9e49fa5 100644 --- a/pkg/protocol/IProtocolReader.go +++ b/pkg/protocol/IProtocolReader.go @@ -2,7 +2,12 @@ package protocol // IProtocolReader Représentation abstraite d'un protocol type IProtocolReader interface { + // Permet de récupérer le nom de la commande + GetCmd() string + + // Permet d'exécuter l'action implémentée par une règle + Execute(data string) string // Permet de vérifier la validité d'une donnée censée suivre les règles d'un protocol - Execute(data string) + Match(data string) bool } diff --git a/pkg/protocol/IProtocolWriter.go b/pkg/protocol/IProtocolWriter.go index 3a07cdf..66c0e71 100644 --- a/pkg/protocol/IProtocolWriter.go +++ b/pkg/protocol/IProtocolWriter.go @@ -2,6 +2,8 @@ package protocol // IProtocolReader Représentation abstraite d'un protocol type IProtocolWriter interface { + // Permet de récupérer le nom de la commande + GetCmd() string // Permet de vérifier la validité d'une donnée censée suivre les règles d'un protocol Execute(argsData []string) diff --git a/pkg/protocol/RequestManager.go b/pkg/protocol/RequestManager.go index 47c2ef8..3cf7ecd 100644 --- a/pkg/protocol/RequestManager.go +++ b/pkg/protocol/RequestManager.go @@ -1,10 +1,20 @@ package protocol +import "_StorBackEnd/pkg/protocol/repository" + type RequestManager struct { + repository repository.ProtocolRepository } -func (receiver RequestManager) Execute(request string) { +func (receiver RequestManager) Execute(request string) string { // On lis ce que l'on reçoit + result, executed := receiver.repository.ExecuteReader(request) // On renvoie la réponse (Comment pour fichier ?) + if executed { + return result + } else { + // TODO : Renvoyer qu'une erreur est survenue + return "Error occured while execute command" + } } diff --git a/pkg/protocol/repository/ProtocolRepository.go b/pkg/protocol/repository/ProtocolRepository.go new file mode 100644 index 0000000..2bc7421 --- /dev/null +++ b/pkg/protocol/repository/ProtocolRepository.go @@ -0,0 +1,54 @@ +package repository + +import ( + "_StorBackEnd/pkg/protocol" +) + +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) (string, bool) { + 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), true + } + } + + return "", false +} + +// 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 +} diff --git a/pkg/protocol/rules/readers/EraseFileRule.go b/pkg/protocol/rules/readers/EraseFileRule.go index eead8db..b11c1b6 100644 --- a/pkg/protocol/rules/readers/EraseFileRule.go +++ b/pkg/protocol/rules/readers/EraseFileRule.go @@ -20,12 +20,15 @@ func CreateEraseFileRule(cmd string, pattern string) *EraseFileRule { } } -func (rule EraseFileRule) execute(data string) { - matcher := rule.matcher +func (rule EraseFileRule) Execute(data string) string { - if matcher.Match(data) { - println("EraseFileRule data is matching") + if rule.Match(data) { + return "Parsing : EraseFileRule command fichier supprimé" } else { - println("EraseFileRule data isn't matching") + return "Parsing : EraseFileRule command fichier non-supprimé" } } + +func (rule EraseFileRule) Match(data string) bool { + return rule.matcher.Match(data) +}