commit ec80110e96256bba2142d4ca21f36e789d658160 Author: shahondin1624 Date: Sat Feb 7 08:58:33 2026 +0100 Add result helper type diff --git a/src/main/java/mcp/util/Err.java b/src/main/java/mcp/util/Err.java new file mode 100644 index 0000000..5714eb3 --- /dev/null +++ b/src/main/java/mcp/util/Err.java @@ -0,0 +1,4 @@ +package mcp.util; + +public record Err(T throwable) implements Result { +} diff --git a/src/main/java/mcp/util/Ok.java b/src/main/java/mcp/util/Ok.java new file mode 100644 index 0000000..90951e4 --- /dev/null +++ b/src/main/java/mcp/util/Ok.java @@ -0,0 +1,4 @@ +package mcp.util; + +public record Ok(E value) implements Result { +} diff --git a/src/main/java/mcp/util/Result.java b/src/main/java/mcp/util/Result.java new file mode 100644 index 0000000..e2d4f2d --- /dev/null +++ b/src/main/java/mcp/util/Result.java @@ -0,0 +1,61 @@ +package mcp.util; + +import java.util.Optional; + +public sealed interface Result permits Err, Ok { + + default boolean isError() { + return this instanceof Err; + } + + default boolean isOk() { + return this instanceof Ok; + } + + default E unwrap() throws T { + return switch (this) { + case Err err -> throw err.throwable(); + case Ok ok -> ok.value(); + }; + } + + default E unwrapOrElse(E defaultValue) { + try { + return isError() ? defaultValue : unwrap(); + } catch (Throwable e) { + return defaultValue; + } + } + + default Optional toOptional() { + try { + return isError() ? Optional.empty() : Optional.of(unwrap()); + } catch (Throwable e) { + return Optional.empty(); + } + } + + @SuppressWarnings("unchecked") + default Result map(java.util.function.Function mapper) { + return switch (this) { + case Ok ok -> new Ok<>(mapper.apply(ok.value())); + case Err err -> (Err) err; + }; + } + + @SuppressWarnings("unchecked") + default Result flatMap(java.util.function.Function> mapper) { + return switch (this) { + case Ok ok -> mapper.apply(ok.value()); + case Err err -> (Err) err; + }; + } + + @SuppressWarnings("unchecked") + default Result mapError(java.util.function.Function mapper) { + return switch (this) { + case Ok ok -> (Ok) ok; + case Err err -> new Err<>(mapper.apply(err.throwable())); + }; + } +}