From 611293a14a7b0ea0f9c9b10a2260796406db3ecf Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Sat, 19 Aug 2023 11:59:33 +0200 Subject: [PATCH] =?UTF-8?q?Added=20new=20Paragraph=20-Type=20Matches=20auf?= =?UTF-8?q?=20eigene=20Typen=20erm=C3=B6glichen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CommandFramework.md | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/CommandFramework.md b/CommandFramework.md index 4848745..fe61798 100644 --- a/CommandFramework.md +++ b/CommandFramework.md @@ -35,15 +35,45 @@ public class TestCommand extends SWCommand { } @Register - public void entry1(CommandSender sender, int argument) { + public void pattern1(CommandSender sender, int argument) { System.out.println(argument); } @Register - public void entry2(CommandSender sender, boolean argument) { + public void pattern2(CommandSender sender, boolean argument) { System.out.println(argument); } } ``` Betrachten wir nun folgende Eingabe eines Users `/test true` da *true* ein `boolean`-Wert ist wird das Framework `entry2` aufrufen, da diese Methode genau ein boolean-Argument akzeptiert. Betrachten wir nun einen weiteren Aufruf: `/test 12`. Bei diesem Aufruf wurde ein Argument vom Typ `int` angegeben. Also wir `entry1` aufgerufen. + +## Type Matches auf eigene Typen ermöglichen ## +Um Matchings auf einen eigenen Typen zu ermöglichen, ist es zuerst notwendig einen *TypeMapper* zu schreiben. Hierzu ist es notwendig das `TypeMapper`-Interface zu implementieren. Bei dieser Implementation ist es notwendig die `map`-Methode zu implementieren. In dieser Methode definierst du, wie der Command Input auf den gewünschten Typ gemappt wird. Zusätzlich musst du auch noch die `tabCompletes`-Methode implementiern. In dieser bestimmst du, welche TabCompleations dem Nutzer, abhängig vom Momentanen und vorheriegen Inputs vorgeschlagen werden. Schauen wir uns dies nun einmal an einem Beispiel an: + +``` java +public class BooleanMapper extends TypeMapper{ + + @Override + public Boolean map(Object sender, PreviousArguments previousArguments, String s) { + if (s.equalsIgnoreCase("true")) return true; + if (s.equalsIgnoreCase("false")) return false; + return null; + } + + @Override + public List tabCompletes(Object sender, PreviousArguments previousArguments, String s) { + return Arrays.asList("true", "false"); + } +} +``` + +Nachdem wir nun den Mapper defeniert haben ist es noch notwendig den Mapper zu registrieren. Hierzu erstellst du eine Methode, die eine Instanz des Mappers zurück gibt. Diese Methode annotierst du dan noch mit `@ClassMapper(value=Type.class, local=true)`. Das Atribut `value` muss hierbei auf die Klasse des zu matchenden Typen gesetzt werden. Weiterhin kanst du mit `local` defenieren, ob der Mapper nur innerhalb der Klasse, oder Global gelten soll. Der Code zu dem vorheriegen Beispiel sähe zum Beispiel so aus: + +``` java +@ClassMapper(value=Boolean.class, local=false) +public TypeMapper booleanMapper(){ + return new BooleanMapper(); +} + +```