aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/io/trygvis/esper/testing/sql/SqlOption.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/io/trygvis/esper/testing/sql/SqlOption.java')
-rw-r--r--src/main/java/io/trygvis/esper/testing/sql/SqlOption.java83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/main/java/io/trygvis/esper/testing/sql/SqlOption.java b/src/main/java/io/trygvis/esper/testing/sql/SqlOption.java
new file mode 100644
index 0000000..058435e
--- /dev/null
+++ b/src/main/java/io/trygvis/esper/testing/sql/SqlOption.java
@@ -0,0 +1,83 @@
+package io.trygvis.esper.testing.sql;
+
+import java.sql.*;
+
+public abstract class SqlOption<A> {
+ public static <A> SqlOption<A> none() {
+ return new None<>();
+ }
+
+ public static <A> SqlOption<A> some(A a) {
+ return new Some<>(a);
+ }
+
+ public static SqlOption<ResultSet> fromRs(ResultSet rs) throws SQLException {
+ if (!rs.next()) {
+ return none();
+ }
+
+ return some(rs);
+ }
+
+ // -----------------------------------------------------------------------
+ //
+ // -----------------------------------------------------------------------
+
+ public abstract <B> SqlOption<B> map(SqlF<A, B> f) throws SQLException;
+
+ public <B> SqlOption<B> flatMap(SqlF<A, SqlOption<B>> f) throws SQLException {
+ SqlOption<SqlOption<B>> x = map(f);
+
+ if (x.isNone()) {
+ return none();
+ }
+
+ return x.get();
+ }
+
+ public abstract A get() throws SQLException;
+
+ public abstract boolean isSome();
+
+ public boolean isNone() {
+ return !isSome();
+ }
+
+ // -----------------------------------------------------------------------
+ //
+ // -----------------------------------------------------------------------
+
+ private static class None<A> extends SqlOption<A> {
+ public <B> SqlOption<B> map(SqlF<A, B> f) {
+ return none();
+ }
+
+ public A get() throws SQLException {
+ throw new SQLException("get() on None");
+ }
+
+ public boolean isSome() {
+ return false;
+ }
+ }
+
+ private static class Some<A> extends SqlOption<A> {
+ private final A a;
+
+ private Some(A a) {
+ this.a = a;
+ }
+
+ public <B> SqlOption<B> map(SqlF<A, B> f) throws SQLException {
+ return some(f.apply(a));
+ }
+
+ public A get() {
+ return a;
+ }
+
+ public boolean isSome() {
+ return true;
+ }
+ }
+}