diff --git a/src/main/java/com/mykola2312/retracker/bencode/BDict.java b/src/main/java/com/mykola2312/retracker/bencode/BDict.java index a066ac7..a0b9a09 100644 --- a/src/main/java/com/mykola2312/retracker/bencode/BDict.java +++ b/src/main/java/com/mykola2312/retracker/bencode/BDict.java @@ -41,13 +41,12 @@ public class BDict extends BList { } @SuppressWarnings("unchecked") - public T get(String key) throws BValueError { - T value = (T)get(new BString(key)); - System.out.println("sedsed " + value.getClass().getName()); - if (!(value instanceof T)) { - throw new BErrorValueCast(this, key, value.getClass()); + public T get(BType type, String key) throws BValueError { + BValue value = get(new BString(key)); + if (!value.getType().equals(type)) { + throw new BErrorValueCast(this, key, type, value.getType()); } - return value; + return (T)value; } } diff --git a/src/main/java/com/mykola2312/retracker/bencode/error/BErrorValueCast.java b/src/main/java/com/mykola2312/retracker/bencode/error/BErrorValueCast.java index d8974df..4a9e6a9 100644 --- a/src/main/java/com/mykola2312/retracker/bencode/error/BErrorValueCast.java +++ b/src/main/java/com/mykola2312/retracker/bencode/error/BErrorValueCast.java @@ -1,11 +1,12 @@ package com.mykola2312.retracker.bencode.error; +import com.mykola2312.retracker.bencode.BType; import com.mykola2312.retracker.bencode.BValue; public class BErrorValueCast extends BValueError { private static final long serialVersionUID = 6790204193944478194L; - public BErrorValueCast(BValue node, String key, Class cause) { - super(node, String.format("cast error: %s is instance of %s", key, cause.getName())); + public BErrorValueCast(BValue node, String key, BType wanted, BType found) { + super(node, String.format("cast error: %s is type %s instead of %s", key, found, wanted)); } } diff --git a/src/test/java/com/mykola2312/retracker/bencode/BDictTest.java b/src/test/java/com/mykola2312/retracker/bencode/BDictTest.java index fff8899..03a5b44 100644 --- a/src/test/java/com/mykola2312/retracker/bencode/BDictTest.java +++ b/src/test/java/com/mykola2312/retracker/bencode/BDictTest.java @@ -4,6 +4,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import org.junit.jupiter.api.Test; @@ -52,7 +53,23 @@ public class BDictTest { dict.set("key", new BInteger(4)); assertThrows(BErrorValueCast.class, () -> { - dict.get("key").get(); + dict.get(BType.STRING, "key"); + }); + } + + @Test + public void testGetChained() { + BDict dict = new BDict() + .set("first", new BDict() + .set("second", new BInteger(3))); + + assertDoesNotThrow(() -> { + BInteger value = dict + .get(BType.DICT, "first") + .get(BType.INTEGER, "second"); + + assertNotNull(value); + assertEquals(value, new BInteger(3)); }); } }