Support for hierarchical structures.
Support for hierarchical structures.
diff --git a/Network/YAML/Base.hs b/Network/YAML/Base.hs
index 847ff41..3c82805 100644
--- a/Network/YAML/Base.hs
+++ b/Network/YAML/Base.hs
@@ -37,11 +37,11 @@ getSubKey key subkey obj = do
r <- getAttr subkey attr
getScalar r
-getItem :: (IsYamlScalar a) => BS.ByteString -> Int -> YamlObject -> Maybe a
+getItem :: BS.ByteString -> Int -> YamlObject -> YamlObject
getItem key k obj =
case getListAttr key obj of
- [] -> Nothing
- lst -> getScalar (lst !! k)
+ [] -> Sequence []
+ lst -> lst !! k
getListAttr :: BS.ByteString -> YamlObject -> [YamlObject]
getListAttr key obj =
diff --git a/Network/YAML/Derive.hs b/Network/YAML/Derive.hs
index a68bb9e..44dfbda 100644
--- a/Network/YAML/Derive.hs
+++ b/Network/YAML/Derive.hs
@@ -75,7 +75,7 @@ fromClause (NormalC name fields) = do
body = foldl appE (conE $ mkName cName) $ map (getAttr' cName obj) $ map fst (zip [0..] names)
clause [varP obj] (guardedB [normalGE guard body]) []
where
- getAttr' c obj k = [| fromMaybe def $ getItem (BS.pack c) k $(varE obj) |]
+ getAttr' c obj k = [| cs $ getItem (BS.pack c) k $(varE obj) |]
getName (n,x) = (n, getNameBase x)
diff --git a/TestDerive.hs b/TestDerive.hs
index e61d108..08578f2 100644
--- a/TestDerive.hs
+++ b/TestDerive.hs
@@ -12,6 +12,7 @@ import Network.YAML.Derive
data Test = Test {getX :: Int, getY :: Int}
| Another {getA :: Double}
| Third Int Double
+ | Fourth Double Test
deriving(Show)
$(deriveDefault ''Test)
@@ -21,6 +22,7 @@ $(deriveIsYamlObject ''Test)
t1 = Test 3 5
t2 = Another 7.5
t3 = Third 2 1.5
+t4 = Fourth 1.7 t1
test :: Test -> IO ()
test t = do
@@ -32,4 +34,5 @@ main = do
test t1
test t2
test t3
+ test t4