Repository: AY2425S2-CS2103T-F13-3/tp
Pull request #55: Add function to query for contacts based on name
Author: login: zeotheburrito
Created: 2025-03-18T15:25:44Z | Merged: 2025-03-20T05:02:25Z

Fixes #42 

Linked issue #42: Add function to query for contacts based on name

Diff:
diff --git a/src/main/java/hirehive/address/logic/Messages.java b/src/main/java/hirehive/address/logic/Messages.java
index 58e8ae6ffcc..b73e215afab 100644
--- a/src/main/java/hirehive/address/logic/Messages.java
+++ b/src/main/java/hirehive/address/logic/Messages.java
@@ -20,6 +20,7 @@ public class Messages {
     public static final String MESSAGE_PERSONS_LISTED_OVERVIEW = "%1$d persons listed!";
     public static final String MESSAGE_DUPLICATE_FIELDS =
                 "Multiple values specified for the following single-valued field(s): ";
+    public static final String MESSAGE_NO_SUCH_PERSON = "No such person exists";
 
     /**
      * Returns an error message indicating the duplicate prefixes.
diff --git a/src/main/java/hirehive/address/logic/commands/EditCommand.java b/src/main/java/hirehive/address/logic/commands/EditCommand.java
index b12ee958877..92ff6e7251a 100644
--- a/src/main/java/hirehive/address/logic/commands/EditCommand.java
+++ b/src/main/java/hirehive/address/logic/commands/EditCommand.java
@@ -94,7 +94,7 @@ public CommandResult execute(Model model) throws CommandException {
      * Creates and returns a {@code Person} with the details of {@code personToEdit}
      * edited with {@code editPersonDescriptor}.
      */
-    private static Person createEditedPerson(Person personToEdit, EditPersonDescriptor editPersonDescriptor) {
+    protected static Person createEditedPerson(Person personToEdit, EditPersonDescriptor editPersonDescriptor) {
         assert personToEdit != null;
 
         Name updatedName = editPersonDescriptor.getName().orElse(personToEdit.getName());
diff --git a/src/main/java/hirehive/address/logic/commands/TagCommand.java b/src/main/java/hirehive/address/logic/commands/TagCommand.java
index f21c83d15b4..ef0419b4463 100644
--- a/src/main/java/hirehive/address/logic/commands/TagCommand.java
+++ b/src/main/java/hirehive/address/logic/commands/TagCommand.java
@@ -1,25 +1,65 @@
 package hirehive.address.logic.commands;
 
-import hirehive.address.commons.core.index.Index;
-import hirehive.address.logic.parser.CliSyntax;
+import static hirehive.address.logic.commands.EditCommand.createEditedPerson;
+import static hirehive.address.logic.parser.CliSyntax.PREFIX_NAME;
+import static hirehive.address.logic.parser.CliSyntax.PREFIX_TAG;
+import static hirehive.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;
+import static java.util.Objects.requireNonNull;
+
+import hirehive.address.logic.Messages;
+import hirehive.address.logic.commands.EditCommand.EditPersonDescriptor;
+import hirehive.address.logic.commands.exceptions.CommandException;
+import hirehive.address.logic.commands.queries.NameQuery;
+import hirehive.address.logic.commands.queries.exceptions.QueryException;
+import hirehive.address.model.Model;
+import hirehive.address.model.person.Person;
 
 /**
- * Deletes a person identified using it's displayed index from the address book.
+ * Tags a person identified using their name.
  */
-public class TagCommand extends EditCommand {
+public class TagCommand extends Command {
 
     public static final String COMMAND_WORD = "tag";
 
     public static final String MESSAGE_USAGE = COMMAND_WORD
             + ": Tags the person identified by the index number used in the displayed person list.\n"
-            + "Parameters: INDEX (must be a positive integer) "
-            + CliSyntax.PREFIX_TAG + "TAG"
-            + "Example: " + COMMAND_WORD + " 1 " + CliSyntax.PREFIX_TAG + "example";
+            + "Parameters: " + PREFIX_NAME + "NAME "
+            + PREFIX_TAG + "TAG...\n"
+            + "Example: " + COMMAND_WORD + " " + PREFIX_NAME + "John " + PREFIX_TAG + "example";
 
     public static final String MESSAGE_TAG_PERSON_SUCCESS = "Tagged Person: %1$s";
 
-    public TagCommand(Index index, EditPersonDescriptor editPersonDescriptor) {
-        super(index, editPersonDescriptor);
+    private final NameQuery query;
+    private final EditPersonDescriptor editPersonDescriptor;
+
+    /**
+     * @param query to query for the specific person by name
+     * @param editPersonDescriptor details to tag the person with
+     */
+    public TagCommand(NameQuery query, EditCommand.EditPersonDescriptor editPersonDescriptor) {
+        requireNonNull(query);
+        requireNonNull(editPersonDescriptor);
+
+        this.query = query;
+        this.editPersonDescriptor = editPersonDescriptor;
+    }
+
+    @Override
+    public CommandResult execute(Model model) throws CommandException {
+        requireNonNull(model);
+
+        Person personToTag;
+        try {
+            personToTag = query.query(model);
+        } catch (QueryException qe) {
+            throw new CommandException(qe.getMessage());
+        }
+
+        Person taggedPerson = createEditedPerson(personToTag, editPersonDescriptor);
+
+        model.setPerson(personToTag, taggedPerson);
+        model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);
+        return new CommandResult(String.format(MESSAGE_TAG_PERSON_SUCCESS, Messages.format(taggedPerson)));
     }
 
     @Override
@@ -34,7 +74,7 @@ public boolean equals(Object other) {
         }
 
         TagCommand otherTagCommand = (TagCommand) other;
-        return getIndex().equals(otherTagCommand.getIndex())
-                && getEditPersonDescriptor().equals(otherTagCommand.getEditPersonDescriptor());
+        return query.equals(otherTagCommand.query)
+                && editPersonDescriptor.equals(otherTagCommand.editPersonDescriptor);
     }
 }
diff --git a/src/main/java/hirehive/address/logic/commands/queries/NameQuery.java b/src/main/java/hirehive/address/logic/commands/queries/NameQuery.java
new file mode 100644
index 00000000000..0aadc68316a
--- /dev/null
+++ b/src/main/java/hirehive/address/logic/commands/queries/NameQuery.java
@@ -0,0 +1,32 @@
+package hirehive.address.logic.commands.queries;
+
+import static hirehive.address.logic.Messages.MESSAGE_NO_SUCH_PERSON;
+
+import java.util.List;
+import java.util.function.Predicate;
+
+import hirehive.address.logic.commands.queries.exceptions.QueryException;
+import hirehive.address.model.Model;
+import hirehive.address.model.person.Person;
+
+/**
+ * Queries for a person by a given name.
+ */
+public class NameQuery extends Query<Person> {
+    /**
+     * @param predicate to query a model with to get a person
+     */
+    public NameQuery(Predicate<Person> predicate) {
+        super(predicate);
+    }
+
+    @Override
+    public Person query(Model model) throws QueryException {
+        model.updateFilteredPersonList(this.predicate);
+        List<Person> filteredList = model.getFilteredPersonList();
+        if (filteredList.isEmpty()) {
+            throw new QueryException(MESSAGE_NO_SUCH_PERSON);
+        }
+        return filteredList.get(0);
+    }
+}
diff --git a/src/main/java/hirehive/address/logic/commands/queries/Query.java b/src/main/java/hirehive/address/logic/commands/queries/Query.java
new file mode 100644
index 00000000000..25bc560fcbf
--- /dev/null
+++ b/src/main/java/hirehive/address/logic/commands/queries/Query.java
@@ -0,0 +1,29 @@
+package hirehive.address.logic.commands.queries;
+
+import java.util.function.Predicate;
+
+import hirehive.address.logic.commands.queries.exceptions.QueryException;
+import hirehive.address.model.Model;
+
+/**
+ * Represents a query with hidden predicate to query with
+ */
+public abstract class Query<T> {
+    protected final Predicate<T> predicate;
+
+    /**
+     * @param predicate to query a model with to get a result
+     */
+    public Query(Predicate<T> predicate) {
+        this.predicate = predicate;
+    }
+
+    /**
+     * Queries the model with specified predicate and returns a specific object instance based
+     *
+     * @param model {@code Model} which the query should operate on.
+     * @return queried result from using the predicate
+     * @throws QueryException If an error occurs during query.
+     */
+    public abstract T query(Model model) throws QueryException;
+}
diff --git a/src/main/java/hirehive/address/logic/commands/queries/exceptions/QueryException.java b/src/main/java/hirehive/address/logic/commands/queries/exceptions/QueryException.java
new file mode 100644
index 00000000000..08eff964c9e
--- /dev/null
+++ b/src/main/java/hirehive/address/logic/commands/queries/exceptions/QueryException.java
@@ -0,0 +1,14 @@
+package hirehive.address.logic.commands.queries.exceptions;
+
+/**
+ * Represents an error encountered by from a query.
+ */
+public class QueryException extends Exception {
+    public QueryException(String message) {
+        super(message);
+    }
+
+    public QueryException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}
diff --git a/src/main/java/hirehive/address/logic/parser/TagCommandParser.java b/src/main/java/hirehive/address/logic/parser/TagCommandParser.java
index e13741ecbdb..f839a1586ba 100644
--- a/src/main/java/hirehive/address/logic/parser/TagCommandParser.java
+++ b/src/main/java/hirehive/address/logic/parser/TagCommandParser.java
@@ -1,17 +1,21 @@
 package hirehive.address.logic.parser;
 
+import static hirehive.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
+import static hirehive.address.logic.parser.CliSyntax.PREFIX_NAME;
+import static hirehive.address.logic.parser.CliSyntax.PREFIX_TAG;
 import static java.util.Objects.requireNonNull;
 
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Optional;
 import java.util.Set;
 
-import hirehive.address.commons.core.index.Index;
-import hirehive.address.logic.Messages;
-import hirehive.address.logic.commands.EditCommand;
+import hirehive.address.logic.commands.EditCommand.EditPersonDescriptor;
 import hirehive.address.logic.commands.TagCommand;
+import hirehive.address.logic.commands.queries.NameQuery;
 import hirehive.address.logic.parser.exceptions.ParseException;
+import hirehive.address.model.person.NameContainsKeywordsPredicate;
 import hirehive.address.model.tag.Tag;
 
 /**
@@ -28,25 +32,21 @@ public TagCommand parse(String args) throws ParseException {
         requireNonNull(args);
         ArgumentMultimap argMultimap =
                 ArgumentTokenizer.tokenize(
-                        args, CliSyntax.PREFIX_TAG);
-        Index index;
+                        args, PREFIX_NAME, PREFIX_TAG);
 
-        try {
-            index = ParserUtil.parseIndex(argMultimap.getPreamble());
-        } catch (ParseException pe) {
-            throw new ParseException(String.format(Messages.MESSAGE_INVALID_COMMAND_FORMAT,
-                    TagCommand.MESSAGE_USAGE), pe);
+        if (argMultimap.getValue(PREFIX_NAME).isEmpty()) {
+            throw new ParseException(
+                    String.format(MESSAGE_INVALID_COMMAND_FORMAT, TagCommand.MESSAGE_USAGE));
         }
 
-        EditCommand.EditPersonDescriptor editPersonDescriptor = new EditCommand.EditPersonDescriptor();
+        String[] nameKeywords = argMultimap.getValue(PREFIX_NAME).get().split("\\s+");
+        NameQuery nameQuery = new NameQuery(new NameContainsKeywordsPredicate(Arrays.asList(nameKeywords)));
 
-        parseTagsForEdit(argMultimap.getAllValues(CliSyntax.PREFIX_TAG)).ifPresent(editPersonDescriptor::setTags);
+        EditPersonDescriptor editPersonDescriptor = new EditPersonDescriptor();
 
-        if (!editPersonDescriptor.isAnyFieldEdited()) {
-            throw new ParseException(TagCommand.MESSAGE_NOT_EDITED);
-        }
+        parseTagsForEdit(argMultimap.getAllValues(PREFIX_TAG)).ifPresent(editPersonDescriptor::setTags);
 
-        return new TagCommand(index, editPersonDescriptor);
+        return new TagCommand(nameQuery, editPersonDescriptor);
     }
 
     /**


Reviews:
user: login: deannapoh
body: Other than the need to add tests, everything looks good! Good job :)
state: APPROVED
author_association: NONE
submitted_at: 2025-03-18T16:45:52Z

Review comments:
diff_hunk: @@ -0,0 +1,29 @@
+package hirehive.address.logic.commands.queries;
+
+import java.util.function.Predicate;
+
+import hirehive.address.logic.commands.queries.exceptions.QueryException;
+import hirehive.address.model.Model;
+
+/**
+ * Represents a query with hidden predicate to query with
+ */
+public abstract class Query<T> {
path: src/main/java/hirehive/address/logic/commands/queries/Query.java
user: login: deannapoh
body: I like how you folowed OOP principles and created a new class!
created_at: 2025-03-18T16:42:12Z
author_association: NONE
diff_hunk: @@ -0,0 +1,14 @@
+package hirehive.address.logic.commands.queries.exceptions;
+
+/**
+ * Represents an error encountered by from a query.
+ */
+public class QueryException extends Exception {
path: src/main/java/hirehive/address/logic/commands/queries/exceptions/QueryException.java
user: login: deannapoh
body: I like how you also created a new type of of exception!
created_at: 2025-03-18T16:42:56Z
author_association: NONE
diff_hunk: @@ -0,0 +1,32 @@
+package hirehive.address.logic.commands.queries;
+
+import static hirehive.address.logic.Messages.MESSAGE_NO_SUCH_PERSON;
+
+import java.util.List;
+import java.util.function.Predicate;
+
+import hirehive.address.logic.commands.queries.exceptions.QueryException;
+import hirehive.address.model.Model;
+import hirehive.address.model.person.Person;
+
+/**
+ * Queries for a person by a given name.
+ */
+public class NameQuery extends Query<Person> {
+    /**
+     * @param predicate to query a model with to get a person
+     */
+    public NameQuery(Predicate<Person> predicate) {
+        super(predicate);
+    }
+
+    @Override
+    public Person query(Model model) throws QueryException {
path: src/main/java/hirehive/address/logic/commands/queries/NameQuery.java
user: login: deannapoh
body: Other than the need to add tests for this class, everything looks great :)
created_at: 2025-03-18T16:45:10Z
author_association: NONE

PR comments:
user: login: codecov[bot]
created_at: 2025-03-18T15:49:24Z
body: ## [Codecov](https://app.codecov.io/gh/AY2425S2-CS2103T-F13-3/tp/pull/55?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-F13-3) Report
Attention: Patch coverage is `0%` with `39 lines` in your changes missing coverage. Please review.

| [Files with missing lines](https://app.codecov.io/gh/AY2425S2-CS2103T-F13-3/tp/pull/55?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-F13-3) | Patch % | Lines |
|---|---|---|
| [...va/hirehive/address/logic/commands/TagCommand.java](https://app.codecov.io/gh/AY2425S2-CS2103T-F13-3/tp/pull/55?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Fhirehive%2Faddress%2Flogic%2Fcommands%2FTagCommand.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-F13-3#diff-c3JjL21haW4vamF2YS9oaXJlaGl2ZS9hZGRyZXNzL2xvZ2ljL2NvbW1hbmRzL1RhZ0NvbW1hbmQuamF2YQ==) | 0.00% | [17 Missing :warning: ](https://app.codecov.io/gh/AY2425S2-CS2103T-F13-3/tp/pull/55?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-F13-3) |
| [...irehive/address/logic/parser/TagCommandParser.java](https://app.codecov.io/gh/AY2425S2-CS2103T-F13-3/tp/pull/55?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Fhirehive%2Faddress%2Flogic%2Fparser%2FTagCommandParser.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-F13-3#diff-c3JjL21haW4vamF2YS9oaXJlaGl2ZS9hZGRyZXNzL2xvZ2ljL3BhcnNlci9UYWdDb21tYW5kUGFyc2VyLmphdmE=) | 0.00% | [8 Missing :warning: ](https://app.codecov.io/gh/AY2425S2-CS2103T-F13-3/tp/pull/55?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-F13-3) |
| [...hive/address/logic/commands/queries/NameQuery.java](https://app.codecov.io/gh/AY2425S2-CS2103T-F13-3/tp/pull/55?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Fhirehive%2Faddress%2Flogic%2Fcommands%2Fqueries%2FNameQuery.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-F13-3#diff-c3JjL21haW4vamF2YS9oaXJlaGl2ZS9hZGRyZXNzL2xvZ2ljL2NvbW1hbmRzL3F1ZXJpZXMvTmFtZVF1ZXJ5LmphdmE=) | 0.00% | [7 Missing :warning: ](https://app.codecov.io/gh/AY2425S2-CS2103T-F13-3/tp/pull/55?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-F13-3) |
| [...ic/commands/queries/exceptions/QueryException.java](https://app.codecov.io/gh/AY2425S2-CS2103T-F13-3/tp/pull/55?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Fhirehive%2Faddress%2Flogic%2Fcommands%2Fqueries%2Fexceptions%2FQueryException.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-F13-3#diff-c3JjL21haW4vamF2YS9oaXJlaGl2ZS9hZGRyZXNzL2xvZ2ljL2NvbW1hbmRzL3F1ZXJpZXMvZXhjZXB0aW9ucy9RdWVyeUV4Y2VwdGlvbi5qYXZh) | 0.00% | [4 Missing :warning: ](https://app.codecov.io/gh/AY2425S2-CS2103T-F13-3/tp/pull/55?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-F13-3) |
| [...hirehive/address/logic/commands/queries/Query.java](https://app.codecov.io/gh/AY2425S2-CS2103T-F13-3/tp/pull/55?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Fhirehive%2Faddress%2Flogic%2Fcommands%2Fqueries%2FQuery.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-F13-3#diff-c3JjL21haW4vamF2YS9oaXJlaGl2ZS9hZGRyZXNzL2xvZ2ljL2NvbW1hbmRzL3F1ZXJpZXMvUXVlcnkuamF2YQ==) | 0.00% | [3 Missing :warning: ](https://app.codecov.io/gh/AY2425S2-CS2103T-F13-3/tp/pull/55?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-F13-3) |

| [Files with missing lines](https://app.codecov.io/gh/AY2425S2-CS2103T-F13-3/tp/pull/55?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-F13-3) | Coverage Δ | Complexity Δ | |
|---|---|---|---|
| [src/main/java/hirehive/address/logic/Messages.java](https://app.codecov.io/gh/AY2425S2-CS2103T-F13-3/tp/pull/55?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Fhirehive%2Faddress%2Flogic%2FMessages.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-F13-3#diff-c3JjL21haW4vamF2YS9oaXJlaGl2ZS9hZGRyZXNzL2xvZ2ljL01lc3NhZ2VzLmphdmE=) | `88.88% <ø> (ø)` | `3.00 <0.00> (ø)` | |
| [...a/hirehive/address/logic/commands/EditCommand.java](https://app.codecov.io/gh/AY2425S2-CS2103T-F13-3/tp/pull/55?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Fhirehive%2Faddress%2Flogic%2Fcommands%2FEditCommand.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-F13-3#diff-c3JjL21haW4vamF2YS9oaXJlaGl2ZS9hZGRyZXNzL2xvZ2ljL2NvbW1hbmRzL0VkaXRDb21tYW5kLmphdmE=) | `95.34% <ø> (ø)` | `13.00 <0.00> (ø)` | |
| [...hirehive/address/logic/commands/queries/Query.java](https://app.codecov.io/gh/AY2425S2-CS2103T-F13-3/tp/pull/55?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Fhirehive%2Faddress%2Flogic%2Fcommands%2Fqueries%2FQuery.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-F13-3#diff-c3JjL21haW4vamF2YS9oaXJlaGl2ZS9hZGRyZXNzL2xvZ2ljL2NvbW1hbmRzL3F1ZXJpZXMvUXVlcnkuamF2YQ==) | `0.00% <0.00%> (ø)` | `0.00 <0.00> (?)` | |
| [...ic/commands/queries/exceptions/QueryException.java](https://app.codecov.io/gh/AY2425S2-CS2103T-F13-3/tp/pull/55?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Fhirehive%2Faddress%2Flogic%2Fcommands%2Fqueries%2Fexceptions%2FQueryException.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-F13-3#diff-c3JjL21haW4vamF2YS9oaXJlaGl2ZS9hZGRyZXNzL2xvZ2ljL2NvbW1hbmRzL3F1ZXJpZXMvZXhjZXB0aW9ucy9RdWVyeUV4Y2VwdGlvbi5qYXZh) | `0.00% <0.00%> (ø)` | `0.00 <0.00> (?)` | |
| [...hive/address/logic/commands/queries/NameQuery.java](https://app.codecov.io/gh/AY2425S2-CS2103T-F13-3/tp/pull/55?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Fhirehive%2Faddress%2Flogic%2Fcommands%2Fqueries%2FNameQuery.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-F13-3#diff-c3JjL21haW4vamF2YS9oaXJlaGl2ZS9hZGRyZXNzL2xvZ2ljL2NvbW1hbmRzL3F1ZXJpZXMvTmFtZVF1ZXJ5LmphdmE=) | `0.00% <0.00%> (ø)` | `0.00 <0.00> (?)` | |
| [...irehive/address/logic/parser/TagCommandParser.java](https://app.codecov.io/gh/AY2425S2-CS2103T-F13-3/tp/pull/55?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Fhirehive%2Faddress%2Flogic%2Fparser%2FTagCommandParser.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-F13-3#diff-c3JjL21haW4vamF2YS9oaXJlaGl2ZS9hZGRyZXNzL2xvZ2ljL3BhcnNlci9UYWdDb21tYW5kUGFyc2VyLmphdmE=) | `0.00% <0.00%> (ø)` | `0.00 <0.00> (ø)` | |
| [...va/hirehive/address/logic/commands/TagCommand.java](https://app.codecov.io/gh/AY2425S2-CS2103T-F13-3/tp/pull/55?src=pr&el=tree&filepath=src%2Fmain%2Fjava%2Fhirehive%2Faddress%2Flogic%2Fcommands%2FTagCommand.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=AY2425S2-CS2103T-F13-3#diff-c3JjL21haW4vamF2YS9oaXJlaGl2ZS9hZGRyZXNzL2xvZ2ljL2NvbW1hbmRzL1RhZ0NvbW1hbmQuamF2YQ==) | `0.00% <0.00%> (ø)` | `0.00 <0.00> (ø)` | |

<details><summary>🚀 New features to boost your workflow: </summary>

- ❄ [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
</details>
author_association: NONE
user: login: zeotheburrito
created_at: 2025-03-20T05:02:17Z
body: Will add test cases in a future increment
author_association: NONE